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

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

Spec-Zone.ru

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