GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Imenu.html ・ emacs-doc.conao3.com

24.5 Imenu

Imenuは、バッファ内のすべての定義やセクションを一覧表示するメニューから項目を選択することで、バッファ内のその位置へ直接移動できる機能です。Imenuは、定義やその他の名前付きバッファ領域の名称とバッファ上の位置をリスト化したバッファインデックスを構築することで動作し、ユーザーはその中から一つを選択してポイントを移動させることができます。メジャーモードでは、imenu-add-to-menubarを使用してImenuを利用するためのメニューバー項目を追加できます。

コマンド: imenu-add-to-menubar name

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

Imenuを使用するためのユーザーレベルコマンドについては、Emacsマニュアルに記載されています(EmacsマニュアルのImenuを参照してください)。本節では、特定のメジャーモードにおける定義やバッファ部分の検索方法をImenuでカスタマイズする方法を解説します。

一般的かつ最も簡単な方法は、変数 imenu-generic-expression を設定することです:

変数: imenu-generic-expression

この変数が nil 以外の場合、Imenu の定義を検索するための正規表現を指定するリストとなります。imenu-generic-expression の単純な要素は次のようになります。

(menu-title regexp index)

ここでは、menu-title が nil 以外の場合、この要素のマッチ結果はバッファインデックスのサブメニューに配置されることを示しており、menu-title 自体がそのサブメニューの名前を指定します。menu-title が nil の場合、この要素のマッチ結果はバッファインデックスの最上位レベルに直接配置されます。

リストの2番目の項目 regexp は正規表現(正規表現を参照)であり、バッファ内でこれに一致するものはすべて定義とみなされ、バッファインデックスに記載すべき内容となります。3番目の項目 index は非負整数で、regexp のどの部分式が定義名に一致するかを示します。

要素は次のような見た目になることもあります:

(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-case-fold-search

この変数は、imenu-generic-expression の値に含まれる正規表現によるマッチングを大文字小文字を区別するかどうかを制御します。デフォルトの t は、大文字小文字を区別せずにマッチングすることを意味します。

この変数を設定すると、現在のバッファ内でバッファローカルになります。

変数: imenu-syntax-alist

この変数は、imenu-generic-expression の処理中に使用し、現在のバッファの構文テーブルを上書きするための構文テーブル修飾子のalistです。各要素は以下の形式である必要があります:

(characters . syntax-description)

CAR, characters は、文字または文字列のいずれかになります。この要素は、その文字または複数の文字に syntax-description で指定された構文を適用するように指示しており、その構文は modify-syntax-entry に渡されます(構文テーブル関数を参照)。

この機能は通常、通常は記号構文を持つ文字に単語構文を付与し、それによって 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 を設定することです:

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

この変数が nil 以外の場合、その値は、point からバッファを逆方向に走査し、バッファインデックスに格納する次の定義を探す関数である必要があります。point より前に別の定義が見つからない場合は、nil を返す必要があります。それ以外の場合は、定義が見つかった位置に point を保持し、nil 以外の任意の値を返す必要があります。

この変数を設定すると、現在のバッファ内でバッファローカルになります。

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

この変数が nil 以外の場合、その値は、point が imenu-prev-index-position-function 関数の挙動通りにその定義内にあると想定して、定義名を返す関数である必要があります。

この変数を設定すると、現在のバッファ内でバッファローカルになります。

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

変数: imenu-create-index-function

この変数は、バッファインデックスの作成に使用する関数を指定します。この関数は引数を取らず、現在のバッファのインデックスalistを返す必要があります。この関数はsave-excursion内で呼び出されるため、ポイントをどこに残すかは問いません。

インデックスのalistには、3種類の要素が含まれます。単純な要素は次のようになります。

(index-name . index-position)

単純な要素を選択すると、バッファ内の位置 index-position に移動します。特殊な要素は以下のようになります。

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

特殊な要素を選択すると、以下が実行されます:

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

ネストされたサブalist要素は、次のような形式になります:

(menu-title . sub-alist)

sub-alist で指定されたサブメニュー menu-title を作成します。

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

この変数を設定すると、現在のバッファ内でバッファローカルになります。

Tree-sitterでビルドした場合、メジャーモードが関連する変数を設定していれば、EmacsはImenuインデックスを自動的に生成できます。

変数: treesit-simple-imenu-settings

この変数は、EmacsにImenuインデックスの生成方法を指示します。(category regexp pred name-fn) のリストである必要があります。

category は "Function" や "Class" などのカテゴリ名である必要があります。regexp は category に属するノードの型に一致する正規表現である必要があります。pred は nil か、ノードを引数として受け取る関数である必要があります。ノードが category の有効なノードであれば non-nil を、そうでなければ nil を返す必要があります。

category は nil である場合もあり、その場合、regexp と pred に一致するエントリは category の下にまとめられません。

name-fn は、nil か、あるいは defun ノードを受け取り、その defun の名前(例えば関数定義の関数名)を返す関数のいずれかである必要があります。name-fn が nil である場合は、代わりに treesit-defun-name(Tree-sitter によるメジャーモードの開発 を参照)が使用されます。

treesit-major-mode-setup(Tree-sitterによるメジャーモードの開発を参照)この変数がnil以外の場合、Imenuが自動的にセットアップされます。

変数: treesit-aggregated-simple-imenu-settings

この変数を使用すると、メジャーモードが複数の言語向けにImenuを設定できるようになります。その値は、言語シンボルを、treesit-simple-imenu-settingsの値について前述した形式のImenu設定にマッピングするalistです。

この変数が nil 以外の場合、Imenu の設定において treesit-simple-imenu-settings を上書きします。