Spec-Zone.ru › Elisp

Обзор цикла команд

Первое, что должен сделать цикл команд, — прочитать последовательность клавиш, то есть последовательность событий ввода, которая преобразуется в команду. Для этого он вызывает функцию read-key-sequence. Программы на Lisp также могут вызывать эту функцию (см. Ввод последовательности клавиш). Они также могут считывать ввод на более низком уровне с помощью read-key или read-event (см. Чтение одного события) или отбрасывать ожидающий ввод с помощью discard-input (см. Прочие возможности ввода событий).

Последовательность клавиш преобразуется в команду с помощью активных в данный момент карт клавиш. См. Поиск клавиши, где описано, как это происходит. Результатом должна быть клавиатурная макрокоманда или функция, вызываемая интерактивно. Если клавиша — M-x, считывается имя другой команды, которую затем вызывают. Это выполняет команда execute-extended-command (см. Интерактивный вызов).

Перед выполнением команды Emacs вызывает undo-boundary, чтобы создать границу отмены. См. Поддержка списков отмены.

Чтобы выполнить команду, Emacs сначала считывает её аргументы, вызывая command-execute (см. Интерактивный вызов). Для команд, написанных на Lisp, спецификация interactive определяет, как считывать аргументы. При этом может использоваться аргумент-префикс (см. Аргументы команд-префиксов) или выполняться чтение с запросом в минибуфере (см. Минибуферы). Например, команда find-file имеет спецификацию interactive, которая предписывает считывать имя файла с помощью минибуфера. Тело функции find-file не использует минибуфер, поэтому при вызове find-file как функции из кода Lisp необходимо передать строку с именем файла в качестве обычного аргумента функции Lisp.

Если команда является клавиатурной макрокомандой (то есть строкой или вектором), Emacs выполняет её с помощью execute-kbd-macro (см. Клавиатурные макрокоманды).

Переменная: pre-command-hook

Этот обычный хук запускается циклом команд редактора перед выполнением каждой команды. В этот момент this-command содержит команду, которая должна быть запущена, а last-command описывает предыдущую команду. См. Сведения от цикла команд.

Переменная: post-command-hook

Этот обычный хук запускается циклом команд редактора после выполнения каждой команды (в том числе команд, выполнение которых было преждевременно прервано выходом или ошибками). В этот момент this-command указывает на только что выполненную команду, а last-command — на команду, выполненную перед ней.

Этот хук также запускается при первом входе Emacs в цикл команд (в этот момент и this-command, и last-command имеют значение nil).

Выход подавляется во время выполнения pre-command-hook и post-command-hook. Если при выполнении одного из этих хуков возникает ошибка, выполнение хука не прекращается; вместо этого ошибка подавляется, а функция, в которой она произошла, удаляется из хука.

Запрос, поступивший на сервер Emacs (см. Сервер Emacs в Руководстве GNU Emacs), запускает эти два хука так же, как и команда, введённая с клавиатуры.

Обратите внимание: если текст буфера содержит очень длинные строки, эти два хука вызываются так, как если бы они находились в форме with-restriction (см. Сужение области), с меткой long-line-optimizations-in-command-hooks, а область буфера сужается до части вокруг точки.

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/Command-Overview.html

Spec-Zone.ru

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