2012-05-05 61 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導航到爆炸(和問號)方法就好了。 –