GNU GLOBAL を使ったコードリーディング

Last-modified: 2017-05-04 (木) 13:42:21

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キーのこと)