最終更新日 2002/08/23(Fri)

タグジャンプで関数の定義にジャンプ


タグジャンプとは

タグジャンプとは、 関数や定数の定義している場所に一気にジャンプする便利な機能です。 ソースファイルを見ていると、 「この関数の定義はどうなってたっけ?」とか、 「この定数の値は何だ」ということが良くあります。
同じファイルの中ならば、 比較的簡単にサーチで定義を見付け出して移動できることもあります。 しかし、複数ある他のファイルのどこかにあるということならばと探すのも面倒です。 それに単純なサーチでは関数の呼び出しと宣言と定義を区別することができません。

タグジャンプは、 事前に関数等の定義されている位置を示すインデックスファイルを作成しておいて、 必要なときにその情報を元に定義にジャンプすることができます。
タグジャンプにより、かなりプログラミングが楽になると思いますので、 是非試してみてください。

タグファイルを作成する

タグジャンプを行なうには事前にタグファイルを作成する必要があります。 タグファイルを作成するコマンドは Meadow / Emacs に添付されている etags です。

実行は簡単で、引数にソースファイルを指定するだけです。

etags foo.cpp bar.cpp zot.cpp common.h

タグファイルのデフォルト名は TAGS になります。 -o オプションを指定すれば、 タグファイルのファイル名を他のものに変更することができます。

etags -o MY_TAGS foo.cpp bar.cpp zot.cpp common.h

タグジャンプで関数の定義にジャンプする

タグジャンプは M-. (M-x find-tag) で実行します。 タグの名前を聞かれるので、 ジャンプしたい関数名を入力します。 次にタグファイルの場所を入力すると、 目的の関数までジャンプします。 なお、タグファイルの入力は最初のジャンプのときだけで、 2 回目以降のジャンプからは最初に指定したタグファイルが使用されます。

なお、タグのデフォルト値は、 現在カーソルのある位置から単語を切り出したものが使用されます。 ですので、関数の呼び出し位置にカーソルを置いているときには、 M-. RET でその関数の定義に移動することができます。

例えば、以下のように関数名 function_to_jump_to の上にカーソルがあるときには、 デフォルトがこの関数名になります。

void foo(int a)
{
  int b = function_to_jump_to();
}

この状態ならば、 M-. RETfunction_to_jump_to の定義に移動します。

int function_to_jump_to()
{
  return bar() + zot();
}

ジャンプする前の位置に戻る

ジャンプできるのは便利ですが、 ジャンプして内容を確認したら元に戻りたくなるのが人情です。 1 回ジャンプしたぐらいならば元に戻るのもそれほど面倒ではないのですが、 タグジャンプを何度も繰り返してソースの追っかけをしてしまうと、 元に戻るのが大変です。

ジャンプする操作があれば、当然戻るための操作も用意されています。 元に戻るには M-* (M-x pop-tag-mark) を使用します。

ジャンプの履歴はスタック状に格納されているので、 M-* を繰り返すと、 糸を手繰るように戻っていきます。

同じ名前の関数が複数あったら?

言語の仕様にもよるのですが、 同じ名前の関数が複数存在することは往々にしてありうることです。 そのような場合にはどうやって目的の関数にジャンプすることができるのでしょうか?

そのような場合には、C-u M-.を使います。 以下のように同名の別の関数のジャンプしてしまった場合には、

// 目的の関数とは違う(;_;)
static int function_to_jump_to()
{
  return foo() + zot();
}

C-u M-. で次の候補にジャンプします。

// 目的の関数\(^o^)/
static int function_to_jump_to()
{
  return bar() + zot();
}

C-u M-. を繰り返して実行すると、 候補があるかぎりジャンプしていきます。 行き過ぎてしまった場合には、 C-u - M-. で前の候補にジャンプします。

ジャンプ以外の効用

タグジャンプ以外にもタグファイルを用いて次のようなことができます。

複数ファイルをサーチ

tags-search を使用すれば、 TAGS ファイルに登録されているファイル全てに対して検索が行なわれます。 M-,(tags-loop-continue) で次の検索候補を表示します。

複数ファイルで置換

tags-query-replace を使用すれば、 TAGS ファイルに登録されているファイル全てに関して置換を行ないます。

置換候補を検索すると、実際に置換するかどうか尋ねてくるので、 以下のキーで処理を決定します。

表. 置換時の操作
キー操作
y 置換を実行し、次の候補へ移動する
n 置換を実行せず、次の候補へ移動する
q or RET 置換を実行せず、次の候補に移動せず終了
. 置換を実行して、次の候補に移動せず終了
? 置換操作のヘルプ