Imenu
Imenu — это функция, позволяющая пользователям выбирать определение или раздел в буфере из меню со списком всех таких элементов и сразу переходить к соответствующему месту в буфере. Imenu работает, создавая индекс буфера, в котором перечислены имена и позиции в буфере определений или других именованных фрагментов буфера; затем пользователь может выбрать один из них и переместить туда точку. Основные режимы могут добавить пункт в строку меню для использования Imenu с помощью imenu-add-to-menubar.
- Команда: imenu-add-to-menubar name
Эта функция определяет локальный пункт строки меню с именем name для запуска Imenu.
Пользовательские команды для работы с Imenu описаны в руководстве Emacs (см. Imenu в руководстве Emacs). В этом разделе объясняется, как настроить способ поиска определений или фрагментов буфера в Imenu для конкретного основного режима.
Обычно самый простой способ — задать переменную imenu-generic-expression:
- Переменная: imenu-generic-expression
-
Эта переменная, если она не
nil, представляет собой список, задающий регулярные выражения для поиска определений в Imenu. Простые элементыimenu-generic-expressionимеют следующий вид:(menu-title regexp index)
Здесь, если menu-title не равно
nil, совпадения для этого элемента помещаются во вложенное меню индекса буфера; menu-title задаёт имя вложенного меню. Если menu-title равноnil, совпадения для этого элемента помещаются непосредственно на верхний уровень индекса буфера.Второй элемент списка, regexp, — это регулярное выражение (см. Регулярные выражения); всё, что оно находит в буфере, считается определением, то есть элементом, который следует включить в индекс буфера. Третий элемент, index, — это неотрицательное целое число, указывающее, какая подгруппа в regexp соответствует имени определения.
Элемент также может иметь следующий вид:
(menu-title regexp index function arguments...)
Каждое совпадение для этого элемента создаёт элемент индекса, и при его выборе пользователем вызывается function с аргументами, состоящими из имени элемента, позиции в буфере и arguments.
Для режима 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
-
Эта переменная представляет собой alist модификаторов таблицы синтаксиса, используемых при обработке
imenu-generic-expressionдля переопределения таблицы синтаксиса текущего буфера. Каждый элемент должен иметь следующий вид:(characters . syntax-description)
CAR, characters, может быть символом или строкой. Элемент указывает, что этому символу или этим символам следует назначить синтаксис, заданный параметром syntax-description, который передаётся в
modify-syntax-entry(см. Функции таблицы синтаксиса).Эта возможность обычно используется для назначения символьного синтаксиса символам, которые обычно имеют синтаксис символа, что упрощает
imenu-generic-expressionи ускоряет сопоставление. Например, режим Fortran использует её следующим образом:(setq imenu-syntax-alist '(("_$" . "w")))Тогда регулярные выражения
imenu-generic-expressionмогут использовать ‘\\sw+’ вместо ‘\\(\\sw\\|\\s_\\)+’. Обратите внимание, что этот способ может быть неудобен, если режиму нужно ограничить начальный символ имени более узким набором символов, чем тот, который разрешён в остальной части имени.При установке эта переменная становится локальной для текущего буфера.
Другой способ настроить Imenu для основного режима — задать переменные imenu-prev-index-position-function и imenu-extract-index-name-function:
- Переменная: imenu-prev-index-position-function
-
Если эта переменная не равна
nil, её значением должна быть функция, которая находит следующее определение для включения в индекс буфера, просматривая буфер назад от точки. Если до точки не найдено другое определение, функция должна вернутьnil. В противном случае она должна оставить точку в месте найденного определения и вернуть любое значение, не равноеnil.При установке эта переменная становится локальной для текущего буфера.
- Переменная: imenu-extract-index-name-function
-
Если эта переменная не равна
nil, её значением должна быть функция, возвращающая имя определения, при условии, что точка находится в этом определении, как если бы её оставила функцияimenu-prev-index-position-function.При установке эта переменная становится локальной для текущего буфера.
Последний способ настроить Imenu для основного режима — задать переменную imenu-create-index-function:
- Переменная: imenu-create-index-function
-
Эта переменная задаёт функцию, используемую для создания индекса буфера. Функция не должна принимать аргументов и должна возвращать alist индекса для текущего буфера. Она вызывается внутри
save-excursion, поэтому положение точки по её завершении не имеет значения.В alist индекса могут быть элементы трёх типов. Простые элементы имеют следующий вид:
(index-name . index-position)
Выбор простого элемента перемещает курсор в позицию index-position в буфере. Специальные элементы имеют следующий вид:
(index-name index-position function arguments...)
Выбор специального элемента выполняет:
(funcall function index-name index-position arguments...)Вложенный элемент подсписка имеет следующий вид:
(menu-title . sub-alist)
Он создаёт вложенное меню menu-title, заданное параметром sub-alist.
Значение по умолчанию для
imenu-create-index-function—imenu-default-create-index-function. Эта функция вызывает значениеimenu-prev-index-position-functionи значениеimenu-extract-index-name-function, чтобы сформировать alist индекса. Однако, если одна из этих двух переменных равнаnil, функция по умолчанию использует вместо этогоimenu-generic-expression.При установке эта переменная становится локальной для текущего буфера.
Если Emacs собран с поддержкой tree-sitter, он может автоматически создавать индекс Imenu, если основной режим задаёт соответствующие переменные.
- Переменная: treesit-simple-imenu-settings
-
Эта переменная указывает Emacs, как создавать индексы Imenu. Её значением должен быть список (category regexp pred name-fn).
category должно быть именем категории, например «Функция», «Класс» и т. д. regexp должно быть регулярным выражением, соответствующим типу узлов, относящихся к category. pred должно быть либо
nil, либо функцией, принимающей узел в качестве аргумента. Она должна возвращать значение, не равноеnil, если узел подходит для category, и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) автоматически настраивает Imenu, если эта переменная не равнаnil.
- Переменная: treesit-aggregated-simple-imenu-settings
-
Эта переменная позволяет основным режимам настраивать Imenu для нескольких языков. Её значение — alist, сопоставляющий символы языков с настройками Imenu в форме, описанной выше для значения
treesit-simple-imenu-settings.Если эта переменная не равна
nil, она переопределяетtreesit-simple-imenu-settingsпри настройке Imenu.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Imenu.html