このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

GNU Global

使い方


$ cd src-of-FOO
$ gtags -vw
[Thu Dec 03 20:04:19 東京 (標準時) 2015] Gtags started.
Using default configuration.
[Thu Dec 03 20:04:19 東京 (標準時) 2015] Creating 'GTAGS' and 'GRTAGS'.
[1] extracting tags of ...
[2] extracting tags of ...

...

[24] extracting tags of ...
[Thu Dec 03 20:04:19 東京 (標準時) 2015] Done.

$ ls G*
GPATH GRTAGS GTAGS

$

生成されるG*ファイルはバイナリ


$ htags -sanovw

... イッパイ色々

[21/24] converting ...
[22/24] converting ...
[23/24] converting ...
[24/24] converting ...
[Thu Dec 03 20:07:28 東京 (標準時) 2015] Done.

$ ls HTML
./ FILEMAP R/ defines/ files.html mains.html
../ I/ S/ defines.html help.html rebuild.sh*
D/ J/ Y/ files/ index.html style.css

$ s HTML/index.html

$

これでHTMLでソースを見られる。コマンドのヘルプは、--helpまたは-h。

設定ファイル
  • ~/.globalrc
プラグイン

global-pygments-plugin を使うと、Python, Pygmentsで拡張できる。だが、とりあえずは必要ない。必要になったらPygmentsプラグインを入れよう。

emacs helm

help-Gtags-Mode については、

先ほどphp-modeとruby-modeにhelm-gtags-modeをホークしたので、Rubyファイルを開くと自動でhelm-gtags-modeが起動します。

ホークって何だ? hook、フックだろうね。

M-x el-get-list-packagesでhelm-gtagsを探してインストールはした。そのとき次の警告。

Warning (el-get): The package `helm' has already been loaded by
package.el, attempting to load el-get version instead. To avoid
this warning either uninstall one of the el-get or package.el
version of helm, or call `el-get' before `package-initialize' to
prevent package.el from loading it.

el-getとpackage.elでパッケージが重複しているようだ。ウーン、この問題があるのがイヤだなー。package.elをやめるか。

上記の記事からスニペットは、

(add-hook 'helm-gtags-mode-hook
'(lambda ()
;;入力されたタグの定義元へジャンプ
(local-set-key (kbd "M-t") 'helm-gtags-find-tag)

;;入力タグを参照する場所へジャンプ
(local-set-key (kbd "M-r") 'helm-gtags-find-rtag)  

;;入力したシンボルを参照する場所へジャンプ
(local-set-key (kbd "M-s") 'helm-gtags-find-symbol)

;;タグ一覧からタグを選択し, その定義元にジャンプする
(local-set-key (kbd "M-l") 'helm-gtags-select)

;;ジャンプ前の場所に戻る
(local-set-key (kbd "C-t") 'helm-gtags-pop-stack)))

(add-hook 'php-mode-hook 'helm-gtags-mode)
(add-hook 'ruby-mode-hook 'helm-gtags-mode)

プログラミング言語xxxのモードの xxx-mode-hook に 'helm-gtags-mode を add-hookすればいいのか。すると、helm-gtags-modeが起動する。このときのフックとしてさらにローカルキーバインディングを設定する、と。C++なら、(add-hook 'c++-mode-hook 'helm-gtags-mode) 。

しかし、キーバインディングがかぶっている! ローカルだから上書きってことか?

(add-hook 'helm-gtags-mode-hook
'(lambda ()
;;入力されたタグの定義元へジャンプ
(local-set-key (kbd "M-t") 'helm-gtags-find-tag); transpose-words

;;入力タグを参照する場所へジャンプ
(local-set-key (kbd "M-r") 'helm-gtags-find-rtag)  ; move-to-window-line-top-bottom

;;入力したシンボルを参照する場所へジャンプ
(local-set-key (kbd "M-s") 'helm-gtags-find-symbol) ; prefix key

;;タグ一覧からタグを選択し, その定義元にジャンプする
(local-set-key (kbd "M-l") 'helm-gtags-select) ;  downcase-word

;;ジャンプ前の場所に戻る
(local-set-key (kbd "C-t") 'helm-gtags-pop-stack) ;transpose-chars
)) 

かぶらないキーバインディングの一例。

(add-hook 'helm-gtags-mode-hook
'(lambda ()
;;入力されたタグの定義元へジャンプ
(local-set-key (kbd "C-c C-t") 'helm-gtags-find-tag);

;;入力タグを参照する場所へジャンプ
(local-set-key (kbd "C-c C-r") 'helm-gtags-find-rtag)

;;入力したシンボルを参照する場所へジャンプ
(local-set-key (kbd "C-c C-s") 'helm-gtags-find-symbol)
;;タグ一覧からタグを選択し, その定義元にジャンプする
(local-set-key (kbd "C-c C-l") 'helm-gtags-select)

;;ジャンプ前の場所に戻る
(local-set-key (kbd "C-c C-p") 'helm-gtags-pop-stack)))