Spec-Zone.ru › Elisp

Выбор из альтернатив команд

Иногда бывает полезно определить команду, которая служит «универсальным диспетчером» и может вызывать одну из нескольких команд в соответствии с потребностями пользователя. Например, представьте, что вы хотите определить команду с именем «open», которая может «открывать» и отображать несколько различных типов объектов. Или можно создать команду с именем «mua» (сокращение от Mail User Agent — почтовый пользовательский агент), которая может читать и отправлять электронную почту с помощью одной из нескольких почтовых систем, таких как Rmail, Gnus или MH-E. Для определения таких универсальных команд можно использовать макрос define-alternatives. Универсальная команда — это интерактивная функция, реализацию которой пользователь может выбрать из нескольких вариантов.

Макрос: define-alternatives command &rest customizations

Этот макрос определяет новую универсальную команду command, для которой можно задать несколько альтернативных реализаций. Аргумент command должен быть не заключённым в кавычки символом.

При вызове макрос создаёт интерактивное замыкание Lisp (см. Замыкания). Когда пользователь в первый раз выполняет M-x command RET, Emacs предлагает выбрать одну из альтернативных реализаций command, предоставляя автодополнение по именам этих альтернатив. Эти имена берутся из пользовательского параметра с именем command-alternatives, который создаётся макросом (если он ещё не существовал). Значение этой переменной должно быть ассоциативным списком, элементы которого имеют вид (alt-name . alt-func), где alt-name — имя альтернативы, а alt-func — интерактивная функция, вызываемая при выборе этой альтернативы. Когда пользователь выбирает альтернативу, Emacs запоминает выбор и при последующих вызовах M-x command автоматически вызывает выбранную альтернативу, не запрашивая подтверждения. Чтобы выбрать другую альтернативу, введите C-u M-x command RET — после этого Emacs снова предложит выбрать одну из альтернатив, и новый выбор заменит предыдущий.

Переменную command-alternatives можно создать до вызова define-alternatives, задав ей нужные значения; в противном случае макрос создаст переменную со значением nil, после чего её следует заполнить ассоциациями, описывающими альтернативы. Пакеты, желающие предоставить собственную реализацию существующей универсальной команды, могут использовать cookie autoload (см. Автозагрузка) для добавления элементов в ассоциативный список, например:

;;;###autoload (push '("My name" . my-foo-symbol) foo-alternatives

Если необязательный аргумент customizations не равен nil, он должен состоять из чередующихся ключевых слов defcustom (обычно :group и :version) и значений, добавляемых к определению defcustom command-alternatives.

Ниже приведён пример простого универсального диспетчера команд с именем open и тремя альтернативными реализациями:

(define-alternatives open
  :group 'files
  :version "42.1")
(setq open-alternatives
      '(("file" . find-file)
	("directory" . dired)
	("hexl" . hexl-find-file)))

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/Generic-Commands.html

Spec-Zone.ru

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