my_knowledge.ko

Linux | Debug, Analyze, Trace | Tech | etc...

Ctags で Go 言語 (.go) のタグファイルを生成する方法

タイトルのとおり、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

たとえば、次の []stoppingstopping 部分にカーソルを合わせて 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 + ] を実行する。

f:id:Kernel_OGSun:20210910213705p:plain

E257: cstag: tag not found でジャンプできなかった。

設定ファイルについて十分に理解できてはいないが、目的は果たせたので良しとする。 おそらく今後も使っていくと思うので、機会があれば改善していきたい。

参考