🐃

Emacsでタグジャンプ

2022/03/06に公開2

いまだに Emacs を使ってるんだけど、タグジャンプ機能をまともに使えるようにしたのでメモ。

今までは全体がだいたい頭に入ってるような環境で開発してたのであまり必要なかったんだけど、最近全容がよくわかってない環境で開発してて、タグジャンプ機能が使えるようになった方が便利かな…と。

最初 ctags を使ってみたんだけど、TAGS ファイルが一つしかないというのが前提になってるぽくて、複数のプロジェクト(Git リポジトリ)を跨いでいろいろやってるときに不便だった。

ググってみたら GNU Global というのを使うのが良さそうだった。
あと、Pygments を入れると Ruby を Global から使えるらしい。

インストール&設定

Ubuntu だと

apt install gloabl python3-pygments

MacOS だと

brew install global
brew install pygments

Global が Pygments を使うように設定。

/etc/gtags/gtags.conf~/.globalrc にコピーして、

default:\
	:tc=native:

default:\
	:tc=pygments-parser:tc=htags:

に変更。

これで gtags コマンドを実行すると、配下のコードを解析して GTAGS, GRTAGS, GPATH ファイルを作ってくれる。各ファイルの役割は知らない。

Git でこれらが管理対象になると邪魔なので無視するようにする。

~/.gitconfig

[core]
        excludesfile = ~/.gitexcludes

~/.gitexcludes

GPATH
GRTAGS
GTAGS

git checkoutgit merge, git pull 時に自動でタグファイルが更新されるように各リポジトリで、

.git/hooks/post-checkout

#!/bin/sh
gtags -i

.git/hooks/post-merge

#!/bin/sh
gtags -i

ファイルを更新したときにも更新されるようにした方がいい気がするけど、まあとりあえずはいいかな。

Emacs で使う

Gnu Global にも gtags.el がついてるけど、ggtags というのを使ってみた。

package-list-packages から ggtags をインストール。

.rb ファイルを開いて M-x ggtags-mode を実行。

クラス名やメソッド名の上で M-. を押すと Ggtags Navigation モードになり、*ggtags-global* バッファが開く。カーソルはクラスやメソッドの定義元に移動する。

この状態で M-p, M-n*ggtags-global* バッファ内を前後できる。

RET を押すとカーソル位置はそのまま Ggtags Navigation モードを抜ける。
M-, を押すと最初に M-. を押したバッファ位置に戻ってから Ggtags Navigation モードを抜ける。

まあまあ便利。M-x grep よりはマシ。


しかしタグジャンプできるようになっても、字句的に同じ名前を見つけてるだけなので、別のクラスに同名メソッドがあっても区別はできない。

あと Rails は暗黙に定義されるメソッドが多くてつらい。

まあそろそろ RubyMine を使うようにした方がいいのかもしれないな…。

Discussion

megetonmegeton

定義元に飛びたいときボクは dumb-jump.el を使ってます
これ、TAGS を用意したかどうかや TAGS が古いままだとか気にしなくていいので楽ですよ
あとどこで使われているかを探すときは単に helm-ag.el を使ったりしてます