我正在学习VIM for Rails开发,并希望轻松导航文件中的方法。到目前为止,我看到了几个选项:
使用
查找'def'/def<space>
任何人都有更好的想法吗?
答案 0 :(得分:40)
:help] m
我认为需要vim-ruby来支持ruby。
答案 1 :(得分:35)
您需要一个名为 ctags
的功能参见exuberant ctags,它适用于包含Ruby的许多语言,并且易于使用。
来自VIM :help ctags
ctags 将创建源树中所有标识符的索引。然后,您可以使用标记命令在源树周围导航。见:help tag-commands
。最简单的方法是将光标放在关键字上,然后按 CTRL - ] 。要回到你来自的地方,请按 CTRL - T
除此之外,您可能希望查看此页面,其中介绍了如何将VIM用作功能更全面的Ruby IDE:Using Vim as a Complete Ruby On Rails IDE
答案 2 :(得分:13)
Vim的最佳解决方案:使用ctags 。阅读有关如何在TAGS文件中导航的Vim文档,还安装CtrlP之类的插件,它允许您直观地浏览标签。
警告:繁琐的ctags与Ruby 不兼容,解析器状况不佳,4年后也没有改变。
不幸的是所有其他(我发现2)Ruby ctags生成器要么已过时(没有Ruby 1.9+支持),要么非常慢。
有一个解决方案。 Ripper-ctags:https://github.com/tmm1/ripper-tags它很快并且按预期工作。它基于Ruby 1.9+功能,称为“Ripper”,它允许我们构建在(快速)Ruby原始解析器之上。它是今天最准确的ctags生成器。
Ripper CLI选项几乎与ctags相同,因此如果你已经知道了ctags,你会发现ripper-tags很容易学习。这很简单:
ripper-tags -R .
这会创建TAGS文件,vim默认自动读取(必须是打开vim实例的目录,或者如果你在另一个目录中启动它,请手动更改vim中的路径设置 - 更多内容见于Vim手册)。 / p>
如果你喜欢这个,你可以继续前进并安装我的项目自动为你安装的所有宝石创建TAGS :https://github.com/lzap/gem-ripper-tags
用法很简单(再次注意,只有Ruby 1.9 +):
gem install gem-ripper-tags
然后为所有已安装的宝石生成标签:
gem ripper_tags
现在,无论何时安装宝石,都会自动创建标签。
gem instal some_gem ...
我再往前走一步 - 我有一个git模板,它会在每次git pull或者自动合并后重新生成我的项目TAGS (使用ripper-tags):
https://github.com/lzap/bin-public/blob/master/git-hooks-reinstall
请注意,您将需要来自同一个git存储库的目录文件/ git_template。
我希望这是在Ruby代码库中导航的良好起点: - )
答案 3 :(得分:5)
一些想法:
首先,进行映射以使用~/.vim/after/ftplugin/ruby.vim
中的C函数搜索键:
:nmap [[ ?def <CR>
:nmap ]] /def <CR>
然后你可以使用[[
和]]
前进和后退一个函数,就像在C / Perl / Java代码中一样。
另一种可能有用的方法:
在.vimrc
中,添加以下行:
:let ruby_fold = 1
然后使用zj
,zk
,z[
和z]
进行折叠导航。您还可以安装this plugin,以便使用daz
轻松删除折叠。
为了找到特定的功能(而不仅仅是在它们周围导航),你需要使用ctags(如chillitom所述)。 taglist plugin使导航到特定功能变得更加容易,但(如chillitom所说) Ctrl - ] 和 Ctrl - T 对于光标下的关键字非常有用。
有关详细信息,请参阅:
:help [[
:help ft-ruby-syntax
:help z[
:help after-directory
答案 4 :(得分:3)
我最近发现Ruby.vim(上面的一个答案)带有非常有用的键绑定:
nnoremap <silent> <buffer> [m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','b','n')<CR>
nnoremap <silent> <buffer> ]m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','','n')<CR>
nnoremap <silent> <buffer> [M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','b','n')<CR>
nnoremap <silent> <buffer> ]M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','','n')<CR>
xnoremap <silent> <buffer> [m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','b','v')<CR>
xnoremap <silent> <buffer> ]m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','','v')<CR>
xnoremap <silent> <buffer> [M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','b','v')<CR>
xnoremap <silent> <buffer> ]M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','','v')<CR>
nnoremap <silent> <buffer> [[ :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','b','n')<CR>
nnoremap <silent> <buffer> ]] :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','','n')<CR>
nnoremap <silent> <buffer> [] :<C-U>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','b','n')<CR>
nnoremap <silent> <buffer> ][ :<C-U>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','','n')<CR>
xnoremap <silent> <buffer> [[ :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','b','v')<CR>
xnoremap <silent> <buffer> ]] :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','','v')<CR>
xnoremap <silent> <buffer> [] :<C-U>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','b','v')<CR>
xnoremap <silent> <buffer> ][ :<C-U>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','','v')<CR>
答案 5 :(得分:1)
一个技巧是使用“/f methodName
”进行搜索。
您还应该通过将此行添加到.vimrc来启用代码折叠:
:let ruby_fold
有关详细信息,请参阅:help ft-ruby-syntax
。
答案 6 :(得分:0)
通常我只需在增量搜索中键入方法的名称。
答案 7 :(得分:0)
我使用<maven.compiler.target>9</maven.compiler.target>
<maven.compiler.source>9</maven.compiler.source>
(The Silver Searcher)编写了一个小shell脚本。在ag
此方法将扩展光标下的单词。
.vimrc
然后声明function! SearchForDeclarationCursor()
let searchTerm = expand("<cword>")
call SearchForDeclaration(searchTerm)
endfunction
方法
SearchForDeclaration
请注意,我们明确搜索function! SearchForDeclaration(term)
let definition = 'def ' . a:term
cexpr system('ag -w ' . shellescape(definition))
endfunction
个关键字。 (您可以使用语言方法签名语法)
然后我们将上述函数映射到def
命令。
Leader
现在,如果将光标放在“项目中”定义的方法的任何位置,并按map <Leader>cd :call SearchForDeclarationCursor()<CR>
,它将导航到定义方法的位置。
请注意,可以在多个类中定义方法。您可以使用<Leader>cd
进行下一个循环,也可以使用<Leader>n
进行循环播放。
如果你想要更详细的解释,我在这里写了一篇博文:http://pradyumna.io/2017/12/17/search-ruby-method-declarations-in-vim.html
希望这有帮助!