xyzzyでGNU GLOBAL

移植です。

比較的大規模なソースを追いかけるとき、
xyzzy付属のXTAGSでは、変数の定義元へタグジャンプできないなどの
不満があります。

そこで、超便利なソースコードタグシステムである
GNU GLOBALというツールがあります。
EmacsやVimでは普通に使えるんですが、
xyzzyでは誰も移植されていなく使用できませんでした。
そこで、bulbがgtags.elをxyzzy-lispにしてみました(へなちょこな移植ですが orz)。

まだ、全機能を移植したわけではありませんが、基本機能は移植してあります。というわけでまだα版です。
また、雄猫さんのEmacs Lisp移植キットを利用させて頂きました。
ありがとうございます。

■ダウンロード

gtags-20060813.zip

gtags-20050905.zip

gtags.l 20051109版[190clicks]
gtags.l 20050905版[36clicks]
gtags.l[18clicks]

■インストール
●1
gtagsフォルダごとsite-lispフォルダにコピーして下さい。

●2
当ファイルの他にGNU GLOBALのインストールが必要です。
Emacs電子書棚さんが参考になります。
↑に置いてあるglobal-4.6.lzhを解凍して、
PATHが通っているフォルダに置いてください。

また、cygwinをインストールしてあれば、
最新版のGNU GLOBALをコンパイルして使用することもできますが、Win32版を持ってきた方がGTAGSのタグ生成が断然速いです。

■初期設定
下記を.xyzzyかsiteinit.lに記述します。

;;; Emacs Lisp 移植キット
(require "elisp")

;;; gtags-mode
(in-package "editor")
(setq *gtags-mode-hook*
      #'(lambda ()
          (local-set-key #M-t 'gtags-find-tag)
          (local-set-key #M-r 'gtags-find-rtag)
          (local-set-key #M-s 'gtags-find-symbol)
          (local-set-key #M-e 'gtags-find-tag-from-here)
          ;(local-set-key #M-a 'gtags-pop-stack)
          (local-set-key #C-t 'gtags-pop-stack)
          (local-set-key #M-j 'gtags-find-with-grep)
          (local-set-key #M-c 'gtags-find-file-ext)
          (local-set-key #M-n 'gtags-find-next-tag)
          (local-set-key #M-p 'gtags-find-previous-tag)
          ))

(setq *gtags-select-mode-hook*
      #'(lambda ()
          (local-set-key #M-a 'gtags-pop-stack)
          (local-set-key #PageUp 'previous-page-kept-selection)
          (local-set-key #PageDown 'next-page-kept-selection)
          (local-set-key #LBtnDown 'gtags-mouse-left-press)
          (local-set-key #M-n #'(lambda ()
                                   (interactive)
                                   (next-virtual-line)
                                   (gtags-select-tag)))
          (local-set-key #M-p #'(lambda ()
                                   (interactive)
                                   (previous-virtual-line)
                                   (gtags-select-tag)))
          ))

(add-hook '*c-mode-hook*
          #'(lambda ()
              (gtags-mode 1)
              ;(gtags-make-complete-list);未対応
              ))
(add-hook '*c++-mode-hook*
          #'(lambda ()
              (gtags-mode 1)))
(add-hook '*php-mode-hook*
          #'(lambda ()
              (gtags-mode 1)))
(in-package "user")

■使い方
●1
GTAGSの生成方法(コマンドライン)
タグを作りたいソースディレクトリに移動
> cd sourceGTAGSを生成
> gtags -v

xyzzyからは、C-x & としてから gtags で生成することができます。
ファイラーでやる場合、好きなディレクトリに移動し、F3を押してgtags -vというやり方もあります。ソース規模にもよりますが、時間がかかります…

GNU GLOBALの便利なところは、更新したソースだけTAGファイルを作り直すところです。
やり方は、
% global -u

●2
M-tで、関数の定義元へ移動
M-rで、関数を参照元の一覧を表示。RET で参照元へジャンプ
M-sで、変数の定義元と参照元の一覧を表示。RET で該当箇所へジャンプ
C-tで、前のバッファへ戻る


About this entry