Next: , Previous: , Up: メジャーモードとマイナーモード   [Contents][Index]


24.5 Imenu

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

Command: imenu-add-to-menubar name

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

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は正規表現である(正規表現を参照)。これはバッファー内でこれにマッチするものは定義、あるいはバッファーインデックス内に記載すべき何かであると判断される。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の値中の正規表現マッチがcase(大文字小文字)を区別するかどうかを制御する。t(デフォルト)ならcaseの違いを無視することを意味する。

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

Variable: imenu-syntax-alist

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

(characters . syntax-description)

CARcharactersには文字か文字列を指定できる。この要素はその文字か文字列がsyntax-descriptionにより指定される構文であることを示し、modify-syntax-entryに渡される(構文テーブルの関数を参照)。

典型的にはこの機能はシンボル構文(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をリターンすること。見つかった場合には定義を見つけた場所にポイントを残して任意の非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を使用する。

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

tree-sitterとともにEmacsをビルドしていてメジャーモードが関連する変数をセットしていれば、自動的にImenuのインデックスが生成されます。

Variable: treesit-simple-imenu-settings

これはどのようにImenuインデックスを生成するかをEmacsに指示するための変数である。(category regexp pred name-fn)という形式のリストであること。

categoryは"Function"、"Class"等のようなカテゴリー名、regexpcategoryに属すノードタイプにマッチするregexp、prednil、または引数としてノードを受け取る関数であること。この関数はノードがcategoryにたいして有効なら非nil、そうでなければnilをリターンする必要がある。

categorynilでもよく、その場合にはregexpregexpでマッチされたエントリーはcategory下にグループ化されない。

name-fnnil、あるいはdefunノードを受け取りそのdefunの名前(関数定義にたいする関数名)をリターンする関数のいずれかであること。name-fnnilの場合には、かわりにtreesit-defun-name (tree-sitterを用いるメジャーモードの開発を参照)が使用される。

この変数が非nilの場合には、treesit-major-mode-setup (tree-sitterを用いるメジャーモードの開発を参照)が自動的にImenuをセットアップする。