Выбор из альтернатив команд
Иногда бывает полезно определить команду, которая служит «универсальным диспетчером» и может вызывать одну из нескольких команд в соответствии с потребностями пользователя. Например, представьте, что вы хотите определить команду с именем «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, после чего её следует заполнить ассоциациями, описывающими альтернативы. Пакеты, желающие предоставить собственную реализацию существующей универсальной команды, могут использовать cookieautoload(см. Автозагрузка) для добавления элементов в ассоциативный список, например:;;;###autoload (push '("My name" . my-foo-symbol) foo-alternativesЕсли необязательный аргумент customizations не равен
nil, он должен состоять из чередующихся ключевых словdefcustom(обычно:groupи:version) и значений, добавляемых к определениюdefcustomcommand-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