Дополнительные пункты меню
Пункт меню расширенного формата — более гибкая и чистая альтернатива простому формату. Вы определяете тип события со связью, которая представляет собой список, начинающийся с символа menu-item. Для невыбираемой строки привязка выглядит так:
(menu-item item-name)
Строка, начинающаяся с двух или более дефисов, определяет разделительную линию; см. Разделители меню.
Чтобы определить реальный пункт меню, который можно выбрать, привязка расширенного формата выглядит так:
(menu-item item-name real-binding
. item-property-list)
Здесь item-name — выражение, которое вычисляет строку пункта меню. Таким образом, строка необязательно должна быть константой.
Третий элемент real-binding может быть командой для выполнения (в этом случае вы получаете обычный пункт меню). Он также может быть мапой клавиш, что приведет к появлению подменю, и item-name используется в качестве имени подменю. Наконец, он может быть nil, в результате чего вы получите невыбираемый пункт меню. Это в основном полезно при создании разделительных линий и тому подобном.
Хвост списка item-property-list имеет вид списка свойств, содержащего другую информацию.
Вот таблица поддерживаемых свойств:
:enable form-
Результат вычисления form определяет, активирован ли элемент (не-
nilозначает да). Если элемент не активирован, на него нельзя нажать. :visible form-
Результат вычисления form определяет, должен ли элемент фактически отображаться в меню (не-
nilозначает да). Если элемент не отображается, то меню отображается так, как если бы этот элемент вообще не был определен. :help help-
Значение этого свойства help задает строку вывода справки для отображения, когда указатель мыши находится на этом элементе. Она отображается так же, как и
help-echoтекстовые свойства (см. Отображение справки). Обратите внимание, что это должна быть константная строка, в отличие от свойстваhelp-echoдля текста и наложений. :button (type . selected)-
Это свойство предоставляет способ определения радиокнопок и переключателей. CAR, type, указывает какой: он должен быть
:toggleили:radio. CDR, selected, должно быть выражение; результат его вычисления указывает, выбрана ли эта кнопка в данный момент.Переключатель — это элемент меню, который помечен как включенный или выключенный в зависимости от значения selected. Сама команда должна переключать selected, устанавливая его в
tесли онnil, и вnilесли онt. Вот как определяется пункт меню для переключения флагаdebug-on-error:(menu-item "Debug on Error" toggle-debug-on-error :button (:toggle . (and (boundp 'debug-on-error) debug-on-error)))Это работает, потому что
toggle-debug-on-errorопределена как команда, которая переключает переменнуюdebug-on-error.Радиокнопки — это группа пунктов меню, в которой в любой момент времени выбран только один. Должна быть переменная, значение которой указывает, какой из них выбран в данный момент. Выражение selected для каждой радиокнопки в группе должно проверять, имеет ли переменная нужное значение для выбора этой кнопки. Нажатие на кнопку должно установить переменную так, чтобы нажатая кнопка стала выбранной.
:key-sequence key-sequence-
Это свойство указывает последовательность клавиш для отображения в качестве эквивалента на клавиатуре. Прежде чем Emacs отобразит key-sequence в меню, он проверяет, действительно ли key-sequence эквивалентна этому пункту меню, поэтому это имеет эффект только при указании правильной последовательности клавиш. Указание
nilдля key-sequence эквивалентно отсутствию атрибута:key-sequence. :keys string-
Это свойство указывает, что string — это строка, отображаемая в качестве эквивалента на клавиатуре для этого пункта меню. Вы можете использовать конструкцию документации ‘\\[...]’ в string.
:filter filter-fn-
Это свойство предоставляет способ динамического вычисления пункта меню. Значение свойства filter-fn должно быть функцией одного аргумента; при её вызове её аргументом будет real-binding. Функция должна вернуть привязку для использования вместо неё.
Emacs может вызывать эту функцию в любое время, когда происходит повторное отображение или обработка структур данных меню, поэтому вы должны написать её так, чтобы она могла безопасно вызываться в любое время.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Extended-Menu-Items.html