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

zgs225 · 发布于 2015年04月24日 · 最后由 zgs225 回复于 2016年03月03日 · 9655 次阅读
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

好文

465

推荐了不少好用的插件!

1069

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

1551

Good job. 我也用的 molokai。

1069

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

48

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

172

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

27

Vim 大法好啊!

96

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

96

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

172

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

172

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

1069

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

48

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

8043

@xiaoronglv 快来看快来看

11147

LZ的屏幕好大

9618

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

172

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

27

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

2575

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

96

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

172

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

17522

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

5173

wahaha

96

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

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

96

#18楼 @wosuopu

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

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

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

96

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

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

9618

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

96

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

96

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

96

#29楼 @wosuopu

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

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

9618

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

9618

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

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

2948

@zgs225 咱俩名字好像。。。

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

8635

mark一下,感谢楼主推荐

4789

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

5610

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

8345

#37楼 @ghjcumt2008 really awesome

41楼 已删除
96

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

43楼 已删除
157

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

2746

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

5485

大学从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

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

15420

一直用sublime, 今天就试试vim

8904

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

96

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

2466

我觉得ruby最好的ide还是rubymine

17465

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

17696

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

96

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

8562

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

E121: Undefined variable: t_Co
E15: Invalid expression: (t_Co > 2 || has("gui_running")) && !exists("syntax_on"
96

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

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