Emacsでタグジャンプ
いまだに 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 checkout
や git 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
定義元に飛びたいときボクは dumb-jump.el を使ってます
これ、TAGS を用意したかどうかや TAGS が古いままだとか気にしなくていいので楽ですよ
あとどこで使われているかを探すときは単に helm-ag.el を使ったりしてます
ありがとうございます! dump-jump.el の存在を知らなかったので調べてみます!