Next: , Previous: , Up: Modes   [Contents][Index]


22.5 Imenu

Imenuとは、バッファー内の定義やセクションをすべてリストするメニューをユーザー選択することにより、バッファー内の該当箇所に直接移動する機能です。Imenuは、定義(またはバッファーのその他の名前つき範囲)の名前とその定義のバッファー内での位置をリストする、バッファーインデックスを構築して、ユーザーがそれを選択すればポイントをおこに移動できるようにして機能します。メジャーモードは、imenu-add-to-menubarを使用して、メニューバーアイテムを追加することができます。

Command: imenu-add-to-menubar name

この関数は、nameという名前のImenuを実行するためのローカルメニューバーを定義する。

Imenuを使用ためのユーザーレベルコマンドは、Emacsマニュアル内で説明されています(Imenu in the Emacs Manualを参照)。このセクションでは、特定のメジャーモードにたいして、定義や名前つき範囲を見つける、Imenuメソッドのカスタマイズ方法を説明します。

変数imenu-generic-expressionをセットするのが通常の、そしてもっともシンプルな方法です:

Variable: imenu-generic-expression

この変数が非nilの場合、それはImenuにたいして定義を探すための正規表現を指定するリストである。シンプルなimenu-generic-expressionの要素は、以下のようになる:

(menu-title regexp index)

ここで、menu-titleが非nilの場合、それはこの要素にたいするマッチが、バッファーインデックスのサブメニューとなることを告げる。menu-title自体は、そのサブメニューにたいして名前を指定する。menu-titlenil,の場合は、この要素にたいするマッチは、直接トップレベルのバッファーインデックスとなる。

このリストの2つ目の要素regexpは、正規表現である(Regular Expressionsを参照)。これは、バッファー内でこれにマッチするものは定義、あるいはバッファーインデックス内に記載すべき何かであると判断される。3つ目の要素indexは、0以上の整数の場合は、regexp内の部分式(subexpression)が定義名にマッチすることを示します。

以下のような要素もある:

(menu-title regexp index function arguments…)

この要素にたいする各マッチはインデックスアイテムを作成し、ユーザーによりそのインデックスアイテムが選択されたとき、アイテム名、バッファー位置、およびargumentsから構成される引数で、functionを呼び出す。

Emacs Lispモードにたいしては、imenu-generic-expressionは以下のようになるだろう:

((nil "^\\s-*(def\\(un\\|subst\\|macro\\|advice\\)\
\\s-+\\([-A-Za-z0-9+]+\\)" 2)
 ("*Vars*" "^\\s-*(def\\(var\\|const\\)\
\\s-+\\([-A-Za-z0-9+]+\\)" 2)
 ("*Types*"
  "^\\s-*\
(def\\(type\\|struct\\|class\\|ine-condition\\)\
\\s-+\\([-A-Za-z0-9+]+\\)" 2))

この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。

Variable: imenu-case-fold-search

この変数は、imenu-generic-expressionの値中の正規表現マッチが、大文字小文字を区別するかどうかを制御する。t,(デフォルト)の場合は、大文字小文字の違いを無視することを意味する。

この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。

Variable: imenu-syntax-alist

この変数は、imenu-generic-expression処理中に、カレントバッファーの構文テーブルをオーバーライドして使用する、構文テーブル変更用のalistである。このalistの各要素は、以下の形式をもつべきである:

(characters . syntax-description)

CARcharactersには、文字または文字列を指定できる。この要素は、その文字、または文字列がsyntax-descriptionにより指定される構文でありことを示し、modify-syntax-entryに渡される(Syntax Table Functionsを参照)。

典型的には、この機能は通常はシンボル構文(symbol syntax)をもつ文字にたいして単語構文(word syntax)を与えるために使用され、それによりimenu-generic-expressionが単純になり、マッチングのスピードも向上する。たとえば、Fortranモードは以下のようにこれを使用する:

(setq imenu-syntax-alist '(("_$" . "w")))

imenu-generic-expressionの正規表現は、‘\\(\\sw\\|\\s_\\)+’のかわりに、‘\\sw+’を使用できる。このテクニックは、モードの名前として許されるより短い、頭文字に名前を制限する必要があるときは、不便かもしれないことに注意されたい。

この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。

あるメジャーモードにたいしてImenuをカスタマイズする別の方法には、imenu-prev-index-position-functionimenu-extract-index-name-functionがあります:

Variable: imenu-prev-index-position-function

この変数が非nilの場合、その値はポイント位置からバッファーを後方にスキャンして、バッファーインデックスに配すべき、次の“定義”を探すための関数であること。そして、ポイントより前に他の“定義”が見つからなければ、nilをリターンすべきである。見つかった場合は、“definition”を見つけた場所にポイントを残し、任意の非nil値をリターンすべきである。

この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。

Variable: imenu-extract-index-name-function

この変数が非nilの場合、その値はポイントが定義中にある(imenu-prev-index-position-function関数がポイントを残す場所)という想定の元、その定義の名前をリターンする関数であること。

この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。

メジャーモードにたいしてImenuをカスタマイズするための最後の方法は、変数imenu-create-index-functionのセットです:

Variable: imenu-create-index-function

この変数は、バッファーインデックスを作成するために使用する関数を指定する。この関数は、引数がをとらず、カレントバッファーにたいするインデックスalist(index alist)をリターンすべきである。この関数はsave-excursion内で呼び出されるので、どこにポイントを残しても違いはない。

このインデックスalistは、3つのタイプの要素をもつことができる。以下は、シンプル要素(simple element)の例である:

(index-name . index-position)

シンプル要素の選択は、そのバッファー内の位置index-positionに移動する効果をもつ。スペシャル要素(special element)は、以下のようなものである:

(index-name index-position function arguments…)

スペシャル要素の選択により、以下が処理される:

(funcall function
         index-name index-position arguments…)

ネストされたサブalist要素(nested sub-alist element)は、以下のようなものである:

(menu-title . sub-alist)

これは、sub-alistにより指定される、サブメニューmenu-titleを作成する。

imenu-create-index-functionのデフォルト値は、imenu-default-create-index-functionである。この関数は、インデックスalistを生成するために、imenu-prev-index-position-functionの値と、imenu-extract-index-name-functionの値を呼び出す。しかし、これら2つ変数のいずれかがnilの場合、デフォルト関数はかわりにimenu-generic-expressionを使用する。

この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。