コーディング/コードリーティングには関数ジャンプが必須です。 今回はEmacsで関数ジャンプ(タグジャンプ)を利用するための拡張や設定について自分のためにまとめておきます。
結果的に global (gtags) と helm-gtags に落ち着きました。
global (gtags)
特徴
2017年10月現在,対応言語は以下とされています(公式サイト)。
- C
- C++
- Yacc
- Java
- PHP4
- アセンブリ
追加の拡張によりさらに25言語に対応可能だそうですが、今のところC/C++でのみ使う予定なので、そちらは試していません。
関数などの定義元だけでなく、参照元へのジャンプも可能です。
インストール
OSでglobalをインストール。これでタグの生成が可能となります。
$ sudo apt install global
Emacsでの使用
Emacsで使用するためのパッケージはいろいろあるのですが、今回はhelm-gtags(GitHub)を使用します。 コマンドがかなり充実しているのと、検索結果のバッファでの表示などがわかりやすいです。
Emacsでpackageをインストール。
M-x package-install [RET] helm-gtags [RET]
init.elに以下を記載。
(require 'helm-gtags)
(helm-gtags-mode t)
以下を記述することでバッファの保存に連動してタグを自動的にアップデートすることも可能です。
(setq helm-gtags-auto-update t)
日本語の公式サイトは情報が古いようで、コマンドの数が少ないです。GitHubのReadmeを参考にしながら今回は以下のように設定。
(setq helm-gtags-mode-hook
'(lambda ()
(local-unset-key "\C-t")
; 文脈から判断してジャンプ
(local-set-key "\C-t\C-t" 'helm-gtags-dwim)
; 定義元へ
(local-set-key "\C-t\C-d" 'helm-gtags-find-tag)
; 参照元へ
(local-set-key "\C-t\C-r" 'helm-gtags-find-rtag)
; 変数の定義元/参照先へ
(local-set-key "\C-t\C-s" 'helm-gtags-find-symbol)
; 前のバッファへ
(local-set-key "\C-t\C-p" 'helm-gtags-previous-history)
; 次のバッファへ
(local-set-key "\C-t\C-n" 'helm-gtags-next-history)
; ファイルへ
(local-set-key "\C-t\C-f" 'helm-gtags-find-file)
))
helm-gtags-find-tag
では毎回検索するタグを聞かれますが、helm-gtags-find-tag-from-here
ならばカーソル上の単語ですぐに検索してくれます。
また、find-tag、find-rtag、find-file を毎回使い分けずとも、helm-gtags-dwim
を使えば、カーソル上の単語が何かによって自動的に検索対象を判別してくれます。
- インクルード文の場合、ヘッダファイルに移動
- 参照の場合、定義に移動
- 定義の場合、参照に移動
このような便利なコマンドが多く実装されており非常に使い勝手がよいです。
ctags (Exuberant ctags)
特徴
特徴としては対応言語が多いという点が挙げられます。 公式サイトの対応言語のページでは2017年10月現在で41言語をサポートしているようです。
あとは生成されるファイルがTAGSだけでスッキリしています。
少し使ってみましたが、前述したgtagsの方が機能が充実しており、特にctagsでは参照元へのジャンプができないという点から、今回は使用を見送りました。
インストール
OSで Exuberant ctags をインストール。これでタグの生成が可能となります。
$ sudo apt install exuberant-ctags
Emacsでの使用
Emacsでpackageをインストール。
M-x package-install [RET] ctags [RET]
init.elに以下を記載。
(require 'ctags)
タグの自動アップデートのためのctags-updateというパッケージもあります。
M-x package-install [RET] ctags-update [RET]
(require 'ctags-update)
(ctags-auto-update-mode t)