Информация из цикла команд
Цикл команд редактора задаёт несколько переменных 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, которая с её помощью определяет, какой символ вставить, и вpost-self-insert-hook(см. Команды вставки для пользователей), которая использует её для доступа к только что вставленному символу.last-command-event ;; Now use C-u C-x C-e to evaluate that. ⇒ 5Значение равно 5, поскольку таков код ASCII для C-e.
- Переменная: last-event-frame
-
В этой переменной записывается, какому фрейму было адресовано последнее событие ввода. Обычно это фрейм, выбранный в момент возникновения события, но если этот фрейм перенаправил фокус ввода на другой фрейм, значением будет фрейм, которому было перенаправлено событие. См. Фокус ввода.
Если последнее событие поступило из клавиатурного макроса, значением будет
macro.
События ввода должны откуда-то поступать; иногда их источником бывает клавиатурный макрос, сигнал или unread-command-events, но обычно это физическое устройство ввода, подключённое к компьютеру, которым управляет пользователь. Такие устройства называются устройствами ввода, и Emacs связывает каждое событие ввода с устройством, от которого оно поступило. Устройства различаются по имени, уникальному для каждого устройства ввода.
Возможность определить конкретное устройство ввода зависит от особенностей системы. Когда такая информация недоступна, Emacs сообщает, что клавиатурные события поступили от «"Virtual core keyboard"», а остальные события — от «"Virtual core pointer"». (Эти значения используются на всех платформах, поскольку сервер X сообщает их, если подробные сведения об устройстве неизвестны.)
- Переменная: last-event-device
-
В этой переменной записывается имя устройства ввода, на котором возникло последнее прочитанное событие ввода. Значение
nilиспользуется, если такого устройства нет, то есть если последнее событие ввода было прочитано изunread-command-eventsили поступило из клавиатурного макроса.При использовании X Input Extension в X Windows имя устройства представляет собой строку, уникальную для каждой физической клавиатуры, указывающего устройства и сенсорного экрана, подключённых к серверу X. В противном случае это либо строка «"Virtual core pointer"», либо строка «"Virtual core keyboard"» — в зависимости от того, было ли событие создано указывающим устройством (например, мышью) или клавиатурой.
- Функция: device-class frame name
-
Существует несколько типов устройств, которые можно определить по их именам. Эта функция позволяет определить тип устройства с именем name, для которого событие поступило от frame.
Возвращаемое значение — один из следующих символов («классов устройств»):
core-keyboard-
Основная клавиатура; это означает, что устройство относится к клавиатурному типу, но другие его характеристики неизвестны.
core-pointer-
Основное указывающее устройство; это означает, что устройство является указывающим, но другие его характеристики неизвестны.
mouse-
Компьютерная мышь.
trackpoint-
Трекпоинт или джойстик (либо аналогичный орган управления).
eraser-
Противоположный конец стилуса графического планшета или отдельный ластик.
pen-
Острие пера графического планшета, стилус или другое подобное устройство.
puck-
Устройство, похожее на компьютерную мышь, но сообщающее абсолютные координаты относительно некоторой другой поверхности.
power-button-
Кнопка питания или регулировки громкости (либо аналогичный орган управления).
keyboard-
Компьютерная клавиатура.
touchscreen-
Компьютерная сенсорная панель.
pad-
Набор чувствительных кнопок, колец и полос, обычно расположенных вокруг графического планшета.
touchpad-
Устройство непрямого ввода касанием, например сенсорная панель.
piano-
Музыкальный инструмент, например электронная клавиатура.
testУстройство, используемое расширением XTEST для передачи данных ввода.
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-Loop-Info.html