Информация из цикла команд
Цикл команд редактора устанавливает несколько переменных Lisp для хранения данных о состоянии самого цикла и команд, которые выполняются. За исключением this-command и last-command, в общем случае не рекомендуется изменять эти переменные в программе Lisp.
- Переменная: last-command
-
Эта переменная записывает имя предыдущей команды, выполненной циклом команд (команды, предшествующей текущей). Обычно значение является символом с определением функции, но это не гарантируется.
Значение копируется из
this-command, когда команда возвращается в цикл команд, за исключением случаев, когда команда указала префиксный аргумент для следующей команды.Эта переменная всегда локальна для текущего терминала и не может быть локальной для буфера. См. Множественные терминалы.
- Переменная: real-last-command
Эта переменная настраивается Emacs так же, как и
last-command, но никогда не изменяется программами Lisp.
- Переменная: last-repeatable-command
Эта переменная хранит последнюю выполненную команду, которая не была частью события ввода. Это команда, которую
repeatпопытается повторить. См. Повтор в Справочнике GNU Emacs.
- Переменная: this-command
-
Эта переменная записывает имя команды, которая в данный момент выполняется циклом команд редактора. Как и
last-command, она обычно является символом с определением функции.Цикл команд устанавливает эту переменную незадолго до выполнения команды и копирует ее значение в
last-command, когда команда завершается (если команда не указала префиксный аргумент для следующей команды).Некоторые команды устанавливают эту переменную во время своего выполнения в качестве флага для следующей выполняемой команды. В частности, функции удаления текста устанавливают
this-commandвkill-region, чтобы любые команды удаления, которые следуют непосредственно за ними, знали, что нужно добавлять удаленный текст к предыдущему удаленному тексту.
Если вы не хотите, чтобы определенная команда распознавалась как предыдущая в случае возникновения ошибки, вам необходимо запрограммировать эту команду так, чтобы этого не происходило. Один из способов — установить this-command в t в начале команды и вернуть this-command к своему правильному значению в конце, как показано ниже:
(defun foo (args…)
(interactive …)
(let ((old-this-command this-command))
(setq this-command t)
…do the work…
(setq this-command old-this-command)))
Мы не связываем this-command с let, потому что это восстановит старое значение в случае ошибки — особенность let, которая в данном случае делает именно то, чего мы хотим избежать.
- Переменная: this-original-command
Эта переменная имеет то же значение, что и
this-command, за исключением случаев переназначения команд (см. Переназначение команд). В этом случаеthis-commandзадаёт фактически выполняемую команду (результат переназначения), аthis-original-commandзадаёт команду, которая должна была быть выполнена, но была переназначена на другую команду.
- Переменная: current-minibuffer-command
Эта переменная имеет то же значение, что и
this-command, но при входе в минибуфер связывается рекурсивно. Эта переменная может использоваться в хуках минибуфера и т. п. для определения команды, открывшей текущую сессию минибуфера.
- Функция: this-command-keys
-
Эта функция возвращает строку или вектор, содержащий последовательность нажатий клавиш, которая вызвала текущую команду. Любые события, считанные командой с использованием
read-eventбез таймаута, добавляются в конец.Однако, если команда вызвала
read-key-sequence, она возвращает последнюю последовательность нажатых клавиш. См. Ввод последовательности клавиш. Значение является строкой, если все события в последовательности были символами, которые помещаются в строку. См. События ввода.(this-command-keys) ;; Now use C-u C-x C-e to evaluate that. ⇒ "^X^E"
- Функция: this-command-keys-vector
-
Аналогично
this-command-keys, за исключением того, что она всегда возвращает события в виде вектора, поэтому вам не нужно иметь дело со сложностями хранения событий ввода в строке (см. Строки событий).
- Функция: clear-this-command-keys &optional keep-record
Эта функция очищает таблицу событий для возврата
this-command-keys. Если keep-record не равноnil, она также очищает записи, которые функцияrecent-keys(см. Запись ввода) вернёт впоследствии. Это полезно после чтения пароля, чтобы предотвратить случайное отображение пароля как части следующей команды в некоторых случаях.
-
Эта переменная содержит последнее событие ввода, считанное как часть последовательности нажатий клавиш, не считая событий, полученных из контекстных меню.
Одно из применений этой переменной — указать
x-popup-menu, где отобразить контекстное меню. Она также используется внутриy-or-n-p(см. Запросы «Да/Нет»).
- Переменная: last-command-event
-
Эта переменная устанавливается в последнее событие ввода, которое было прочитано циклом команд в рамках команды. Основное применение этой переменной — в
self-insert-command, которое использует ее для определения символа для вставки.last-command-event ;; Now use C-u C-x C-e to evaluate that. ⇒ 5Значение равно 5, так как это код ASCII для C-e.
- Переменная: last-event-frame
-
Эта переменная записывает, в какой фрейм было направлено последнее событие ввода. Обычно это фрейм, который был выбран, когда событие было сгенерировано, но если этот фрейм перенаправил фокус ввода на другой фрейм, значение представляет собой фрейм, в который было перенаправлено событие. См. Фокус ввода.
Если последнее событие пришло из макроса клавиатуры, значение равно
macro.
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-Loop-Info.html