Next: Outlineマイナーモード, Previous: モードラインのフォーマット, Up: メジャーモードとマイナーモード [Contents][Index]
Imenuとはバッファー内の定義やセクションをすべてリストするメニューをユーザーが選択することによって、バッファー内の該当箇所に直接移動する機能です。Imenuは定義(またはバッファーのその他の名前つき範囲)の名前とその定義のバッファー内での位置をリストするバッファーインデックスを構築して、ユーザーがそれを選択すればポイントをそこに移動できるようにして機能します。メジャーモードはimenu-add-to-menubar
を使用して、メニューバーアイテムを追加することができます。
この関数はImenuを実行するためのnameという名前のローカルメニューバーを定義する。
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は正規表現である(正規表現を参照)。これはバッファー内でこれにマッチするものは定義、あるいはバッファーインデックス内に記載すべき何かであると判断される。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
の値中の正規表現マッチがcase(大文字小文字)を区別するかどうかを制御する。t
(デフォルト)ならcaseの違いを無視することを意味する。
この変数はセットによりカレントバッファーにたいしてバッファーローカルになる。
この変数はimenu-generic-expression
処理中に、カレントバッファーの構文テーブルをオーバーライドするために使用する構文テーブル変更用のalist。このalistの各要素は以下の形式をもつこと:
(characters . syntax-description)
CARのcharactersには文字か文字列を指定できる。この要素はその文字か文字列が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-function
とimenu-extract-index-name-function
があります:
この変数が非nil
なら、その値はポイント位置からバッファーを後方にスキャンしてバッファーインデックスに配置すべき次の定義を探すための関数であること。そしてポイントより前に他の定義が見つからなければnil
をリターンすること。見つかった場合には定義を見つけた場所にポイントを残して任意の非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
を使用する。
この変数はセットによりカレントバッファーにたいしてバッファーローカルになる。
tree-sitterとともにEmacsをビルドしていてメジャーモードが関連する変数をセットしていれば、自動的にImenuのインデックスが生成されます。
これはどのようにImenuインデックスを生成するかをEmacsに指示するための変数である。(category regexp pred name-fn)という形式のリストであること。
categoryは"Function"、"Class"等のようなカテゴリー名、regexpはcategoryに属すノードタイプにマッチするregexp、predはnil
、または引数としてノードを受け取る関数であること。この関数はノードがcategoryにたいして有効なら非nil
、そうでなければnil
をリターンする必要がある。
categoryはnil
でもよく、その場合にはregexpとregexpでマッチされたエントリーはcategory下にグループ化されない。
name-fnはnil
、あるいはdefunノードを受け取りそのdefunの名前(関数定義にたいする関数名)をリターンする関数のいずれかであること。name-fnがnil
の場合には、かわりにtreesit-defun-name
(Tree-sitterとのメジャーモード開発を参照)が使用される。
この変数が非nil
の場合には、treesit-major-mode-setup
(Tree-sitterとのメジャーモード開発を参照)が自動的にImenuをセットアップする。