GNU GLOBALをCentOS6にインストール&簡単な使い方メモ
GNU GLOBALについて
単純なvimとかでプログラムのソースを見ている場合、コード量が膨大だとコードが読み難いです。
なんか良いの無いかなと探してみたところ、GNU GLOBALのプラグインをvimに導入すれば、指定した関数の記述箇所に飛んだりできるそうです。便利そうなのでインストールしてとりあえず使ってみました。
https://www.gnu.org/software/global/
GNU GLOBALインストール(CentOS6.5で実施)
下記の通り実施インストールしていきます。
# wget http://tamacom.com/global/global-6.5.4.tar.gz # tar xzf global-6.5.4.tar.gz # cd global-6.5.4 ;pwd # ./configure # make # make install
無事インストールできていればgtagコマンドが使用できる用になっているはずです。
次に、vimプラグインをコピーし、vimでGNU GLOBALを使用できるようにすれば設定完了です。
# mkdir -p ~/.vim/plugin # cp -ip /usr/local/share/gtags/gtags.vim ~/.vim/plugin
以上でインストール完了です。
GNU GLOBAL使い方
今回は例としてLinuxのカーネルソースを見ていきます。
適当なkernelソースをダウンロード&展開していきます。
# wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.tar.gz # tar xfz linux-2.6.39.tar.gz
GNU GLOBALを使うには、まず見たいコードの解析をしてタグをつける必要があります。
タグをつけるにはgtagsコマンドを実行してタグ付けをします。gtagsコマンドを実行するとGPATH、GTAGS、GRTAGS、GSYMS ファイルが作成されます。
# cd linux-2.6.39;pwd # gtags
タグをつけたら、適当に見たいソースをvimで開いてみます。
今回はsignal.cを開いてみます。
# vim kernel/signal.c
例としてsignal.cの中に記述されている下記do_tkill関数を見てみます。
▼signal.cのdo_tkill関数 static int do_tkill(pid_t tgid, pid_t pid, int sig) { struct siginfo info; info.si_signo = sig; info.si_errno = 0; info.si_code = SI_TKILL; info.si_pid = task_tgid_vnr(current); info.si_uid = current_uid(); return do_send_specific(tgid, pid, sig, &info); }
この中で実行しているtask_tgid_vnr関数の定義元を見たい場合は、vim上で下記コマンドを実行すると関数が記述してある箇所に飛ぶことができます。ファイルを跨いでの移動も可能です。
:Gtags task_tgid_vnr
また、下記Gtagsの-rオプションをvimで実行することで、do_tkillを呼び出している関数一覧がQuickFixListに表示できます。
:Gtags -r do_tkill
QuickFixListのウィンドウに移動したいときは下記方法で次のウィンドウへ移動するか、:qで一旦ファイル編集を抜ければファイル編集が終了し、QuickFixListのみが残りカーソル移動できます。
CTRL-W w ([Ctrl]押しながら[w]を押した後、もう1回[w]を押す)
QuickFixListウィンドウに移動後、QuickFixListの関数一覧から、見たい関数にカーソルを合わせてEnterを押すと、その関数が記述されている場所に移動することができます。
QuickFixListを閉じたいときは:ccl or :ccloseです。
※QuickFixについての詳しい操作方法は下記URLを参照して下さい。
http://vim-jp.org/vimdoc-ja/quickfix.html
ソースコード全体を検索して一覧を出したいときには下記を実行するとできます。
:Gtags -g 検索したい文字列
指定したファイルの関数一覧を表示したい場合は下記を実行します。
:Gtags -f kernel/signal.c
また、GNU GLOBALをインストールすると、globalコマンドが使用できるようになります。
globalコマンドの使い方
globalコマンドも事前にgtagsコマンドでソースを解析して、タグ付けをしておく必要があります。
指定したソースファイル(signal.c)の関数一覧を表示。
# global -f kernel/signal.c
指定した関数がどのファイルで定義されているかの一覧を表示。
# global do_tkill kernel/signal.c #
指定した関数を呼び出している一覧を表示。
# global -rx do_tkill
ソース全体を検索。
# global -gx 検索したい文字列
終わりに
今回GNU GLOBALをvimに導入し、Linuxカーネルのソースを少しのぞいてみました。
指定した関数に飛ぶ機能(ファイル間を跨いでも可能)や、関数を呼び出している一覧を表示することができるなど、ぱっと見た感じコードを見るときに必要な機能は揃っていると感じました。よさそうなのでしばらく使ってみたいと思います。