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

在Vim中使用Ctags跳转到Ruby-bang方法,ruby,vim,ctags,Ruby,Vim,Ctags,我在使用Exhuberant CTAG跳转到Ruby bang方法时遇到了一个问题。我搜索过其他有类似问题的人,但什么也找不到。使用以下小型Ruby类可以显示该问题的示例: class你好 def启动 方法! 结束 def方法 #废话 结束 def方法! #废话 结束 结束 当在该文件上运行ctags-R.时,生成的标记文件包含以下两行,表明在生成时发现了这两种方法: method test.rb /^ def method$/;" f class:Hello method! tes

我在使用Exhuberant CTAG跳转到Ruby bang方法时遇到了一个问题。我搜索过其他有类似问题的人,但什么也找不到。使用以下小型Ruby类可以显示该问题的示例:

class你好
def启动
方法!
结束
def方法
#废话
结束
def方法!
#废话
结束
结束
当在该文件上运行
ctags-R.
时,生成的
标记
文件包含以下两行,表明在生成时发现了这两种方法:

method  test.rb /^  def method$/;"  f   class:Hello
method! test.rb /^  def method!$/;" f   class:Hello
但是,如果我将光标放在对
方法的调用上并按
^]
然后光标跳到
方法
定义,而不是正确的版本。似乎感叹号未包含在搜索的标识符中


是否有办法解决此问题,以便跳转到正确的方法?

您始终可以使用
:tag

  :tag method!
或视觉模式-如果在点击^]之前突出显示任何文本(使用v+移动),它将使用突出显示的文本作为标记,而不是尝试在光标下查找“标识符”。因此,如果您的光标位于
方法中的
m
,然后

   vE^]

我们应该做到这一点。如果光标在单词的其他位置,则先点击
b

发布此问题时,我正在使用MacVim snapshot 63。我现在正在使用snapshot 72,问题已经解决了。这里我能给出的唯一建议是升级您正在使用的Vim版本。

我意识到这是非常旧的版本,但我在Vim 8.0和Neovim中遇到了同样的问题。如果我输入
:标记mymethod从vim的命令行中,它会找到相关的标记,但如果我尝试将光标放在方法名称上,它会出错
E426:tag not found:mymethod
(注意,它搜索的名称中缺少

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

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

再想一想,它肯定会错误地处理
!一些测试
。如果光标在
中的任意位置,它将搜索名为
的方法!一些测试
,这绝对不是你想要的。更好的解决方案是围绕Ruby文件的标记查找编写包装函数。我实际上正在为此做一些工作,所以当我有一些像样的东西时,我会发布

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

nnoremap <buffer><silent> <C-]> :tag <C-R><C-W><CR>
更新2

事实证明,
的特殊行为是由vim ruby提供的(默认情况下包含在vim的运行时文件中)。该脚本定制了
,还添加了一个
映射来正确识别Ruby游标标识符。我只是遇到了
的错误处理因为我在添加我发现更舒适的键绑定时无意中破坏了vim ruby已经提供的映射:

nnoremap <C-.> <C-]>

^]在我的vim版本中正确跳转到正确的方法。您使用的是什么版本的vim和ctags?我确实安装并启用了vim ruby和matchit。不确定这是否有区别。我正在使用MacVim Snapshot 63,它构建在Vim 7.3上。我也有这两个插件。即使我在没有配置的情况下启动vim(
mvim-u NONE
),问题仍然存在。我现在已经将
^]
重新映射到
viW^]
,谢谢!但是,此操作的某些语义将发生更改,因此我不确定此解决方案是否理想。请检查您正在使用的
ctags
的版本。较旧的版本——如6.1版本中仍然附带Xcode的无编号版本——甚至不会为bang方法生成标签供vim参考。我使用自制软件安装了Exuberant Ctags 5.8,并重新生成了标签文件;现在vim很好地导航到bang(和问号)方法。
nnoremap <C-.> <C-]>
nnoremap <buffer><silent>  <C-]> :<C-U>exe v:count1."tag <Plug><cword>"<CR>
nnoremap <buffer><silent>     g] :<C-U>tselect <Plug><cword><CR>
nnoremap <buffer><silent> g<C-]> :<C-U>tjump   <Plug><cword><CR>