如何在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 – ] 。 回到你来自哪里按CTRL – T
除此之外,你可能想看看这个页面,它介绍了如何使用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
然后使用zj
, zk
, z[
和z]
通过折叠进行导航。 你也可以安装这个插件,以便你可以使用daz
轻松删除折叠。
为了find特定的function(而不是仅仅浏览它们),你需要使用ctags(如chillitom所提到的)。 标签列表插件使得导航到一个特定的函数变得更加容易,但是(正如chillitom所说的) Ctrl – ]和Ctrl – T对于光标下的关键字是有用的。
有关更多信息,请参阅:
: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中键入方法的名称。