vimでクラスの宣言元にジャンプするために必要なtagsファイル、それを作るのがctagsコマンド。
プロジェクトのルートディレクトリから
ctags -R
をすればルートディレクトリにtagsファイルが作られていい感じにジャンプしてくれるのですが、tagが宣言されていないクラスがあったり(ctagsのバージョンを上げたら解決)したのでこの際とばかりにちゃんと使うために設定を調べてみた。
##ctagsのバージョンを上げる
まず普段開発をしている環境がcentOS5系で、ctagsのバージョンが5.6だったのでとりあえず上げる。
mkdir -p $HOME/local/bin
mkdir -p $HOME/local/src
cd $HOME/local/src/
wget http://prdownloads.sourceforge.net/ctags/ctags-5.8.tar.gz
tar zxf ctags-5.8.tar.gz
cd ctags-5.8
./configure --prefix=$HOME/local
make
sudo make install
これで自分のローカル環境にctagsの5.8が入った。$HOME/local/bin
にパスを張っておく。
5.6ではtags内に宣言されなかった関数も5.8にしたら宣言されていた。
.ctagsファイルを作る
ctagsのmanを見ると$HOME/.ctags
にctagsコマンドの引数を記述しておけるので作成しておく。
とりあえず中身はこんな感じにしてみた。
--append=yes
--recurse=yes
--langmap=PHP:+.inc
--php-kinds=cfd
--append=yes
tagsファイルがあれば追加する
--recurse=yes
再起的に処理する(-Rと同じ)
--langmap=PHP:+.inc
言語に対する対応する拡張子の追加(この場合は.incファイルをPHPとしてtagsを作る)
--php-kinds=cfd
言語に対してタグの作成するものを指定(この場合はphpの場合はクラス、関数、定数のタグのみの作成)
設定項目の確認
拡張子追加やタグの作成基準を確認することが出来る。
ctags --list-maps
…
PHP *.php *.php3 *.phtml *.inc
…
記述した.incが入っている事がわかる
$ ctags --list-kinds=php
c classes
i interfaces [off]
d constant definitions
f functions
v variables [off]
v variables [off]
j javascript functions [off]
j javascript functions [off]
j javascript functions [off]
[off]
が付いているもの以外のタグが作成される。
variables
やjavascript functions
が複数表示されているのが若干の謎だが。
tagsの作成
tagsファイルを自分のHOMEディレクトリ以下にphp.tags
として作成する。
標準のプロジェクトルートディレクトリに作っても良いが、PEAR等のファイルが入っている別ディレクトリのtagsを一緒にしておく時に個人的にやりやすいという理由でHOMEディレクトリに作成しているので変えても良い。
ctags --languages=php -f ~/php.tags `pwd`
-f
指定で作成されるパスと名前を変更、この時にpwd
指定でタグのパスを絶対パスに変えないと自分のHOMEディレクトリに置いてもtagsが機能しない。
PEARディレクトリに移動して同じコマンドを打てばtagが追加される。
.vimrcに下記を追加
" 拡張子で読み込みタグ変更
au BufNewFile,BufRead *.php set tags+=$HOME/php.tags
これでtagsが作成された。
vimを開いてる時にtagsの追加
コードをもりもり書いていると新しく宣言されたclass等のtagを作成しなければならない。いちいちvimを終了してctagsコマンドを打つのも面倒なのでプラグインを入れる。
例えばvim-tagsとか
neobundle.vim使っているのなら以下で入る。
NeoBundle 'szw/vim-tags'
.vimrcに以下を記述
" vim-tags
au BufNewFile,BufRead *.php let g:vim_tags_project_tags_command = "ctags --languages=php -f ~/php.tags `pwd` 2>/dev/null &"
これでコードをもりもり書いている時にたまに
:TagsGenerate
を打ってやればtagsが更新される。
ちなみにtagジャンプの時に複数タグがあっても第1候補に飛んでしまって気づかない事があるのでキーバインドを少し変えている
" tagsジャンプの時に複数ある時は一覧表示
nnoremap <C-]> g<C-]>
これで快適。
参考:
http://www.asahi-net.or.jp/~wv7y-kmr/memo/vim_php.html#ctags
http://blog.naberon.jp/post/2010/09/27/ctags_setting/?utm_source=2010-09-27&utm_medium=old_blog&utm_campaign=MoveSite
http://labs.timedia.co.jp/2010/12/codereading-with-ctags-on-vim.html
http://hp.vector.co.jp/authors/VA025040/ctags/help_j.html