次: , 前: Mode Line Format, 上: Modes


22.4 iメニュー

iメニュー(Imenu)とは、ユーザーが バッファ内の定義や節の一覧からその1つを選ぶと バッファ内の当該箇所へ直接移動できる機能です。 iメニューは、 バッファ内の定義や部分の名前や位置を表すバッファインデックスを 構築しておくことで動作し、 当該箇所へ移動するためにユーザーがそれらの1つを選べるようにします。 本節ではメジャーモードに対するiメニューをカスタマイズする方法を説明します。

普通のもっとも単純な方法は、 変数imenu-generic-expressionに設定することです。

— 変数: imenu-generic-expression

この変数がnil以外であると、 iメニュー向けの定義を探すための正規表現を指定する。 もっとも単純な場合、要素はつぎのような形である。

          (menu-title regexp subexp)
     

ここで、menu-titlenil以外であると、 この要素に一致したものはバッファインデックスのサブメニューに置くことを 意味する。 menu-title自体はサブメニューの名前を指定する。 menu-titlenilであると、 この要素に一致したものはバッファインデックスのメニューに直接置かれる。

リストの2番目の要素regexpは正規表現 (see Regular Expressions)であり、 これに一致した箇所がバッファインデックスに現れる定義になる。 3番目の要素subexpは、 定義の名前に一致するregexpの部分式である。

要素はつぎの形でもよい。

          (menu-title regexp index function arguments...)
     

この要素に一致するものは、バッファインデックスの特別な項目になり、 ユーザーが当該項目を選ぶと、 item-name、バッファ位置、argumentsを引数として functionを呼び出す。

emacs-lispモード向けには、patternはつぎのようになる。

          ((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))
     

この変数に設定すると、 カレントバッファにおいてバッファローカルな変数になる。

— 変数: imenu-case-fold-search

この変数は、imenu-generic-expressionとの一致に際して 大文字小文字を区別するかどうかを制御する。 デフォルトはtであり、大文字小文字を区別せずに一致をとる。

この変数に設定すると、 カレントバッファにおいてバッファローカルな変数になる。

— 変数: imenu-syntax-alist

この変数は、imenu-generic-expressionを処理中に カレントバッファの構文テーブルに優先する 構文テーブルの変更部分の連想リストである。 各要素はつぎの形であること。

          (characters . syntax-description)
     

carcharactersは、文字か文字列である。 それらの文字は、指定した構文syntax-descriptionであることを意味する。 これはmodify-syntax-entry(see Syntax Table Functions)に 渡される。

この機能は典型的には、 通常のシンボル構成文字を単語構成文字として扱い、 imenu-generic-expressionを単純化し一致処理を速くする。 たとえば、fortranモードではつぎのように使っている。

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

こうすると、imenu-generic-expressionのパターンでは、 `\\(\\sw\\|\\s_\\)+'のかわりに`\\sw+'を使える。 この技法は、名前の先頭文字の集合を名前の残りの文字の集合よりも 小さく制限する必要があるモードで使うには不便であることに注意してほしい。

この変数に設定すると、 カレントバッファにおいてバッファローカルな変数になる。

メジャーモードのiメニューをカスタマイズする別の方法は、 変数imenu-prev-index-position-functionimenu-extract-index-name-functionに設定することです。

— 変数: imenu-prev-index-position-function

この変数がnil以外であると、その値は、 バッファインデックスに置くつぎの定義を ファイルで後向きに探すための関数であること。

その関数は、バッファインデックスの項目に対応する箇所にポイントを置くこと。 項目がみつからなければnilを返すこと。

この変数に設定すると、 カレントバッファにおいてバッファローカルな変数になる。

— 変数: imenu-extract-index-name-function

この関数がnil以外であると、その値は、 ポイントが変数imenu-prev-index-position-functionが返した 定義の部分にあると仮定して、当該定義の名前を返す関数であること。

この変数に設定すると、 カレントバッファにおいてバッファローカルな変数になる。

メジャーモードのiメニューをカスタマイズする最後の方法は、 変数imenu-create-index-functionに設定することです。

— 変数: imenu-create-index-function

この関数は、バッファインデックスの作成に使う関数を指定する。 その関数は引数なしで、カレントバッファに対するインデックスを返すこと。 save-excursionの内側から呼ばれるので、 その関数がポイントをどこに置こうと関係ない。

デフォルト値は、インデックスの連想リストを生成するために imenu-generic-expressionを使う関数である。 読者が別の関数を指定すれば、imenu-generic-expressionは使われない。

この変数に設定すると、 カレントバッファにおいてバッファローカルな変数になる。

— 変数: imenu-index-alist

この変数は、カレントバッファに対するインデックスの連想リストを保持する。 この変数に設定すると、 カレントバッファにおいてバッファローカルな変数になる。

連想リストの単純な要素は(index-name . index-position) のような形である。 このような単純な要素を選ぶと、 バッファ内でindex-positionへ移動する効果がある。

特別な要素は(index-name position function arguments...)のような形である。 このような特別な要素を選ぶと、 つぎのようなフォームを実行する。

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

入れ子になった部分連想リストの要素は (index-name sub-alist)のような形である。