Rubyはローカル変数への参照と無引数のメソッド呼び出しを同じ記法で書けるので、コードを読むときに混乱したりtypoでNoMethodErrorを出してがっかりすることが多々あります。 幸いなことにこれらは静的に解析することができるので、ローカル変数への参照を色付けするVimプラグインを書いた。
すごく便利な気がする!!!!!!!
Rubyインタフェース(>=1.9)が有効になったVimが必要なのでご注意ください。MacVim 7.4 KaoriYa 20140107で動作確認しました。
しくみ
Ruby1.9以降に標準添付されているripperというライブラリで、Rubyの構文解析をしてローカル変数への参照を取り出しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
ripperを使うとこのように位置情報付きの構文木が取れるので、ここからローカル変数への参照(:var_ref
や:assign
内の:var_firld
等)を抽出しています。
構文木をパターンマッチして処理するのにPATMというパターンマッチgemを作ったんですが詳細はいずれ。
Vimでmatchadd()
を使ってキーワードをハイライトさせる方法
抽出したローカル変数への参照情報は、[識別子, 行, 列]
という形式になっています。\%(行)l\%(列)c....(識別子の文字数分)
という正規表現を使うことで指定した位置の識別子を指定可能。
できた正規表現をmatchadd()
で指定することでハイライトを登録しています。
注意点として、matchadd()
はwindow単位で有効となるため(なぜだ)、バッファ切替時にはそれに合わせて適切にmatchdelete()
してやる必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
みたいな処理になってる。これでたぶん大丈夫なはず(自信なし)。