Rails 手把手将 Vim 打造成开发 Ruby 和 Rails 的强大 IDE

zgs225 · 发布于 2015年4月24日 · 最后由 zgs225 回复于 2016年3月03日 · 8663 次阅读
96
本帖已被设为精华帖!

本文原文是我发表在自己的博客上。

Vim和Emacs一个称为神之编辑器一个被称为编辑器之神,固然很是夸张,但也足以说明这两款软件的优秀和在程序员界的地位。但是它们都已漫长的学习曲线让人望而生畏,阻止了大多数人进入。作为一名几乎完全使用Vim写各种代码、文档的人,我想把我自己平时使用的插件和配置整理下来,方便自己的总结和归纳,如果能有幸帮助到一些想学习Vim但是又不知道如何入门的人来说,那就再荣幸不过了。

在下面的内容中,我会介绍我使用的插件、Vim的配置,最后如果你觉得这些配置手动太麻烦的话,我推荐你看我的另一篇文章(从零搭建和配置OSX开发环境),在那篇文章的末尾,我给出了一个自动化配置和管理Vim的方法

先贴一张我的Vim的截图:

vim as ide

你看的到的插件

从上面那种截图中肉眼能看到的插件说起,把整个界面按照左窗口、主窗口、右窗口和下窗口命名,依次介绍出现在这个窗口中的主要插件。

主窗口

作为一款主要用于书写代码的文本编辑器,一个足够舒服、靓丽的配色当然是首要考虑的。我使用的配色主题是molokai官方地址),在 你安装好了这个插件之后,你需要下面几行配置应用它:

" Switch syntax highlighting on, when the terminal has colors
if (t_Co > 2 || has("gui_running")) && !exists("syntax_on")
  syntax on
endif

" Javascript syntax hightlight
syntax enable

" Set syntax highlighting for specific file types
autocmd BufRead,BufNewFile Appraisals set filetype=ruby
autocmd BufRead,BufNewFile *.md set filetype=markdown
autocmd Syntax javascript set syntax=jquery

" Color scheme
colorscheme molokai
highlight NonText guibg=#060606
highlight Folded  guibg=#0A0A0A guifg=#9090D0

另外一个推荐的vim主题是solarized(官方地址)。

在选定了一个适合自己的主题之后,就需要一些配置去解决排版的问题,比如字符编码和缩进等问题。

" Backspace deletes like most programs in insert mode
set backspace=2
" Show the cursor position all the time
set ruler
" Display incomplete commands
set showcmd
" Set fileencodings
set fileencodings=utf-8,bg18030,gbk,big5

filetype plugin indent on

" Softtabs, 2 spaces
set tabstop=2
set shiftwidth=2
set shiftround
set expandtab

" Display extra whitespace
set list listchars=tab:»·,trail:·

" Make it obvious where 80 characters is
set textwidth=80
set colorcolumn=+1

" Numbers
set number
set numberwidth=5

set matchpairs+=<:>
set hlsearch

在第68行,水平和垂直方向分别有一条高亮条,这是用来表示我当 前光标所处于的行和列用的。实现它,只需要几行简单的配置就可以了:

" Highlight current line
au WinLeave * set nocursorline nocursorcolumn
au WinEnter * set cursorline cursorcolumn
set cursorline cursorcolumn
关于代码补全

有些人可能已经发现了,在我的主窗口中没有演示代码补全的功能,我需要对此做一个说明。我本人不喜欢过于强大的代码补全,所以默认的对于我来说已经完全足够了,如果你需要使用更强大的代码补全,我推荐你使用YouCompleteMe官方地址)。

YouCompleteMe

左窗口

左窗口是一个用于浏览目录结构的插件nerdtree官方地址)。同样一些简单的配置之后,它便能为你提供一个方便够用的功能。

" NERD tree
let NERDChristmasTree=0
let NERDTreeWinSize=35
let NERDTreeChDirMode=2
let NERDTreeIgnore=['\~$', '\.pyc$', '\.swp$']
let NERDTreeShowBookmarks=1
let NERDTreeWinPos="left"
" Automatically open a NERDTree if no files where specified
autocmd vimenter * if !argc() | NERDTree | endif
" Close vim if the only window left open is a NERDTree
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif
" Open a NERDTree
nmap <F5> :NERDTreeToggle<cr>

右窗口

在我的截图中,右窗口陈列出了我当前打开的rb文件中申明的类、变量及方法等等。这是一款名叫tagbar的插件,它为我们提供了一个简单的方式去浏览当前文件的结构,并且支持在各个标签之间快捷的跳转。同理,安装之后,需要一些配置:

" Tagbar
let g:tagbar_width=35
let g:tagbar_autofocus=1
nmap <F6> :TagbarToggle<CR>

如果你发现默认的Tagbar不能支持你的语言,比如Css, Clojure, Markdown等等,你可以参照这篇文章为它提供额外的支持。

下窗口

下窗口包含了两个部分:一个是用于全局搜索的窗口和一个状态条。

全局搜索是一个基于文件名的搜索功能,可以快速定位一个文件。这是ctrlp这个插件提供的功能。下面是ctrlp的一些配置:

" ctrap
set wildignore+=*/tmp/*,*.so,*.swp,*.zip,*.png,*.jpg,*.jpeg,*.gif " MacOSX/Linux
let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$'

ctrlp默认会使用grep进行搜索,效率低且慢。所以,我使用了ag去替换默认的搜索功能。ag是一款轻量级的搜索工具,速度非常快。为了集成ag,需要添加下列配置:

if executable('ag')
  " Use Ag over Grep
  set grepprg=ag\ --nogroup\ --nocolor
  " Use ag in CtrlP for listing files.
  let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""'
  " Ag is fast enough that CtrlP doesn't need to cache
  let g:ctrlp_use_caching = 0
endif

下面状态条中会依次显示:当前模式、Git分支、文件路径、文件是否保存以及当前所载行和列的信息。这是通过vim-powerline来实现的。其中显示Git信息需要配合vim-fugitive 插件一些使用。

set laststatus=2 " Always display the status line
set statusline+=%{fugitive#statusline()} "  Git Hotness

小结

通过以上的配置,你就可以拥有一些如第一张图所示的那样,看起来还不错的编辑器。当然,Vim之所以如此倍受推崇,只是依靠这些还是远远不够的。接下来,我要介绍一些看不见的插件来实实在在的提升Vim体验。

看不见的实用插件

现代化的插件管理

在我的另一篇文章中(从零搭建和配置OSX开发环境),我已经详细介绍过Vundle这个管理Vim插件的一个软件,这里不做过多介绍。

在Vim中执行你想要运行的命令

vim-run-interactive让你可以在Vim中执行几乎任何你想要在命令行中执行的命令。举例来说,假设你有条git update的自定义命令,你可以通过:RunInInteractiveShell git update来执行它,而不需要退出Vim。添加一条配置,可以简化这个步骤:

" Run commands that require an interactive shell
nnoremap <Leader>r :RunInInteractiveShell<space>

如此一来,你可以通过<Leader> + r + 命令键来激活执行命令。如果你不知道什么是Leader键,你可以去百度或者Google一下。

Vim的语法检查

Vim中有个很强大的语法检查插件,它支持几乎所有常用的语言的语法检测syntastic

附上一张来自官方的截图:

syntastic

为了让它更好的工作,同样需要一些配置:

" configure syntastic syntax checking to check on open as well as save
let g:syntastic_check_on_open=1
let g:syntastic_html_tidy_ignore_errors=[" proprietary attribute \"ng-"]
let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_wq = 0
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

Rails集成开发套件

我是一名Ruby的爱好者,所以Vim中少不了针对Ruby的一系列插件。我作为一名Web开发者,Rails这个大名鼎鼎的框架自然也是有所涉猎。所以在我的Vim中有着针对它们开发的一套插件。

插件列表:

  • ruby-vim:在快速的在module, class, method中跳跃。
  • vim-bundler:在Vim中集成Bundler
  • vim-endwise:自动补全end关键字。
  • vim-rails:它的功能很多,可以说是用 Vim开发Rails不可缺少的一个插件。更详细的信息,可以前往它的官方网站获取。
  • vim-rspec:在Vim中执行Rspec测试。
" Cucumber navigation commands
autocmd User Rails Rnavcommand step features/step_definitions -glob=**/* -suffix=_steps.rb
autocmd User Rails Rnavcommand config config -glob=**/* -suffix=.rb -default=routes

" RSpec.vim mappings
map <Leader>t :call RunCurrentSpecFile()<CR>
map <Leader>s :call RunNearestSpec()<CR>
map <Leader>l :call RunLastSpec()<CR>
map <Leader>a :call RunAllSpecs()<CR>

更多好用的工具

还有很多好用的插件,如果每个都一一说明,那么篇幅再长一倍怕也是不够。所以,我这里就把一些好用的插件列出来,有兴趣的可以自己看看。

备注

有更多的一些插件我没有都列出来,它们一般用于特定语法的开发,不一定适合所有人。你可以参考从零搭建和配置OSX开发环境这篇文章,自动管理、配置你的Vim环境。

在上文中,我有一些遗漏的或者错误的地方,希望朋友发现后可以在下方留言指正。如果你有一些更好的插件、配置,也恳请你在下方留言。谢谢。

共收到 57 条回复
5433
chareice · #1 · 2015年4月24日

好文

465
reducm · #2 · 2015年4月24日

推荐了不少好用的插件!

1069
leeboqiang · #3 · 2015年4月24日

http://www.github.com/leebo/bovim 这是我的配置 参考了好几个网上流行的配置 看看楼主的 有好的也相互借鉴下 也是针对ruby rails开发的 对了 这个支持windows的

1551
LinuxGit · #4 · 2015年4月24日

Good job. 我也用的 molokai。

1069
leeboqiang · #5 · 2015年4月24日

希望 越来越多人使用vim 尤其是方便新手 要不vim可能真变成古董程序员才能用了

48
xi4oh4o · #6 · 2015年4月24日

请问编辑比较大的HTML 上下快速游走光标会感觉卡顿吗? 前些时候发现试了一圈发现 nerdtree 也会导致卡顿,关了就好一些。

172
ibachue · #7 · 2015年4月24日

其实代码补全才是精髓(原因是这个最难做也最值钱) 没有强大的代码补全的工具依然是非常原始的。。

27
numbcoder · #8 · 2015年4月24日

Vim 大法好啊!

96
zgs225 · #9 · 2015年4月24日

#6楼 @xi4oh4o 我没有这样的感觉

96
zgs225 · #10 · 2015年4月24日

#7楼 @ibachue 嗯,Vim也有非常强大的代码补全。不过我个人不喜欢用补全的功能。

172
ibachue · #11 · 2015年4月24日

#6楼 @xi4oh4o Vim 卡顿是常事 所以我后来换 Sublime 了

96
zgs225 · #12 · 2015年4月24日

#3楼 @leeboqiang 谢谢。

172
ibachue · #13 · 2015年4月24日

#10楼 @zgs225 Vim 的补全很弱啦。完全不认语法树也不会查函数列表的。。有些插件可能会针对某些语言做的先进点,但总体上还是很薄弱

1069
leeboqiang · #14 · 2015年4月24日

#7楼 @ibachue 代码补全其实偶尔不太好 搞得我现在好多单词都写不出来 看到认识 。。。就和汉字不经常写都忘了一样

48
xi4oh4o · #15 · 2015年4月24日

#11楼 @ibachue Vim 只保留最基础的扩展速度还可以接受,主要是用习惯了,Sublime 的Vim mode不是很顺手

8043
teddy_1004 · #16 · 2015年4月24日

@xiaoronglv 快来看快来看

11147
spacewander · #17 · 2015年4月24日

LZ的屏幕好大

9618
wosuopu · #18 · 2015年4月24日

不错哦。 有什么插件可以在vim远程调试rails的吗,求推荐。

172
ibachue · #19 · 2015年4月24日

#14楼 @leeboqiang 这个说法不对,先进的总要代替落后的,不能因为怕哪天买不到粮食饿死就自己插秧吧。 #15楼 @xi4oh4o 确实都不是最顺手,没办法,要不自己开发一个?

27
numbcoder · #20 · 2015年4月24日

#13楼 @ibachue 说 Vim 补全很弱,这个说法不准确,只能说目前没有好的 Ruby/Rails 补全插件而已。我用 Vim 写 Erlang, Golang 补全都非常精准,还有代码跳转,语法检查都是非常好用的,和专业 IDE 没什么区别。

2575
darkbaby123 · #21 · 2015年4月24日

@ibachue Sublime Text 现在不知道更新怎么样了。一个人主导的项目总觉得不知道什么时候作者就会不干了…… 我还比较看好 NeoVim 和 Atom ,尤其是后者基于 HTML 在 UI 方面是没有任何限制的,这点对发展插件还是挺有利的。如果能解决速度的问题那就是个很好的编辑器了。

96
zgs225 · #22 · 2015年4月25日

@darkbaby123 我从Atom内测开始便用它,最终还是放弃了。到目前,它依然多bug,高性能占用。

172
ibachue · #23 · 2015年4月25日

#20楼 @Numbcoder 正如我所说的,这都是插件针对部分语言做的工作,并非 Vim 的功劳。而这种方法其实不是什么长久之计。总有新的语言诞生,总有找不到的插件。

17522
dandananddada · #24 · 2015年4月25日

66666666666 mark~ 要是再有emacs的就更好了。

5173
i5ting · #25 · 2015年4月25日

wahaha

96
brambles · #26 · 2015年4月25日

不喜欢把vim当成一个IDE,既然都要用IDE了,那为什么不用RubyMine装一个vim插件?我更喜欢把vim当成一个纯粹的编辑器,一切都为了更好的写代码。如果需要其他什么功能,那么把它放到编辑器以外实现,然后给一个接口让编辑器调用。

还有就是楼主有没有发现一个配置几千行很难管理啊?顺便安利一下我的模块化vim配置:Github戳这里。以及我的vimscript中实现的require机制

96
brambles · #27 · 2015年4月25日

#18楼 @wosuopu

不用什么插件了吧。所谓远程调试的话我们看成开一个ssh过去,然后打开一个rails c是不是?那么只需要在一个shell中开ssh 到远程服务器,然后在目标目录下打开rails c不就好了?

那么问题就简单了,只需要在vim嵌入一个终端就行了,然后终端运行一个脚本就好。

嵌入终端的插件有 conque 这个插件。

96
brambles · #28 · 2015年4月25日

#23楼 @ibachue 所以工程师要有能力给自己造工具啊。总有新的语言/技术出现,总有不好用/用着不顺手或者干脆没有工具,这时候才能真正考验工程师的能力了。

就跟钢铁侠一样,再垃圾的材料也能撸出高达。

9618
wosuopu · #29 · 2015年4月25日

#27楼 @brambles 你没理解我的意思。我想的是像RubyMine那样,能否在vim中也对Rails应用进行设置断点,然后单步调试。 另外RubyMine感觉也很不错,可惜就是没有vim按键模式。

96
zgs225 · #30 · 2015年4月25日

#29楼 @wosuopu byebug哪里不满足呢?

96
brambles · #31 · 2015年4月25日

r #29楼 @wosuopu 好我去看看,看能不能写一个

96
brambles · #32 · 2015年4月26日

#29楼 @wosuopu

官方有自带的断点调试器啊,为什么一定要用IDE的呢……

http://guides.ruby-china.org/debugging_rails_applications.html

9618
wosuopu · #33 · 2015年4月26日

#30楼 @zgs225 byebug还没用过,回头有时间体验一下

9618
wosuopu · #34 · 2015年4月26日

#32楼 @brambles debugger之前也有用过,只是每次要调试时需要在代码中加上 debugger 调试完成后要发布时又得将 debugger 语句删掉,感觉有点麻烦

之前用过vdebug插件(https://github.com/joonty/vdebugPHP确实挺方便,只可惜不支持Ruby。),用来调试 RubyMine是使用ruby-debug-ide进行调试的。现在我的做法是,写代码时用vim,需要调试时用RubyMine。

2948
sg552sg552 · #35 · 2015年4月26日 3 个赞

@zgs225 咱俩名字好像。。。

作为一个用了5年VIM的人,我想说 ctrl + n/p 就足够代码补全了。。。

8635
jaywanglevelup · #36 · 2015年4月26日

mark一下,感谢楼主推荐

4789
ghjcumt2008 · #37 · 2015年4月26日

看这里。我都是在这里找。http://vimawesome.com/

5610
jarorwar · #38 · 2015年4月27日

其实,我的理解是!写 ruby rails 用啥都可以。 爱用IDE的基本都是从别的语言转过来的(不适用所有,但是适用大部分),像java啥的。

96
zgs225 · #39 · 2015年4月27日
8345
glz1992 · #40 · 2015年4月27日

#37楼 @ghjcumt2008 really awesome

41楼 已删除
96
zgs225 · #42 · 2015年4月27日

#41楼 @booobstar 如果有这样,说明你已经成功了。这个配置就是显示当前分支的。

43楼 已删除
157
raven · #44 · 2015年4月27日

我非常喜欢的一套配色方案 http://ethanschoonover.com/solarized

2746
hbin · #45 · 2015年4月27日

表扬一下,不过已经过了折腾这些东西的年纪了。 11 年开始用 Vim 同年转 Emacs。 现在工作时都是开一个 Emacs, 一个 Vim。用 Emacs 写代码,用 Vim 看源码。

5485
crazyjin · #46 · 2015年4月27日

大学从emacs转vim, 5年+的vim老菜鸟一个.

Plugin 'gmarik/Vundle.vim'
Plugin 'vim-ruby/vim-ruby'
Plugin 'vim-scripts/taglist.vim'
Plugin 'kchmck/vim-coffee-script'
Plugin 'scrooloose/nerdtree'
Plugin 'tpope/vim-rails'
Plugin 'slim-template/vim-slim.git'
Plugin 'Valloric/YouCompleteMe'
Plugin 'fatih/vim-go'
96
zgs225 · #47 · 2015年4月27日

#45楼 @hbin 是的,我在文中也推荐了这个配色

15420
pathbox · #48 · 2015年4月28日

一直用sublime, 今天就试试vim

8904
VincentJiang · #49 · 2015年4月28日

一直在用vim,感谢楼主的分享,想用YouCompleteMe,不过要求vim版本是7.4以上,但我mac上的vim是7.3的,请问楼主如何升级vim版本?或者其它可以使用YouCompleteMe的方法?

96
zgs225 · #50 · 2015年4月28日

#49楼 @jxs471494539 我是使用Homebrew管理vim的。

2466
rasefon · #51 · 2015年5月01日 1 个赞

我觉得ruby最好的ide还是rubymine

17465
sorashiro · #52 · 2015年5月04日

赞!最近刚接触vim和ruby,很喜欢

17696
lips · #53 · 2015年5月05日

学到后面,就是学VIM语言了?

947
chinacheng · #54 · 2015年5月07日
96
haitongz · #55 · 2015年5月08日

why not spf13-vim
https://github.com/spf13/spf13-vim 项目上就是一个IDE啦,与楼主的配置很相近啦

8562
runup · #56 · 2016年1月25日

安装了第一个插件,添加主窗口的配置文件的过程中出现如下问题,求解

E121: Undefined variable: t_Co
E15: Invalid expression: (t_Co > 2 || has("gui_running")) && !exists("syntax_on"
96
zgs225 · #57 · 2016年3月03日

#56楼 @runup 直接把if的判断语句去掉吧。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册