MPがありません。

$liiu->mp == 0

VimでPerlを書くときにctagsを導入して使ってみた

コードジャンプを利用したい場合にctagsを導入するという方法がありますが、最近VimPerlを書くときに導入してみたところ、非常に良い感じだったので、インストール方法と簡単な使い方を記しておきます。

インストールするものについて

ctagsの実装(?)にはいろいろ種類があるようですが、今も活発に開発が続いている universal-ctags をインストールするのが良さそうです。

ctags.io

1. インストールする

僕の個人機のOSはUbuntu18.04なので、今回はgithub上にあるレポジトリからcloneしてきて手動でビルドしました。

$ git clone https://github.com/universal-ctags/ctags
$ ./autogen.sh
$ ./configure
$ make
$ make install

詳しいことが知りたい場合は Readme や docs/autotools.rst を見てください。 Max OSだとbrewからインストールもできるようです。

2.tagsファイルを生成する

エディタでコードジャンプできるようにするには、まず対象のコードに対してどのようなパターンの時にどのファイルのどの場所にジャンプするのか、みたいなことを定義したtagsファイルを生成する必要があります。
tagsファイルはctagsコマンドで生成できます。
今回はPerlのコードのみを対象にしているので、プロジェクトのルートディレクトリで以下のようなコマンドを実行しtagsファイルを生成します。

$ ctags -R --languages=Perl

実行すると、 tags というファイルが生成されているのが確認できます。
tagsファイルは直接プロジェクトに関係ないので、ついでに .gitignore に追加しておくといいと思います。

注意点として、tagsファイルはコードに変更がある度に生成し直さないと正しくコードジャンプできなくなるので、コードに変更がある度に再生成する必要があります。
tagsファイルを再生成する方法はいろいろありますが、僕は git で commit した時にフック処理をさせるようにして、commitする度にtagsファイルの再生成を行うようにさせました。

Cartonを利用して開発している場合、 local/ 以下に依存モジュールが入っていると思うので、依存モジュールの定義元にもコードジャンプできてより開発が捗ります。

3. Vimキーバインドについて

  • 定義元へのジャンプ : <C - ]>
  • 複数の候補がある場合の定義元へのジャンプ : <gC - ]>
    • 継承してoverrideしているようなモジュールが複数ある場合などに使います
  • コードジャンプ前の位置に戻る : <C - t>

他にもいろいろありますが、とりあえずこれらのキーバインドを覚えとくといいと思います

所感

Perlでコードを書いてると、どんな引数を渡せばよくわからなくて関数の定義元に飛びたい!、というような状況がよくあるのでとても便利です。
しかし、Mooseのシンタクスシュガーやkeywordプラグインを使っているようなモジュールには対応していないので、それらを使っている場合は別の方法でtagsファイルを生成する必要がありそうです。(CPANにそういうライブラリがあがってるっぽいのでそのうち試したい。)