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