Spec-Zone.ru › Elisp

Пример меню

Вот полный пример определения раскладки клавиш для меню. Это определение подменю «Заменить» в меню «Правка» в строке меню, и оно использует расширенный формат пункта меню (см. Расширенные пункты меню). Сначала мы создаём раскладку клавиш и даём ей имя:

(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

Spec-Zone.ru

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