我意识到这已经过时了,但我在 Vim 8.0 和 Neovim 中都遇到了同样的问题。如果我:tag mymethod!
从 vim 的命令行输入,它会找到相关的标签,但如果我尝试<C-]>
将光标放在方法名称上,它会出错(注意它搜索的名称E426: tag not found: mymethod
中缺少)。!
您可以通过添加!
到 Ruby 语法中被识别为关键字字符的字符列表来解决此问题:
:set iskeyword+=!
您可以将~/.vim/after/syntax/ruby.vim
其添加到您打开的任何 Ruby 文件中。不过我还没有测试过,所以不能说它是否会对其他任何事情产生不利影响。我知道它会改变单词跳跃行为。w
例如,会将 the!
视为“小”字的一部分。
再想一想,它肯定会处理不当之类的事情!some_test
。如果你<C-]>
用光标点击那里的任何地方,它会搜索一个名为 的方法!some_test
,这绝对不是你想要的。更好的解决方案是围绕 Ruby 文件的标记查找编写一个包装函数。我实际上正在为此做一些事情,所以当我有一些像样的东西时我会发布。
更新:我发现了一个非常简单的解决方法:
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
:
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>
更新 2
事实证明 的特殊行为<C-R><C-W>
是由 vim-ruby 提供的(并且默认包含在 Vim 的运行时文件中)。该脚本自定义<C-R><C-W>
并添加了一个<Plug><cword>
映射以正确识别 Ruby 游标标识符。我只是遇到了处理不当,!
因为在添加我发现更舒适的键绑定时,我无意中破坏了 vim-ruby 已经提供的映射:
nnoremap <C-.> <C-]>
如果我这样做了nmap
,vim-ruby 的映射本可以完成它的工作。或者,您可以利用 vim-ruby 提供的功能(在 ruby ftplugin 文件中):
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>