Spec-Zone.ru › Elisp

Дополнительные пункты меню

Пункт меню расширенного формата — более гибкая и чистая альтернатива простому формату. Вы определяете тип события со связью, которая представляет собой список, начинающийся с символа 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API