7

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

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

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

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

4

3 回答 3

4

我意识到这已经过时了,但我在 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>
于 2017-07-25T22:03:28.383 回答
3

您可以随时使用:tag

  :tag method!

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

   vE^]

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

于 2012-05-05T03:54:18.427 回答
0

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

于 2014-01-18T10:55:36.277 回答