Spec-Zone.ru › Elisp

Информация из цикла команд

Цикл команд редактора задаёт несколько переменных 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 (см. Запись ввода). Это полезно после чтения пароля, чтобы в некоторых случаях пароль случайно не отобразился как часть следующей команды.

Переменная: last-nonmenu-event

В этой переменной хранится последнее событие ввода, прочитанное как часть последовательности клавиш, за исключением событий, вызванных меню мыши.

Эта переменная, например, позволяет указать 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

Spec-Zone.ru

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