我在使用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
定义而不是正确的爆炸版本。似乎感叹号没有包含在搜索的标识符中。
有没有办法解决这个问题,以便将正确的方法跳转到?
答案 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版本。