PHPでせめて定義元ぐらいは辿りたいんだけど、Language Serverが使えない、phpcdも使えない、けれど絶対Vim使うってときに、ctagsを使うことにした。他のプラグインとかで何とかなるかもしれないけど、何とかなるって情報が見つけられなかった。
仕方なくctagsでタグを作ってfzf.vimでpreviewを表示させながら選びたい。
どういうことか
こういうファイルがあって、test2()を辿りたい。
caller.php
<?phprequire_once'./functions.php';test2();
functions.php
<?phpfunctiontest1(){echo__FUNCTION__;}functiontest2(){echo__FUNCTION__;}functiontest3(){echo__FUNCTION__;}
どうするか
ひとまずctagsでtagsファイルを作っておく。
$ ls
caller.php functions.php
$ ctags -R# 作る$ ls
caller.php functions.php tags # tagsができあがる$ cat tags # tagsの中身!_TAG_FILE_FORMAT 2 /extended format;--format=1 will not append ;" to lines/
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME Exuberant Ctags //
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
!_TAG_PROGRAM_VERSION 5.8 //
test1 functions.php /^function test1()$/;" f
test2 functions.php /^function test2()$/;" f
test3 functions.php /^function test3()$/;" f
設定
fzf.vimはpreviewを外部から受け取れる。今回はshellScriptを一つ作って、previewに渡す。
/path/to/ctags_preview.sh
#!/usr/bin/env zshNAME=$1FILE=$2#タブに囲まれた3つめの検索パターンの抽出#/^ any $/;" を ^ any $ に置換PATTERN=$(echo$3 | cut-f 3 | sed"s/^\///" | sed-E"s/\/;\".*$//" | sed"s/\"/\\\\\"/g")# 前5行、後5行を表示、-48でgrepしてるのは検索文字列に色をつけるためgrep-B 5 -A 42 --color=never "${PATTERN}"$FILE | grep-48--color=always $NAME
で、~/.vimrcに以下を書き込む。
~/.vimrcか他のconfig
command!-bang Tags
\call fzf#vim#tags(expand('<cword>'),{ \'options': '+i \--exact
\--with-nth 1 \--reverse
\--no-unicode
\--preview "/path/to/ctags_preview.sh {1} {2} {}" \ '
\})
nnoremap <silent><Leader>ft :<C-u>Tags<CR>
こうなる
caller.phpのtest2の上で、ftを押すと、下記のようなプレビューが表示される。(floating windowにしてある)
まぁ……全然完全ではないんだけど……。