3. C のファイルの中の勝手な位置にジャンプ

3.1. ctags

タグというのは、場所の情報を保持する類のものです。これは C 言語 を理解したりそのファイルを編集したりする場合に非常に役立つもの です。またある関数が呼ばれている場所からその定義場所にジャンプ したり、そこから戻ったりする場合にもとても役立ちます。

以下を例にとります。

Figure 6. タグの例

今 foo() を編集中に関数 bar() まで行くとしましょう。さて、bar() が何をしているのかを知るにはタグを利用します。この関数の定義に ジャンプして、それから後で戻ってきます。必要なら bar() の中で 呼んでいる別の関数にジャンプして、戻ってくることもできます。

タグを使うには、最初にすべてのソースファイルで ctags プログラム を実行しなければなりません。このプログラムは tags というファイル を生成します。この tags というファイルにはすべての関数定義を 指しているポインターが入っており、VIMはその関数定義の場所に 行くのにこのファイルを使います。

ジャンプして行き来するのに使う実際のキーストロークは、 CTRL-]CTRL-Tになります。 foo() の中の bar() をコールしている場所で CTRL-] を打つと、カーソルを bar() の最初にもっていきます。 hitting CTRL-T を打てば、 bar() からfoo() へ ジャンプして戻れます。

ctags は次のようにして呼び出します。

	    $ ctags options file(s)
	 

現在のディレクトリにある *.c ファイル全部から tags ファイルを 作る場合、する必要があるのは以下のことだけです。

	    $ ctags *.c
	 

別々のサブディレクトリに C のファイルがあるようなソースツリー の場合には、そのソースツリーの一番上で -R オプションを付けて ctags を呼びます。するとそのソースツリーにあるすべての関数 のタグが入った tags ファイルができます。例えば以下のようにします。

	    $ ctags -R *.c
	 

ctags には他にもたくさんのオプションが使えます。これらの オプションの説明は ctags の man ファイルにあります。

3.2. マーク

マークというのはタグと同じような、場所の情報を保持するものですが、 マークはファイル中のどの場所にでも設定できるし、関数や enum (列挙型)に限定されるものでもありません。さらに、マークは ユーザーが手動で設定しなければなりません。

マークを設定しても、同じものが目に見える形で現れるわけでは ありません。マークというのはVIMが覚えているファイルの中の 場所というだけなのです。次のコードを考えてみます。

Figure 7. マークの例

今 x++; の行を編集中に他の行を編集し、そのあとまたこの行に 戻ってきたいとしましょう。この場合、m' という キーストロークでこの x++; の行にマークを設定できるし、 '' を打てば、後でこの同じ行に戻ってこれます。

VIMではマークは複数設定できます。これらのマークは a-z や A-Z それに 1-0といったレジスタに格納されます。 マークを設定して、その同じものをあるレジスタ、例えば j に 格納するには mj と打てば済みます。この マークに戻ってくるには、 'j と打てば済みます。

複数のマークを使うと、まとまったコードの中で行ったり来たり する際に本当に役立ちます。同じ上記の例を使いましょう。 x++; で 一つマークして、 y=x; でもう一つ、そしてそれらの間をジャンプ したり、あるいは他の場所にジャンプして、それからジャンプして 戻りたいことがあるかもしれません。

マークは複数のファイルにまたがってもかまいません。そういった マークを使うには大文字のレジスタ、つまり A-Z のレジスタを使わ なければなりません。小文字のレジスタはファイルの中だけで使う もので、ファイルをまたがることはありません。言い換えれば、ある foo.c というファイルの中でマークをレジスタ "a" に設定し、それ から別のファイルに移動して 'a と打っても、 カーソルは直前の場所には戻らないのです。別のファイルにカーソル をもっていくようなマークがしたければ、大文字のレジスタを使う 必要があるでしょう。例えば、 ma の代わりに mA を使うんです。複数のファイルを編集するに ついては、後のセクションで論じます。

3.3. gd キーストローク

次のコードのひとまとまりを考えます。

Figure 8. 三番目の例

y と z がなんだったかを、なぜだか忘れてしまい、大至急 それらが定義してある場所に行きたいとします。一つの方法は y とか z を後方検索することです。でもVIMにはもっと簡単で 素早い解決方法があります。gd という キーストロークは "Goto Declaration (宣言へ行く)" の略 になってます。カーソルを "y" において gd と打つと、カーソルをその宣言、つまり struct Y y; にもって いくんです。

gDも似たようなキーストロークです。これは カーソルの位置にある変数をグローバル宣言してある場所まで、 カーソルをもっていきます。だから、 x の宣言に行きたければ、 必要なことは gD と打つだけで、これでカーソル は x の宣言に移動するでしょう。