Vim
ctags

ctagsをちゃんと使う

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に下記を追加


.vimrc

" 拡張子で読み込みタグ変更                                                      

au BufNewFile,BufRead *.php set tags+=$HOME/php.tags

これでtagsが作成された。


vimを開いてる時にtagsの追加

コードをもりもり書いていると新しく宣言されたclass等のtagを作成しなければならない。いちいちvimを終了してctagsコマンドを打つのも面倒なのでプラグインを入れる。

例えばvim-tagsとか

neobundle.vim使っているのなら以下で入る。


.vimrc

NeoBundle 'szw/vim-tags'


.vimrcに以下を記述


.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候補に飛んでしまって気づかない事があるのでキーバインドを少し変えている


.vimrc

" 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