Интерактивный вызов
После того, как цикл команд перевел последовательность клавиш в команду, он вызывает эту команду с помощью функции command-execute. Если команда является функцией, command-execute вызывает call-interactively, который считывает аргументы и вызывает команду. Вы также можете вызвать эти функции самостоятельно.
Обратите внимание, что термин «команда» в этом контексте относится к интерактивно вызываемой функции (или объекту, подобному функции), или макросу клавиатуры. Он не относится к последовательности клавиш, используемой для вызова команды (см. Карты клавиш).
- Функция: commandp объект &необязательно для-вызова-интерактивно
-
Эта функция возвращает
t, если объект является командой. В противном случае она возвращаетnil.Команды включают строки и векторы (которые обрабатываются как макросы клавиатуры), лямбда-выражения, содержащие форму верхнего уровня
interactive(см. Использование интерактивного), объекты функций байткода, созданные из таких лямбда-выражений, объекты автозагрузки, объявленные как интерактивные (не-nilчетвертый аргумент кautoload), и некоторые примитивные функции. Также символ считается командой, если у него есть свойство, отличное отnilinteractive-form, или если его определение функции удовлетворяетcommandp.Если для-вызова-интерактивно не
nil, тоcommandpвозвращаетtтолько для объектов, которыеcall-interactivelyмогли бы вызвать — таким образом, не для макросов клавиатуры.См.
documentationв Доступ к документации для реального примера использованияcommandp.
- Функция: call-interactively команда &необязательно флаг-записи ключи
-
Эта функция вызывает интерактивно вызываемую функцию команда, предоставляя аргументы в соответствии со спецификациями её интерактивного вызова. Она возвращает то, что возвращает команда.
Если, например, у вас есть функция со следующей сигнатурой:
(defun foo (begin end) (interactive "r") ...)
то сказать
(call-interactively 'foo)
вызовет
fooс областью (pointиmark) в качестве аргументов.Ошибка сигнализируется, если команда не является функцией или если её нельзя вызвать интерактивно (то есть она не является командой). Обратите внимание, что макросы клавиатуры (строки и векторы) не принимаются, даже если они считаются командами, потому что они не являются функциями. Если команда является символом, то
call-interactivelyиспользует его определение функции.Если флаг-записи не
nil, то эта команда и её аргументы безусловно добавляются в списокcommand-history. В противном случае команда добавляется только если она использует минибуфер для чтения аргумента. См. История команд.Аргумент ключи, если задан, должен быть вектором, который определяет последовательность событий для предоставления, если команда запрашивает, какие события были использованы для её вызова. Если ключи опущен или
nil, по умолчанию является значениемthis-command-keys-vector. См. Определение этого-команда-ключи-вектор.
- Функция: funcall-interactively функция &rest аргументы
Эта функция работает как
funcall(см. Вызов функций), но делает вызов похожим на интерактивный вызов: вызовcalled-interactively-pвнутри функция вернётt. Если функция не является командой, она вызывается без сигнализации об ошибке.
- Функция: command-execute команда &необязательно флаг-записи ключи специальный
-
Эта функция выполняет команда. Аргумент команда должен удовлетворять предикату
commandp; то есть это должна быть интерактивно вызываемая функция или макрос клавиатуры.Строка или вектор в качестве команда выполняется с
execute-kbd-macro. Функция передается вcall-interactively(см. выше), вместе с аргументами флаг-записи и ключи.Если команда является символом, используется его определение функции. Символ с
autoloadопределением считается командой, если он был объявлен как представляющий интерактивно вызываемую функцию. Такое определение обрабатывается путем загрузки указанной библиотеки и последующей проверки определения символа.Аргумент специальный, если задан, означает игнорирование префиксного аргумента и его не очищение. Это используется для выполнения специальных событий (см. Специальные события).
- Команда: execute-extended-command префиксный-аргумент
-
Эта функция считывает имя команды из минибуфера с использованием
completing-read(см. Завершение). Затем она используетcommand-executeдля вызова указанной команды. Возвращаемое значение этой команды становится значениемexecute-extended-command.Если команда запрашивает префиксный аргумент, она получает значение префиксный-аргумент. Если
execute-extended-commandвызывается интерактивно, текущий сырой префиксный аргумент используется для префиксный-аргумент и, таким образом, передается любой выполняемой команде.execute-extended-command— обычное определение M-x, поэтому она использует строку ‘M-x ’ в качестве приглашения. (Было бы лучше взять приглашение из событий, использованных для вызоваexecute-extended-command, но это сложно для реализации).(execute-extended-command 3) ---------- Buffer: Minibuffer ---------- 3 M-x forward-word RET ---------- Buffer: Minibuffer ---------- ⇒ tЭта команда учитывает переменную
read-extended-command-predicate, которая может отфильтровать команды, неприменимые к текущему главному режиму (или включенным вспомогательным режимам). По умолчанию значение этой переменной равноnil, и никакие команды не отфильтровываются. Однако, настройка её на вызов функцииcommand-completion-default-include-pвыполнит зависящую от режима фильтрацию.read-extended-command-predicateможет быть любой предикатной функцией; она будет вызываться с двумя параметрами: символом команды и текущим буфером. Она должна возвращать не-nilесли команда должна быть включена при завершении в этом буфере.
- Команда: execute-extended-command-for-buffer префиксный-аргумент
Это как
execute-extended-command, но ограничивает предлагаемые команды для завершения командами, имеющими особое значение для текущего главного режима (и включенных вспомогательных режимов). Это включает команды, помеченные режимами (см. Использование интерактивного), а также команды, привязанные к локально активным картам клавиш. Эта команда — обычное определение M-S-x (это «мета сдвиг x»).
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/Interactive-Call.html