Spec-Zone.ru › Elisp

Интерактивный вызов

После того, как цикл команд перевел последовательность клавиш в команду, он вызывает эту команду с помощью функции command-execute. Если команда является функцией, command-execute вызывает call-interactively, который считывает аргументы и вызывает команду. Вы также можете вызвать эти функции самостоятельно.

Обратите внимание, что термин «команда» в этом контексте относится к интерактивно вызываемой функции (или объекту, подобному функции), или макросу клавиатуры. Он не относится к последовательности клавиш, используемой для вызова команды (см. Карты клавиш).

Функция: commandp объект &необязательно для-вызова-интерактивно

Эта функция возвращает t, если объект является командой. В противном случае она возвращает nil.

Команды включают строки и векторы (которые обрабатываются как макросы клавиатуры), лямбда-выражения, содержащие форму верхнего уровня interactive (см. Использование интерактивного), объекты функций байткода, созданные из таких лямбда-выражений, объекты автозагрузки, объявленные как интерактивные (не-nil четвертый аргумент к autoload), и некоторые примитивные функции. Также символ считается командой, если у него есть свойство, отличное от nil interactive-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

Spec-Zone.ru

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