Next: Font Lock Mode, Previous: Mode Line Format, Up: Modes [Contents][Index]
Imenuとは、バッファー内の定義やセクションをすべてリストするメニューをユーザー選択することにより、バッファー内の該当箇所に直接移動する機能です。Imenuは、定義(またはバッファーのその他の名前つき範囲)の名前とその定義のバッファー内での位置をリストする、バッファーインデックスを構築して、ユーザーがそれを選択すればポイントをおこに移動できるようにして機能します。メジャーモードは、imenu-add-to-menubar
を使用して、メニューバーアイテムを追加することができます。
この関数は、nameという名前のImenuを実行するためのローカルメニューバーを定義する。
Imenuを使用ためのユーザーレベルコマンドは、Emacsマニュアル内で説明されています(Imenu in the Emacs Manualを参照)。このセクションでは、特定のメジャーモードにたいして、定義や名前つき範囲を見つける、Imenuメソッドのカスタマイズ方法を説明します。
変数imenu-generic-expression
をセットするのが通常の、そしてもっともシンプルな方法です:
この変数が非nil
の場合、それはImenuにたいして定義を探すための正規表現を指定するリストである。シンプルなimenu-generic-expression
の要素は、以下のようになる:
(menu-title regexp index)
ここで、menu-titleが非nil
の場合、それはこの要素にたいするマッチが、バッファーインデックスのサブメニューとなることを告げる。menu-title自体は、そのサブメニューにたいして名前を指定する。menu-titleがnil
,の場合は、この要素にたいするマッチは、直接トップレベルのバッファーインデックスとなる。
このリストの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))
この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。
この変数は、imenu-generic-expression
の値中の正規表現マッチが、大文字小文字を区別するかどうかを制御する。t
,(デフォルト)の場合は、大文字小文字の違いを無視することを意味する。
この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。
この変数は、imenu-generic-expression
処理中に、カレントバッファーの構文テーブルをオーバーライドして使用する、構文テーブル変更用のalistである。このalistの各要素は、以下の形式をもつべきである:
(characters . syntax-description)
CARのcharactersには、文字または文字列を指定できる。この要素は、その文字、または文字列が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-function
とimenu-extract-index-name-function
があります:
この変数が非nil
の場合、その値はポイント位置からバッファーを後方にスキャンして、バッファーインデックスに配すべき、次の“定義”を探すための関数であること。そして、ポイントより前に他の“定義”が見つからなければ、nil
をリターンすべきである。見つかった場合は、“definition”を見つけた場所にポイントを残し、任意の非nil
値をリターンすべきである。
この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。
この変数が非nil
の場合、その値はポイントが定義中にある(imenu-prev-index-position-function
関数がポイントを残す場所)という想定の元、その定義の名前をリターンする関数であること。
この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。
メジャーモードにたいしてImenuをカスタマイズするための最後の方法は、変数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
を使用する。
この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。