SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【vim】ctagsでクラスや関数の定義箇所へ移動する

問題

VSCodeやeclipseにある、クラス名や関数から定義元を開く機能はvimにはないですか。

答え

ctagsを利用する。

ctags コマンドは、関数の定義元などを解析してインデックス(タグファイル tags)を作成してくれる。vimはこのtagsを利用できる。

インストール

Debian、Ubuntu

apt install universal-ctags    ← こちらを推奨
apt install exuberant-ctags    ← 使えるが開発が2009年で止まっている

CentOS

yum install ctags

ctagsコマンドの設定

exuberant-ctags なら ~/.ctags

universal-ctags なら ~/.config/ctags/*.ctags を作成して、以下のような形で設定(オプション)を書く。

--recurse=yes
--php-kinds=cfd

デフォルトで -R(–recurse=yes 再帰的に)などが指定されていないらしいので、.ctagsで設定するか、都度コマンドラインオプションで指定する。

プログラムの言語、タグにする種別など設定する。--php-kinds=cfd とすると、phpのときclassとfunctionとdefineを拾ってくれる。

対応している言語、kindの確認方法。

ctags --list-kinds

php だとデフォルトで以下が有効。

c  classes
d  constant definitions
f  functions

対応している拡張子は以下で確認可能。

ctags --list-maps

解析不要なファイルは拡張子で除外が可能。

--exclude=*.js
--exclude=*.css

ctagsコマンドの使い方

対象のディレクトリにて以下のコマンドを実行する(~/.ctags の設定が使われる)

ctags

tags というファイルができる。

プログラムや言語、状況に応じて、都度オプションを指定してもよい。

ctags --recurse=yes --php-kinds=cfd --exclude=*.css

vimでtagsファイルを利用する

vimで :set tags コマンドで tags オプションの設定値を確認すると、初期値で ./tags,tags などになっている。

    tags=./tags,./TAGS,tags,TAGS

ctags はデフォルトで tags のファイル名でタグファイルを作ってくれるが、そのままでよいということ。

あえて違うタグファイル名にするなら :set tags=違うファイル名 で指定するとよい。

vimで定義箇所へジャンプ

ここまでくれば後は使うだけ。

:ta      :ta[g][!] {tag}      {tag}で指定したタグにジャンプ
:ta      :[count]ta[g][!]     タグリストの[count]番目に新しいタグにジャンプ
CTRL-]      CTRL-]            変更がされていない限り、カーソル位置にあるタ
                                グにジャンプ
:ts      :ts[elect][!] [tag]  タグに合致する一覧を表示し、ジャンプ先を選択
:tjump   :tj[ump][!] [tag]    指定のタグ [tag] にジャンプ。もし、合致する
                                タグが複数ある時は一覧から選択
:ltag    :lt[ag][!] [tag]     タグ [tag] にジャンプし、マッチしたタグを
                                locationリストに加える

:tags    :tags                タグリストを一覧表示
CTRL-T   N  CTRL-T            タグリストの N 番目に古いタグにジャンプ
:po      :[count]po[p][!]     タグリストの [count] 番目に古いタグにジャンプ
:tnext   :[count]tn[ext][!]   [count] 個分、次のタグにジャンプ
:tp      :[count]tp[revious][!] [count]個分、前のタグにジャンプ
:tr      :[count]tr[ewind][!] [count]番目に一致するタグにジャンプ
:tl      :tl[ast][!]          直前に一致したタグにジャンプ

タグの更新

とりあえず手動で実行すればtagsファイルは更新される。都度 :!ctags で実行してもよい。

自動、半自動、プログラムを書き換えた都度、vimの中から実行などでタグファイルを再構築させたい場合は、ctags関連のプラグインを探すとよい。 → vim-tagsプラグイン

プラグインを使わないでタグを自動更新

phpファイルを保存するたびに ctags コマンドを実行させたい場合、以下のように書ける。

:autocmd BufWritePost *.php silent !ctags

カレントディレクトリにtagsファイルが存在するときに限定してctagsを実行してもらうようにした例。.vimrc に書く。

if filewritable('./tags')
    augroup myautocmd
        autocmd!
        autocmd BufWritePost *.php silent !ctags --recurse=yes &
    augroup END
endif

関連するメモ

コメント