如何在VIM中导航Ruby方法?

时间:2009-08-25 09:10:02

标签: ruby vim

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

  • 使用

    查找'def'
    /def<space>
    
  • 使用q和记录
  • 创建与键对应的宏
  • 使用VIM标记? (甚至不确定他们做了什么,他们只是听起来很有希望

任何人都有更好的想法吗?

8 个答案:

答案 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年后也没有改变。

  • ctags不处理:模块A :: B
  • ctags不会标记(至少某些)运算符方法,例如==
  • ctags不支持限定标签,-type = +
  • ctags不输出常量或属性的标签。

不幸的是所有其他(我发现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

然后使用zjzkz[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

希望这有帮助!