Пример меню
Вот полный пример определения раскладки клавиш для меню. Это определение подменю «Заменить» в меню «Правка» в строке меню, и оно использует расширенный формат пункта меню (см. Расширенные пункты меню). Сначала мы создаём раскладку клавиш и даём ей имя:
(defvar menu-bar-replace-menu (make-sparse-keymap "Replace"))
Далее мы определяем пункты меню:
(define-key menu-bar-replace-menu [tags-repl-continue]
'(menu-item "Continue Replace" multifile-continue
:help "Continue last tags replace operation"))
(define-key menu-bar-replace-menu [tags-repl]
'(menu-item "Replace in tagged files" tags-query-replace
:help "Interactively replace a regexp in all tagged files"))
(define-key menu-bar-replace-menu [separator-replace-tags]
'(menu-item "--"))
;; …
Обратите внимание на символы, для которых устанавливаются привязки; они появляются внутри квадратных скобок в определяемой последовательности клавиш. В некоторых случаях этот символ совпадает с именем команды; иногда он отличается. Эти символы обрабатываются как функциональные клавиши, но они не являются реальными функциональными клавишами на клавиатуре. Они не влияют на работу самого меню, но они отображаются в области вывода, когда пользователь выбирает пункт из меню, и они появляются в выводе where-is и apropos.
Меню в этом примере предназначено для использования с мышью. Если меню предназначено для использования с клавиатурой, то есть если оно привязано к последовательности клавиш, заканчивающейся событием клавиатуры, то пункты меню должны быть привязаны к символам или реальным функциональным клавишам, которые можно набрать с клавиатуры.
Привязка, определение которой ("--") — это разделительная линия. Как и реальный пункт меню, разделитель имеет ключевой символ, в данном случае separator-replace-tags. Если в одном меню есть две разделительные линии, они должны иметь два разных ключевых символа.
Вот как мы делаем это меню видимым как пункт в родительском меню:
(define-key menu-bar-edit-menu [replace] (list 'menu-item "Replace" menu-bar-replace-menu))
Обратите внимание, что это включает в себя раскладку подменю, которая является значением переменной menu-bar-replace-menu, а не символа menu-bar-replace-menu сам по себе. Использование этого символа в пункте родительского меню было бы бессмысленным, потому что menu-bar-replace-menu не является командой.
Если вам нужно прикрепить то же меню замены к щелчку мыши, вы можете сделать это так:
(define-key global-map [C-S-down-mouse-1] menu-bar-replace-menu)
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/Menu-Example.html