More than 1 year has passed since last update.

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コマンドの引数を記述しておけるので作成しておく。
とりあえず中身はこんな感じにしてみた。

.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]が付いているもの以外のタグが作成される。
variablesjavascript functionsが複数表示されているのが若干の謎だが。

tagsの作成

tagsファイルを自分のHOMEディレクトリ以下にphp.tagsとして作成する。
標準のプロジェクトルートディレクトリに作っても良いが、PEAR等のファイルが入っている別ディレクトリのtagsを一緒にしておく時に個人的にやりやすいという理由でHOMEディレクトリに作成しているので変えても良い。

PHPのみの場合
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