Spec-Zone.ru › Elisp

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

После того как цикл команд преобразует последовательность клавиш в команду, он вызывает эту команду с помощью функции 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

Spec-Zone.ru

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