Обзор цикла команд
Первое, что должен сделать цикл команд, — прочитать последовательность клавиш, то есть последовательность событий ввода, которая преобразуется в команду. Для этого он вызывает функцию 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