如何在VIM中导航Ruby方法?

我正在学习VIM for Rails开发,并希望轻松地在文件中导航方法。 到目前为止,我看到几个选项:

  • 通过使用find“def”

    /def<space> 
  • 使用q和logging创build一个对应于一个键的macros
  • 使用VIM标记? (甚至不知道他们做什么,他们听起来很有希望

任何人有更好的想法?

:帮助]米

我认为它需要vimruby的ruby支持。

你会想要一个名为ctags的function

看到繁华的ctags ,它适用于包括Ruby在内的许多语言,而且易于使用。

从VIM :help ctags

ctags将创build一个源树中所有标识符的索引。 然后,您可以使用标记命令来导航源代码树。 请参阅:help tag-commands 。 最简单的方法是将光标放在关键字上并按下CTRL] 。 回到你来自哪里按CTRLT

除此之外,你可能想看看这个页面,它介绍了如何使用VIM作为一个更全面的Ruby IDE: 使用Vim作为完整的Ruby On Rails IDE

Vim的最佳解决scheme: 使用ctags 。 阅读有关如何在TAGS文件中导航的Vim文档,还可以安装像CtrlP这样的插件,这样可以直观地浏览标签。

警告: Exuberant ctags不能很好地运行在Ruby上 ,parsing器状态不佳,而且现在还没有改变。

  • ctags不处理:模块A :: B
  • ctags不会标记(至less一些)像==一样的运算符方法
  • ctags不支持合格的标签,-type = +
  • ctags不会为常量或属性输出标签。

不幸的是所有其他人(我发现2)Ruby ctags生成器要么过时(不支持Ruby 1.9+),要么非常慢。

有一个解决scheme。 开膛手 – 标签: https : //github.com/tmm1/ripper-tags这是快速的,它按预期工作。 它基于Ruby 1.9+特性,称为“Ripper”,它允许我们在(快速的)Ruby原始parsing器之上构build。 这是今天最准确的ctags发生器

开膛手CLI选项几乎与ctags相同,所以如果你已经知道ctags,你会发现ripper-tags容易学习。 这很简单:

 ripper-tags -R . 

这会创build一个标签文件,默认情况下vim会自动读取它(必须是打开vim实例的目录,或者手动更改vim中的path设置,如果在不同的目录中启动它的话 – 更多的是在Vim手册中)。

如果你喜欢这个,你可以进一步安装我的项目,它会自动为你安装的所有gem创build标签 : https : //github.com/lzap/gem-ripper-tags

用法很简单(再次注意,只有Ruby 1.9+):

 gem install gem-ripper-tags 

然后为所有已安装的gem生成标签:

 gem ripper_tags 

只要你现在安装一个gem,标签就会自动创build。

 gem instal some_gem ... 

我还有一个额外的步骤 – 我有一个git模板, 在每次git pull或merge (使用ripper-tags) 重新生成我的项目标签:

https://github.com/lzap/bin-public/blob/master/git-hooks-reinstall

注意你也需要在同一个git仓库中使用目录文件/ git_template。

我希望这是在Ruby代码库中导航的好起点:-)

一些想法:

首先,使用~/.vim/after/ftplugin/ruby.vim的C函数search键进行~/.vim/after/ftplugin/ruby.vim

 :nmap [[ ?def <CR> :nmap ]] /def <CR> 

然后你可以使用[[]]前进和后退一个函数,就像在C / Perl / Java代码中一样。

另一种方式可能有所帮助:

.vimrc ,添加以下行:

 :let ruby_fold = 1 

然后使用zjzkz[z]通过折叠进行导航。 你也可以安装这个插件,以便你可以使用daz轻松删除折叠。

为了find特定的function(而不是仅仅浏览它们),你需要使用ctags(如chillitom所提到的)。 标签列表插件使得导航到一个特定的函数变得更加容易,但是(正如chillitom所说的) Ctrl]CtrlT对于光标下的关键字是有用的。

有关更多信息,请参阅:

 :help [[ :help ft-ruby-syntax :help z[ :help after-directory 

我最近发现Ruby.vim(上面的每个答案)都带有相当有用的键绑定:

 nnoremap <silent> <buffer> [m :<CU>call <SID>searchsyn('\<def\>','rubyDefine','b','n')<CR> nnoremap <silent> <buffer> ]m :<CU>call <SID>searchsyn('\<def\>','rubyDefine','','n')<CR> nnoremap <silent> <buffer> [M :<CU>call <SID>searchsyn('\<end\>','rubyDefine','b','n')<CR> nnoremap <silent> <buffer> ]M :<CU>call <SID>searchsyn('\<end\>','rubyDefine','','n')<CR> xnoremap <silent> <buffer> [m :<CU>call <SID>searchsyn('\<def\>','rubyDefine','b','v')<CR> xnoremap <silent> <buffer> ]m :<CU>call <SID>searchsyn('\<def\>','rubyDefine','','v')<CR> xnoremap <silent> <buffer> [M :<CU>call <SID>searchsyn('\<end\>','rubyDefine','b','v')<CR> xnoremap <silent> <buffer> ]M :<CU>call <SID>searchsyn('\<end\>','rubyDefine','','v')<CR> nnoremap <silent> <buffer> [[ :<CU>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','b','n')<CR> nnoremap <silent> <buffer> ]] :<CU>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','','n')<CR> nnoremap <silent> <buffer> [] :<CU>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','b','n')<CR> nnoremap <silent> <buffer> ][ :<CU>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','','n')<CR> xnoremap <silent> <buffer> [[ :<CU>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','b','v')<CR> xnoremap <silent> <buffer> ]] :<CU>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','','v')<CR> xnoremap <silent> <buffer> [] :<CU>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','b','v')<CR> xnoremap <silent> <buffer> ][ :<CU>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','','v')<CR> 

一个技巧就是使用' /f methodName '进行search。

你也应该看看打开代码折叠通过添加此行到您的.vimrc:

 :let ruby_fold 

有关更多详细信息,请参阅:help ft-ruby-syntax

通常我只是在增量search中键入方法的名称。