Emacsとglobalとhelm-gtagsでコードリーディング

コーディング/コードリーティングには関数ジャンプが必須です。 今回は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)
最終更新 2024-01-13

広告

本記事はお役に立てたでしょうか。本ブログでは匿名でのコメントや少額から(15円~)の寄付などを受け付けております。もしお役に立てたのであればご支援いただけると大変励みになります。

Built with Hugo
テーマ StackJimmy によって設計されています。