2012-05-05 13 views
6

Exhuberant Ctagsを使用してRuby bangメソッドにジャンプする際に問題があります。私は同様の問題を抱えている人を探し、何も見つけられません。VimでCtagsを使用してRuby bangメソッドにジャンプ

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 

ただし、カーソルをmethod!(3行目)にコールして^]を押すと、正しいバンバージョンではなく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+=! 

あなたが開いているあなたのファイル任意のRubyでそれを適用する~/.vim/after/syntax/ruby.vimにこれを追加することができます。私はこれをテストしていないので、他に悪影響を与えるかどうかは言えません。私はそれが単語ジャンプの行動を変えることを知っている。 wは、例えば、「小さな」単語の一部として!を扱います。

2番目の考えでは、それは間違いなく!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-、代わりにnmapを行わたい場合

nnoremap <C-.> <C-]> 

:私はより快適なキーバインドであることがわかりました何を追加するとき、私は不注意すでにVIM-ルビーが提供するマッピングを上書きさていたので、私は唯一の!の取扱いミスに走りましたルビーのマッピングがその仕事をしていた可能性があります。 VIM-ルビーは(ファイル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> 
3

あなたはいつも:tagを使用することができます。

:tag method! 

またはVisualモード - あなたは^]を打つ前に、あなたは(V +動きに)任意のテキストをハイライト表示した場合、それはとして強調表示されたテキストを使用します。カーソルの下にある '識別子'を検索するのではなく、だからあなたのカーソルがmethod!m上にある場合は、その後、

vE^] 

トリックを行う必要があります。カーソルが単語の他の場所にある場合は、最初にbを押します。

+0

私は '^]'を 'viW ^]'に再マッピングしました。ありがとう!ただし、この操作のセマンティクスの一部が変更されているので、このソリューションが理想的ではないかどうかはわかりません。 – xoebus

0

私はこの質問を投稿した時点でMacVimのスナップショット63を使用していました。私は現在スナップショット72を使用していますが、問題はなくなりました。私がここで与えることができる唯一のアドバイスは、使用しているVimのバージョンをアップグレードすることです。

+0

また、使用している 'ctags'のバージョンを確認してください。以前のバージョン(バージョン番号が付いていないもののように、6.1のXcodeが付属しています)は、vimが参照するbangメソッドのタグを生成しません。私はExuberant Ctags 5.8をインストールするためにHomebrewを使い、タグファイルを再生成しました。今vimはちょうど良い方法を(そして疑問符)の方法にナビゲートします。 –

関連する問題