タイトルのとおり、Ctags で Go 言語のタグファイルを生成をする方法についてです (未調査ですが、バージョンによっては対応しているかもしれません)。
なお、Ctags についてはマニュアル ctags(1) をご参照ください。
環境情報
# uname -r 5.12.9-300.fc34.x86_64 # cat /etc/fedora-release Fedora release 34 (Thirty Four) # ctags --version Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert Compiled: Jan 26 2021, 00:00:00 Addresses: <dhiebert@users.sourceforge.net>, http://ctags.sourceforge.net Optional compiled features: +wildcards, +regex
Ctags が Go 言語に未対応か確認
まず、Ctags が Go 言語に対応しているかどうか確認する。対応済みなら以降不要と思います (次は未対応の例)。
# ctags --list-languages | grep -i go
設定方法
未対応なら vim
などで ~/.ctags
にファイルを作成し次の設定を入力します。func
, const
, var
, type
に対応します。
--langdef=Go --langmap=Go:.go --regex-Go=/func([ \t]+\([^)]+\))?[ \t]+([a-zA-Z0-9_]+)/\2/f,func/ --regex-Go=/const[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/c,const/ --regex-Go=/var[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/v,var/ --regex-Go=/type[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/t,type/
保存すると、以下のように設定が反映されているはずです。
# ctags --list-languages | grep -i go Go # ctags --list-kinds ... Go f func c const v var t type
タグファイルの生成
何でも良いので適当に Go 言語のファイル (プロジェクト) を用意して、ctags -R
でタグファイルを生成します。
# git clone https://github.com/golang/go.git # cd go # ctags -R
動作確認
適当に .go
ファイルを開いて定義元へジャンプ出来るか試します。
# vim src/os/signal/signal.go
たとえば、次の []stopping
の stopping
部分にカーソルを合わせて Ctrl + ]
を実行してみます。
var handlers struct { sync.Mutex // Map a channel to the signals that should be sent to it. m map[chan<- os.Signal]*handler // Map a signal to the number of channels receiving it. ref [numSig]int64 // Map channels to signals while the channel is being stopped. // Not a map because entries live here only very briefly. // We need a separate container because we need m to correspond to ref // at all times, and we also need to keep track of the *handler // value for a channel being stopped. See the Stop function. stopping []stopping }
次のように定義元へジャンプできます。
type stopping struct { c chan<- os.Signal h *handler }
余談: 設定内容の理解を深める
設定ファイル (~/.ctags
) の意味は十分に理解できていないので、type
の設定を削除し再び ctags -R
を実行してみる (ジャンプできなくなるはず)。
--langdef=Go
--langmap=Go:.go
--regex-Go=/func([ \t]+\([^)]+\))?[ \t]+([a-zA-Z0-9_]+)/\2/f,func/
--regex-Go=/const[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/c,const/
--regex-Go=/var[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/v,var/
- --regex-Go=/type[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/t,type/
同じように stopping
部分にカーソルを合わせて Ctrl + ]
を実行する。
E257: cstag: tag not found
でジャンプできなかった。
設定ファイルについて十分に理解できてはいないが、目的は果たせたので良しとする。 おそらく今後も使っていくと思うので、機会があれば改善していきたい。