Help us understand the problem. What is going on with this article?

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

soramugi
自己紹介を設定してみる!
http://soramugi.net/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away