Интерактивный вызов
После того как цикл команд преобразует последовательность клавиш в команду, он вызывает эту команду с помощью функции command-execute. Если команда является функцией, command-execute вызывает call-interactively, которая считывает аргументы и вызывает команду. Вы также можете вызывать эти функции самостоятельно.
Обратите внимание, что в данном контексте термин «команда» означает функцию, которую можно вызвать интерактивно (или объект, подобный функции), либо клавиатурный макрос. Он не означает последовательность клавиш, используемую для вызова команды (см. Карты клавиш).
- Функция: commandp object &optional for-call-interactively
-
Эта функция возвращает
t, если object является командой. В противном случае она возвращаетnil.К командам относятся строки и векторы (которые рассматриваются как клавиатурные макросы), лямбда-выражения, содержащие форму
interactiveна верхнем уровне (см. Использованиеinteractive), объекты байт-кода функций, созданные из таких лямбда-выражений, объекты автозагрузки, объявленные интерактивными (четвёртый аргументautoload, отличный отnil), а также некоторые примитивные функции. Кроме того, символ считается командой, если у него есть свойствоinteractive-form, отличное отnil, или если его определение функции удовлетворяет условиюcommandp.Если for-call-interactively отличается от
nil, тоcommandpвозвращаетtтолько для объектов, которые мог бы вызватьcall-interactively, то есть не для клавиатурных макросов.Реалистичный пример использования
commandpсм. в разделеdocumentationв Доступ к строкам документации.
- Функция: call-interactively command &optional record-flag keys
-
Эта функция вызывает интерактивно вызываемую функцию command, передавая аргументы в соответствии с её спецификациями интерактивного вызова. Она возвращает всё, что возвращает command.
Например, если у вас есть функция со следующей сигнатурой:
(defun foo (begin end) (interactive "r") ...)
то выполнение
(call-interactively 'foo)
вызовет
foo, передав область (pointиmark) в качестве аргументов.Если command не является функцией или её нельзя вызвать интерактивно (то есть она не является командой), сигнализируется ошибка. Обратите внимание, что клавиатурные макросы (строки и векторы) не принимаются, хотя и считаются командами, поскольку они не являются функциями. Если command — символ,
call-interactivelyиспользует его определение функции.Если record-flag отличается от
nil, эта команда и её аргументы безусловно добавляются в списокcommand-history. В противном случае команда добавляется только в том случае, если для чтения аргумента она использует минибуфер. См. История команд.Аргумент keys, если он задан, должен быть вектором, указывающим последовательность событий, которые нужно передать, если команда запрашивает, какие события использовались для её вызова. Если keys опущен или равен
nil, по умолчанию используется возвращаемое значениеthis-command-keys-vector. См. Определение this-command-keys-vector.
- Функция: funcall-interactively function &rest arguments
Эта функция работает как
funcall(см. Вызов функций), но делает вызов похожим на интерактивный: вызовcalled-interactively-pвнутри function вернётt. Если function не является командой, она вызывается без сигнализации ошибки.
- Функция: command-execute command &optional record-flag keys special
-
Эта функция выполняет command. Аргумент command должен удовлетворять предикату
commandp, то есть быть интерактивно вызываемой функцией или клавиатурным макросом.Строка или вектор в качестве command выполняется с помощью
execute-kbd-macro. Функция передаётся вcall-interactively(см. выше) вместе с аргументами record-flag и keys.Если command — символ, вместо него используется его определение функции. Символ с определением
autoloadсчитается командой, если он был объявлен как обозначающий интерактивно вызываемую функцию. Такое определение обрабатывается загрузкой указанной библиотеки с последующей повторной проверкой определения символа.Аргумент special, если он задан, означает, что нужно игнорировать префиксный аргумент и не очищать его. Это используется для выполнения специальных событий (см. Специальные события).
- Команда: execute-extended-command prefix-argument
-
Эта функция считывает имя команды из минибуфера с помощью
completing-read(см. Дополнение). Затем она используетcommand-executeдля вызова указанной команды. Возвращённое этой командой значение становится значениемexecute-extended-command.Если команда запрашивает префиксный аргумент, она получает значение prefix-argument. Если
execute-extended-commandвызывается интерактивно, для prefix-argument используется текущий необработанный префиксный аргумент, который затем передаётся выполняемой команде.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 prefix-argument
Эта команда похожа на
execute-extended-command, но ограничивает список предлагаемых для дополнения команд теми, которые особенно актуальны для текущего основного режима (и включённых дополнительных режимов). Сюда входят команды, помеченные соответствующими режимами (см. Использованиеinteractive), а также команды, привязанные к локально активным картам клавиш. Эта команда является стандартным определением M-S-x (то есть «meta shift x»).
Обе эти команды запрашивают имя команды, но используют разные правила дополнения. Переключаться между этими двумя режимами можно с помощью команды M-S-x во время ввода запроса.
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/Interactive-Call.html