如何在VIM中导航Ruby方法?

cetgtptt  于 2023-05-06  发布在  Ruby
关注(0)|答案(8)|浏览(135)

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

  • 通过使用查找'def'
/def<space>
  • 使用q和record创建一个对应于某个键的宏
  • 使用VIM标记?(甚至不知道他们做什么,他们只是听起来很有前途

有人有更好的主意吗?

wlzqhblo

wlzqhblo1#

:help ]m
我认为它需要vim-ruby来支持ruby。

nx7onnlm

nx7onnlm2#

你会需要一个名为 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

eyh26e7m

eyh26e7m3#

Vim的最佳解决方案:使用ctags。阅读Vim文档,了解如何在TAGS文件中导航,还可以安装CtrlP这样的插件,它可以让你直观地浏览标签。
警告:Exuberant ctags不能很好地与Ruby配合使用,解析器状态不佳,至今已4年未更改。

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

不幸的是,所有其他(我发现2)Ruby ctags生成器要么过时(没有Ruby 1.9+支持),要么非常慢。
有一个解决方案,tho。Ripper-ctags:https://github.com/tmm1/ripper-tags它速度很快,并且按预期工作。它基于Ruby 1.9+的一个叫做“Ripper”的特性,它允许我们在(快速的)Ruby原始解析器之上构建。它是当今最精确的ctags生成器
Ripper CLI选项与ctags几乎相同,因此如果您已经了解ctags,您会发现ripper-tags很容易学习。它很简单:

ripper-tags -R .

这将创建Vim默认自动读取的TAGS文件(必须是您打开Vim示例的目录,或者如果您在不同的目录中启动Vim,请手动更改Vim中的路径设置-更多信息请参见Vim手册)。
如果你喜欢这个,你可以更进一步安装我的项目,它会自动为你安装的所有gem创建TAGShttps://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 pull或merge后自动重新生成我的项目TAGS**(使用ripper-tags):
https://github.com/lzap/bin-public/blob/master/git-hooks-reinstall
注意你还需要来自同一个git仓库的/git_template目录文件。
我希望这是在Ruby代码库中导航的好起点:-)

kkih6yb8

kkih6yb84#

有几个想法:
首先,在~/.vim/after/ftplugin/ruby.vim中使用C函数搜索键进行Map:

: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
anauzrmj

anauzrmj5#

我最近发现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>
qqrboqgw

qqrboqgw6#

一个技巧是只使用' /f methodName '进行搜索。
你还应该通过在你的.vimrc中添加这一行来打开代码折叠:

:let ruby_fold

请参阅:help ft-ruby-syntax了解更多详细信息。

sirbozc5

sirbozc57#

通常我只是在增量搜索中输入方法的名称。

bfnvny8b

bfnvny8b8#

我使用ag(The银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关键字。(您可以使用您的语言方法签名语法)
然后,我们将上述函数Map到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
希望这有帮助!

相关问题