【Linux】【emacs】Emacs で gtags を使う【SW】

Emacs で gtags を使うための設定
  

 

概要

gtags は高精度のタグジャンプファイル。Emacs付属の etags は貧弱なので gtags を使う。
gtags-pop-stack は M-a としている。(個人的に前後の文字の入れ替えとして、C-t を頻繁に使うため)
 

機能

ソースコード全体を grep 検索 [gtags-find-with-grep]

  • M-x gtags-find-with-grep
    • 私は M-l を割り当てた。

 

複数のデータベースファイルを切り替える

GLOBAL の仕様として、GTAGS, GRTAGS, GPATH が置かれているディレクトリに移動してからタグジャンプしないといけない。
つまり、etags のような M-x visit-tags-table がない。そこで、こちらのサイト様の elisp を使わせてもらう。
 

GLOBAL の導入

 

gtags.el を展開する

% wget  tamacom.com/global/global-6.5.5.tar.gz
% mkdir $HOME/.emacs.d/global/
% cp ./global-6.5.5/gtags.el  $HOME/.emacs.d/global/

 

.emacs の設定

$HOME/.emacs

  • $HOME/.emacs.d/global/gtags.el を配置した
  • gtags の切り替えについては以下のようにしている。
    • Emacs 25.1.1 では setnu-mode が無いといったエラーが出たので無効にしている。
    • F10 にトリガーキーを変えた
(add-to-list 'load-path "~/.emacs.d/gtags")
(require 'gtags)
(add-hook 'c-mode-common-hook 'gtags-mode)
(add-hook 'c++-mode-hook 'gtags-mode)
(add-hook 'java-mode-hook 'gtags-mode)

(setq gtags-path-style 'relative)             ;相対パス表示にする
(global-set-key "\M-t" 'gtags-find-tag)       ;関数の定義場所の検索
(global-set-key "\M-r" 'gtags-find-rtag)      ;関数や使用箇所の検索
(global-set-key "\M-s" 'gtags-find-symbol)    ;変数の使用箇所の検索
(global-set-key "\M-a" 'gtags-pop-stack)      ;タグジャンプした箇所からひとつ戻る
(global-set-key "\M-l" 'gtags-find-with-grep) ;タグファイルを検索する
(setq view-read-only t)  ; 読み込み専用バッファを自動的にview-modeにする
(setq gtags-read-only t) ; 上と合わせることで、タグジャンプ先をview-modeにする。

;; http://d.hatena.ne.jp/kyagi/20080226/1204034637 より、タグファイルの切り替えをする。
;; 個人的な設定として、本家の「F12」キーから「F10」に変更した。
;;; ** gtags-mode
(global-set-key "\M-." 'gtags-find-tag)
(autoload 'gtags-find-tag "gtags" "" t)
(autoload 'gtags-mode "gtags" "" t)
;(add-hook 'gtags-mode-hook 'setnu-mode)

(setq my-gtags-tag-table-alist
	  '(
                ("local-c" . "/home/neko/local/src/c")
                ("local-cpp" . "/home/neko/local/src/cpp")
	   ))

(defun my-gtags-show-tag-table-alist ()
  (split-window-vertically)
  (other-window 1)
  (switch-to-buffer "*my-gtags-show-tag-table-alist*")
  (let ((n 1) (tag-table) (tag-table-alist))
	(setq tag-table-alist my-gtags-tag-table-alist)
	(while tag-table-alist
	  (setq tag-table (car tag-table-alist))
	  (insert (format "%d %s\n" n (car tag-table)))
	  (setq tag-table-alist (cdr tag-table-alist))
	  (setq n (1+ n)))))

(defun my-gtags-hide-tag-table-alist ()
  (kill-buffer "*my-gtags-show-tag-table-alist*")
  (other-window 1)
  (delete-other-windows))

(defun my-gtags-select-tag-table ()
  (interactive)
  (gtags-mode t)
  (my-gtags-show-tag-table-alist)
  (let ((n 0) (answer) (tag-table) (tag-table-alist))
	(setq tag-table-alist my-gtags-tag-table-alist)
	(setq answer (read-from-minibuffer "which tag table do you want to use?:"))
	(setq answer (string-to-number answer))
	(while (not (= n answer))
	  (setq tag-table (car tag-table-alist))
	  (setq tag-table-alist (cdr tag-table-alist))
	  (setq n (1+ n)))
	(setq-default gtags-rootdir (cdr tag-table)))
  (my-gtags-hide-tag-table-alist)
  (cd gtags-rootdir))

(global-set-key [f10] 'my-gtags-select-tag-table)

 

参考にした情報

複数のタグテーブルを切り替え - 8tree にっき

  • gtags のデータベースファイル(タグファイル)を複数使うための設定 (素晴らしい!)