GNU GLOBALとは
http://tamacom.com/global-j.html
- ソースコードを快適に読むためのツール
- GPLライセンスのフリーソフトウェア
- 作者は日本人で、日本語の情報も豊富(たぶん)
用語の説明
- コードリーディング(code reading)
- ソースコードを 読むこと。優れたコードを読むことはいい勉強になる。
- ctags
- ソースコードに対する識別子(関数名や変数名など)のタグファイル(インデックス)を作成するツール(外部プログラム)。
基本的にctagsはvi用だが、他のエディタでも使える。
- タグファイル(tag file)
- 変数や関数などの定義と使用箇所を記録しておくファイル。
- タグジャンプ(tag jump)
- タグファイルの内容をもとにファイル名+ 行番号に移動する機能。
インストール
sudo apt install global exuberant-ctags python-pygments
使い方
gtags : 索引(タグファイル)の作成
カレントディレクトリをソースファイルの起点に移して、
gtags -v
global : 索引(タグファイル)を使った検索ツール
global 関数名 関数名 → ソースコード (定義)
wesnoth_main は関数名
global wesnoth_main
global -r 関数名 関数名 → ソースコード (参照)
global -r wesnoth_main
global -f ファイル名 ソースコード → 関数一覧
global -f src/wesnoth.cpp
global -c 関数名の一部 関数名の一部 → 関数一覧
global -c wesnoth
global -g 検索文字列 ソースコードの grep
global -g wesnoth_main
htags : html ァイルを作成する
htags -anfF
エディタからの使用方法
なぜか vim と emacs の説明しかない。
vim の場合
vimからGNU GLOBAL を使うには、gtags.vimというプラグインを使います。
mkdir -p ~/.vim/plugin zcat /usr/share/doc/global/examples/gtags.vim.gz > ~/.vim/plugin/gtags.vim
gtags.vimで使えるようになる機能
- :Gtags 関数名 関数名 → ソースコード(定義)
- :Gtags -r 関数名 関数名 → ソースコード(参照)
- :Gtags -f ファイル名 ソースコード → 関数一覧
- :Gtags -g 検索文字列 ソースコードの grep
設定ファイル ~/.vimrcの設定例
nmap <C-g> :Gtags -g nmap <C-l> :Gtags -f %<CR> nmap <C-j> :Gtags <C-r><C-w><CR> nmap <C-k> :Gtags -r <C-r><C-w><CR> nmap <C-n> :cn<CR> nmap <C-p> :cp<CR>
- Ctrl-g ソースコードの grep
- Ctrl-l このファイルの関数一覧
- Ctrl-j カーソル以下の定義元を探す
- Ctrl-k カーソル以下の使用箇所を探す
- Ctrl-n 次の検索結果へジャンプする
- Ctrl-p 前の検索結果へジャンプする
emacs の場合
emacsからGNU GLOBAL を使うには、gtags.el というelispファイルが必要です。
パッケージからインストールした場合、すでに
/usr/share/emacs/site-lisp/global/gtags.el
に配置されるので特に作業は不要です。
gtags.elで使えるようになる機能
- gtags-find-tag 関数の定義場所の検索
- gtags-find-rtag 関数や使用箇所の検索
- gtags-find-symbol 変数の使用箇所の検索
- gtags-pop-stack タグジャンプした箇所からひとつ戻ります
設定ファイル ~/.emacs の設定例
(autoload 'gtags-mode "gtags" "" t) (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 "\C-t" 'gtags-pop-stack) )) (add-hook 'c-mode-common-hook '(lambda() (gtags-mode 1) (gtags-make-complete-list) ))
- Meta-t 関数の定義場所の検索
- Meta-r 関数や使用箇所の検索
- Meta-s 変数の使用箇所の検索
- Ctrl-t タグジャンプした箇所からひとつ戻ります
(Metaキーは通常はALTキーのこと)