2012-05-05 59 views
6

使用C标签我在与跳跃使用Exhuberant C标签Ruby的爆炸方法问题Ruby的爆炸方法。我搜索了其他有类似问题的人,但无法找到任何内容。跳转到Vim中

class Hello 
    def start 
    method! 
    end 

    def method 
    # Blah 
    end 

    def method! 
    # Blah 
    end 
end 

ctags -R .被该文件将所得tags文件包含以下2行表明这两种方法都在生成发现运行::

可以使用下面的小Ruby类要显示的问题的一个例子
method test.rb /^ def method$/;" f class:Hello 
method! test.rb /^ def method!$/;" f class:Hello 

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

有没有办法解决这个问题,从而正确的方法是跳楼?

+1

^]正确跳转到我的版本的vim的正确方法。你使用的是什么版本的vim和ctags?我确实安装并启用了vim-ruby和matchit。不知道这是否有所作为。 – rjk

+0

我使用的是基于Vim 7.3构建的MacVim Snapshot 63。我也有这两个插件。即使我没有配置启动vim('mvim -u NONE'),问题依然存在。 – xoebus

回答

2

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

您可以通过添加!以公认的Ruby语法关键字的字符的字符列表解决这个问题:

:set iskeyword+=! 

你可以将它添加到~/.vim/after/syntax/ruby.vim在任何Ruby文件,你打开应用它。我还没有测试过,所以不能说它是否会对其他东西产生不利影响。我知道这会改变跳字的行为。例如,w将作为“小”字的一部分对待!

关于第二个想法,肯定会错误地处理之类的东西!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-红宝石(默认提供并列入Vim的运行时文件)。该脚本自定义<C-R><C-W>并且还添加了一个<Plug><cword>映射来正确标识Ruby游标标识符。我只跑进!处理不当,因为我加入的时候我觉得更舒适的键绑定在不经意间遭受重挫已经VIM-红宝石提供的映射:

nnoremap <C-.> <C-]> 

如果我做nmap相反,vim-红宝石的映射本可以完成它的工作。或者,您可以利用什么VIM-Ruby提供这样做(在Ruby文件类型插件文件):

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> 
3

您可以随时使用:tag

:tag method! 

或视觉模式 - 如果高亮显示任何文本(与v +移动)你打^]之前,它将使用高亮文本作为标记,而不是试图在光标下找到'标识符'。所以,如果你的光标在method!m,然后

vE^] 

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

+0

现在我已经将'^]'重新映射到'viW ^]',谢谢!但是,这个操作的一些语义会改变,所以我不确定这个解决方案是否理想。 – xoebus

0

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

+0

同时检查您正在使用的'ctags'的版本。较老的版本 - 就像6.1版本的Xcode一样没有版本编号的版本 - 甚至不会为vim引用的bang方法生成标签。我使用Homebrew安装Exuberant Ctags 5.8并重新生成了标签文件;现在vim导航到爆炸(和问号)方法就好了。 –