Hatena::ブログ(Diary)

Guyon Diary このページをアンテナに追加 RSSフィード

2012-01-14

Vimでソースコードを素早く追いかける

| 22:52 | Vimでソースコードを素早く追いかけるを含むブックマーク

Vim Advent Calender 2011 45日目の記事です。今回のテーマはソースコードを素早く追いかけるです。

Vimをお使いの皆さんは設定ファイルや文書作成以外にもソースコードを作成・メンテ・閲覧などに利用されている事と思います。

そこで、ソースコードを追いかける時に便利なプラグインをご紹介したいと思います。なお、この記事は過去に私が書いたエントリーを再構成した内容となっています。

追いかけるソースコードを用意する

まずは、追いかけたいソースコードを用意しましょう。例としてあげるソースコードVimで世界的に有名なc9sさんが作った、巷で話題のRubyのBundler(やVimのVundle)ライクなPHP版Onionです。

$ git clone https://github.com/c9s/Onion.git
cd ./Onion

プラグインを設定する

Source Explorerというプラグインを導入してみましょう。概要は以下の通りです。

The plugin (srcexpl.vim) is a source code explorer based on tags and it provides an overview of the function and type definitions.It has such a mechannism that works like the context window component of "Source Insight" software.

If you have used Source Insight for browseing C/C++/Java project before, you may find that you can browse the definitions with the Source Explorer as well as the context window of "Source Insight".

tagsを利用したソースコード閲覧・移動補助してくれます。

以前に紹介した時点ではVersion 2.3でしたが現在では4.3になり、trinity.vimというプラグインを使う事でUIが使いやすくなっています。

下記のプラグインをruntimeパスのとおったpluginディレクトリに入れましょう。

runtimeパスの確認の方法はコマンドラインモードで

set runtimepath?

通常は下記ディレクトリに「srcexpl.vim」と「trinity.vim」と「NERD_tree.vim」と「taglist.vim」を放り込めばOKです。

~/.vim/plugin/
ctags

Source Explorerはctagsというソースコード関数変数情報などをインデックス化する外部プログラムを利用します。また、Mac OS XではデフォルトインストールされているもののExuberant Ctags という拡張されたctagsではない為、macportsなどでExuberant Ctagsをインストールしておきましょう。Windowsの方はKaoriyaさん配布のvimを使っている人がほとんどだと思います。Kaoriyaさんのその他コーナーでリンクされているこちらのExuberant Ctags対応ctagsをダウンロードしパスを通しておきましょう。*1

[yuki@beaune.local]$ port info ctags
Warning: port definitions are more than two weeks old, consider using selfupdate
ctags @5.8 (devel)
Variants:             universal

Description:          Exuberant Ctags generates an index (or tag) file of source language objects in source files that allows
                      these items to be quickly and easily located by a text editor or other utility. Alternatively, it can
                      generate a cross reference file which lists, in human-readable form, information about the various objects
                      found in a set of source code files. Supported languages include: Assembler, AWK, ASP, BETA,
                      Bourne/Korn/Zsh Shell, C, C++, COBOL, Eiffel, Fortran, Java, Lisp, Lua, Make, Pascal, Perl, PHP, Python,
                      REXX, Ruby, S-Lang, Scheme, Tcl, Vim and Yacc.
Homepage:             http://ctags.sourceforge.net/

Platforms:            darwin, freebsd
License:              GPLv2
Maintainers:          mww@macports.org, openmaintainer@macports.org

[yuki@beaune.local]$ sudo port install ctags

起動方法

コマンドラインモードで下記コマンドを実行します。

:TrinityToggleAll

tagsが存在しない場合は作成するかどうかを聞いてくるのでyesを選択します。

実行すると左にtaglistを使った変数メソッドなどのアウトライン、右にファイラー、真ん中にソースコード、下にソースエクスプローラーが表示されます。

それぞれをToggleするコマンドも用意されています。


" +----------------------------------------------------------------------------+
" | File | Edit | Tools | Syntax | Buffers | Window | Help |                   |
" +----------------------------------------------------------------------------+
" |-demo.c-------- |-----------------------------------------|-/home/myprj/----|
" |function        | 1 void foo(void)     /* function 1 */   ||~ src/          |
" |  foo           | 2 {                                     || `-demo.c       |
" |  bar           | 3 }                                     |`-tags           |
" |                | 4 void bar(void)     /* function 2 */   |                 |
" |~ +----------+  | 5 {                                     |~ +-----------+  |
" |~ | Tag List |\ | 6 }                                     |~ | NERD Tree |\ |
" |~ +__________+ ||~        +-----------------+             |~ +___________+ ||
" |~ \___________\||~        | The Main Editor |\            |~ \____________\||
" |~               |~        +_________________+ |           |~                |
" |~               |~        \__________________\|           |~                |
" |~               |~                                        |~                |
" |-__Tag_List__---|-demo.c----------------------------------|-_NERD_tree_-----|
" |Source Explorer V4.3                                                        |
" |~                              +-----------------+                          |
" |~                              | Source Explorer |\                         |
" |~                              +_________________+ |                        |
" |~                              \__________________\|                        |
" |-Source_Explorer[Preview]---------------------------------------------------|
" |:TrinityToggleAll                                                           |
" +----------------------------------------------------------------------------+

操作方法

<C-W>HやLなどでWindowを移動して3つのWindowごとの機能を素早く切り替えられるUIになっています。実際に操作してみるとわかるのですがとても使い勝手がよいことがわかります。

Source Explorerはカーソル下にある変数メソッドの宣言やコール元のソース情報を自動で表示してくれます。もし、コール元が複数ある場合はリストで表示されるのでWindow移動して対象業でEnterを押せばジャンプできます。ジャンプや戻ったりするのも自分好みのキーを割り当てる事ができるようになっているので、設定をカスタマイズしたい場合はSource Explorerソースコード(srcexpl.vim)ヘッダ部分を参照してみるとよいでしょう。

画面キャプチャ

f:id:guyon:20120114224034p:image

メソッドの宣言を自動で表示

f:id:guyon:20120114224035p:image

コール元のソース情報一覧を自動で表示

f:id:guyon:20120114224036p:image

マウスでも操作できる!えッ?

最後に

アウトライン表示や宣言へのジャンプ機能などEclipseなどのIDEではできて当たり前の感覚ですが、Vimでもソースコードを参照する時にオペレータやgfやGrep他等のvim基本機能に加え、今回紹介した様なプラグインを使う事で軽快にソースコードを徘徊・把握ができるようになるのではないでしょうか。個人的には移動や表示する時の感覚が大事で「ホイホイ」と軽快に移動できると気持ちがいいですね!

まだまだVim Advent Calendar 2011は続くようです。明日のVimmerへパスします。

*1Vimと同じディレクトリに置けばよかったのかな?