在Vim中使用Ctags跳转到Ruby bang方法

时间:2012-05-05 02:21:21

标签: ruby vim ctags

我在使用Exhuberant Ctags跳转到Ruby bang方法时遇到了问题。我搜索了其他有类似问题的人,但我找不到任何东西。可以使用以下小型Ruby类显示问题的示例:

class Hello
  def start
    method!
  end

  def method
    # Blah
  end

  def method!
    # Blah
  end
end

在此文件上运行ctags -R .时,生成的tags文件包含以下2行,表明这两种方法都是在生成时发现的:

method  test.rb /^  def method$/;"  f   class:Hello
method! test.rb /^  def method!$/;" f   class:Hello

但是,如果我将光标放在第3行的method!调用上并按^],则光标会跳转到method定义而不是正确的爆炸版本。似乎感叹号没有包含在搜索的标识符中。

有没有办法解决这个问题,以便将正确的方法跳转到?

3 个答案:

答案 0 :(得分:3)

您始终可以使用:tag

  :tag method!

或视觉模式 - 如果您在点击 ^] 之前突出显示任何文字( v +移动),它将使用突出显示的文字作为标记,而不是尝试在光标下找到'标识符'。因此,如果您的光标位于m中的method!,那么

   vE^]

应该做的伎俩。如果光标位于单词的其他位置,请先点击b

答案 1 :(得分:3)

我意识到这是超级老,但我在Vim 8.0和Neovim都遇到了同样的事情。如果我从vim的命令行输入:tag mymethod!,它会找到相关的标记,但如果我用方法名称上的光标尝试 <C-]> ,则会出错{{1} (注意它搜索的名称中缺少E426: tag not found: mymethod)。

您可以通过将!添加到Ruby语法中被识别为关键字字符的字符列表来解决此问题:

!

您可以将其添加到:set iskeyword+=! 以将其应用于您打开的任何Ruby文件中。我没有测试过这个,所以不能说它是否会对其他任何东西产生不利影响。我知道它会改变单词跳跃行为。例如, ~/.vim/after/syntax/ruby.vim 会将w视为“小”字的一部分。

第二个想法,肯定会错误处理像!这样的事情。如果您使用光标点击 !some_test ,它会搜索名为<C-]>的方法,这绝对不是您想要的。更好的解决方案是围绕Ruby文件的标记查找编写包装函数。我实际上正在为此做点什么,所以当我有一些可以呈现的东西时我会发布。

更新:我找到了一个非常简单的解决方法:

!some_test

出于某种原因, nnoremap <buffer><silent> <C-]> :tag <C-R><C-W><CR> 在命令行模式下的行为与<C-R><C-W>的行为不同,可以说是来自文档。即使expand('<cword>')不是!个字符,而'iskeyword'导致expand('<cword>') mymethod 会导致<C-R><C-W> 。这同样适用于mymethod!。您可以通过将以下内容放入is_this_your_method?

来应用此变通方法
~/.vim/ftplugin/ruby.vim

更新2

事实证明nnoremap <buffer><silent> <C-]> :tag <C-R><C-W><CR> nnoremap <buffer><silent> g] :tselect <C-R><C-W><CR> nnoremap <buffer><silent> g<C-]> :tjump <C-R><C-W><CR> 的特殊行为是由vim-ruby提供的(默认包含在Vim的运行时文件中)。该脚本自定义<C-R><C-W>并添加<C-R><C-W>映射以正确识别Ruby游标标识符。我只是遇到了<Plug><cword>的错误处理,因为我无意中破坏了vim-ruby已经提供的映射,当我添加我觉得更舒服的键绑定时:

!

如果我完成了nnoremap <C-.> <C-]> ,那么vim-ruby的映射就可以完成它的工作。或者,您可以利用vim-ruby提供的功能(在ruby ftplugin文件中):

nmap

答案 2 :(得分:0)

我在发布此问题时使用的是MacVim快照63。我现在正在使用快照72,问题已经消失。我在这里给出的唯一建议是升级您正在使用的Vim版本。