Next: Which Functionモード, Previous: センテンスの移動, Up: トップレベルの定義、またはdefun [Contents][Index]
Imenu機能は、ファイル内の主要な定義を、名前で検索する方法を提供します。これはプログラミング言語向けのモードで変数や関数等、チャプター、セクションなどを扱うテキストフォーマッターのためのメジャーモードでも有用です(複数ファイルを扱う、より強力な機能については、識別子のリファレンスを探すを参照してください)。
M-g i
(imenu
)をタイプするとミニバッファーを用いて定義の名前を読み取り、ポイントをその定義に移動します。このコマンドでは名前の指定には補完を使うことができ、マッチした有効な名前を補完バッファーに表示します。階層的なインデックスにたいしては、デフォルトでは補完候補も入れ子になった階層的なリストとして表示されます。つまりまずセクション、次にサブセクションと選んでいき、最後に定義名を選ぶ必要があるのです。しかしimenu-flatten
に非nil
値をセットすれば、入れ子になったメニューではなく平坦な定義リストから補完候補を選ぶことができます。平坦な補完候補リストにおいてセクションやサブセクションがどのように表示されるかは、imenu-flatten
の値次第です。以下からいずれかの値を指定できます:
prefix
候補のプレフィックスとしてその候補のセクション、サブセクション等の名前を表示します。階層と次の階層を区切る文字列にはimenu-level-separator
の値が使用されます(デフォルトは‘:’)。
annotation
後に定義名をともなう注釈としてセクション名を表示します。
group
セクションでグループ化して補完候補を表示します。
かわりに、コマンドimenu
をマウスクリックにバインドできます。そうすると定義名を選択するために、マウスメニューが表示されます。imenu-add-menubar-index
を呼び出して、バッファーのインデックスをメニューバーに追加することもできます。特定のメジャーモードのすべてのバッファーにたいして、このメニューバーアイテムを有効にしたい場合、モードフックにimenu-add-menubar-index
を追加して、これを行うことができます。しかし、それを行うことにより、そのモードでファイルをvisitするたびに、Emacsがそのバッファーのすべての定義を検索する間、待つ必要があります。
バッファーの内容を変更する際、定義の追加や削除をした場合は、メニューの‘*Rescan*’アイテムを呼び出すことにより、新しい内容にもとづいてバッファーのインデックスを更新することができます。imenu-auto-rescan
を非nil
値にセットした場合、再スキャンは自動的に発生します。テキストを少量変更しただけの場合、再スキャンは必要ありません。
imenu-auto-rescan
はバイト数がimenu-auto-rescan-maxout
より大きいバッファーでは無効になり、スキャンがimenu-max-index-time
秒を超えるようなら停止されるでしょう。
変数imenu-sort-function
をセットして、メニューがソートされる方法をカスタマイズすることができます。デフォルトでは、名前はバッファーで出現する順にソートされています。アルファベット順にソートしたいときは、値にシンボルimenu--sort-by-name
を使用します。Lispコードを記述することにより、独自の比較関数を定義することもできます。
変数completion-category-overrides
を変更して、カテゴリーimenu
向けのdisplay-sort-function
をセットすれば、Imenuの補完候補のソートもカスタマイズできます。
カレントバッファーのプロジェクト(プロジェクトで作業するを参照)とメジャーモードにたいしてEglotがアクティブであれば、Eglotはバッファーのインデックスを生成するための独自機能を提供します。これはカレントバッファーを管理している言語サーバー(language-server)によるプログラムのソース解析にもとづいた機能です。Eglot Features in Eglot: The Emacs LSP Clientを参照してください。
ImenuはWhich Functionモードに情報を提供します (Which Functionモードを参照してください)。 Speedbarもこれを使用します(スピードバーフレームを参照してください)。