- 使用 '/' 查找 'def'
- 使用 ':tag method_name' 跳转到方法名称
- 使用 ']' 跳转到下一个方法
- 使用 '[[' 跳转到当前代码块的开始位置
这些选项中是否有更好的方法?
/def<space>
有没有更好的想法?
你需要一个名为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
对于Vim最佳解决方案是使用ctags。阅读Vim文档以了解如何在TAGS文件中导航,也安装像CtrlP这样的插件,它允许您直观地浏览标签。
警告:Exuberant 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中的路径设置 - 更多内容请参见Vim手册)。
如果您喜欢这个功能,可以进一步安装我的项目,它会自动为您安装的所有gem包创建TAGS文件:https://github.com/lzap/gem-ripper-tags
使用非常简单(请注意,仅适用于Ruby 1.9+):
gem install gem-ripper-tags
然后为所有已安装的 gem 生成标签:
gem ripper_tags
任何时候您现在安装一个 gem,标签都会自动创建。gem instal some_gem ...
我进一步采取了一个额外的步骤 - 我有一个git模板,可以在每次自动进行git拉取或合并后重新生成我的项目TAGS(使用ripper-tags):
https://github.com/lzap/bin-public/blob/master/git-hooks-reinstall
请注意,您还需要来自同一git存储库的directory files/git_template目录。
我希望这是浏览Ruby代码库的良好起点 :-)
几个想法:
首先,创建一个映射,使用C函数在~/.vim/after/ftplugin/ruby.vim
中搜索键:
:nmap [[ ?def <CR>
:nmap ]] /def <CR>
然后,您可以使用[[
和]]
来前进和后退函数,就像在C/Perl/Java代码等中一样。
另一种可能有帮助的方法:
在.vimrc
中添加以下行:
:let ruby_fold = 1
zj
、zk
、z[
和z]
来折叠导航。你也可以安装这个插件,这样你就可以使用daz
轻松删除折叠。:help [[
:help ft-ruby-syntax
:help z[
:help after-directory
我最近发现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>
一个技巧是只需使用'/f methodName
'进行搜索。
您还应该查看通过将以下行添加到您的 .vimrc 中打开代码折叠:
:let ruby_fold
更多详情请参见:help ft-ruby-syntax
。
我使用ag
(The Silver Searcher)编写了一个小的shell脚本。在你的.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
进行下一个或<Leader>p
进行上一个循环。
如果您想要更详细的解释,请查看我在这里写的博客文章:https://pradyumna.dev/articles/2017-12-17-search-ruby-method-declarations-in-vim
希望这有所帮助!
]m
和[m
,同时您也可以使用]M
跳转到方法定义的结尾。 - hguzman