22.7.12 Прочие системные события

Несколько других типов событий представляют собой события, происходящие в системе.

text-conversion

Это событие отправляется после того, как общесистемный метод ввода выполняет правку в одном или нескольких буферах.

После отправки события метод ввода уже мог внести изменения в несколько буферов внутри многих разных фреймов. Чтобы определить, какие буферы были изменены и какие правки в них были внесены, используйте переменную text-conversion-edits, которая устанавливается перед отправкой каждого события text-conversion; это список вида:

((buffer beg end ephemeral) ...)

Где ephemeral — это изменённый буфер, beg и end — маркеры, установленные на позиции правки на момент её завершения, а ephemeral — это либо строка, содержащая вставленный текст (или любой текст перед точкой, который был удалён), t, означающее, что правка является временной правкой, сделанной методом ввода, либо nil, означающее, что некоторый текст после точки был удалён.

Будет ли отправлено это событие, зависит от значения буферно-локальной переменной text-conversion-style, которая определяет, как будет вести себя метод ввода, желающий вносить правки в содержимое буфера.

Эта переменная может принимать одно из четырёх значений:

nil

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

action

Это означает, что метод ввода будет включён, но RET будет отправляться всякий раз, когда метод ввода хочет вставить новую строку.

password

Это в значительной степени идентично action, но также запрашивает метод ввода, способный вводить символы ASCII, и предписывает ему не сохранять ввод в местах, откуда он впоследствии может быть извлечён функциями метода ввода, не способными обрабатывать конфиденциальную информацию, такими как текстовые подсказки.

t

Это или любое другое значение означает, что метод ввода будет включён и будет вносить правки с последующими событиями text-conversion.

Изменения значения этой переменной вступят в силу только при следующей перерисовке после того, как буфер станет выбранным буфером фрейма. Если вам нужно отключить преобразование текста способом, который вступает в силу немедленно, вызовите вместо этого функцию set-text-conversion-style. Это может потенциально заблокировать метод ввода на значительное время, и его следует использовать с осторожностью.

Кроме того, преобразование текста автоматически отключается после того, как цикл команд или read-key-sequence считывает префиксную клавишу. Это можно отключить, установив или привязав переменную disable-inhibit-text-conversion к значению, отличному от nil.

(delete-frame (frame))

Это событие указывает, что пользователь дал оконному менеджеру команду удалить определённое окно, которое оказывается фреймом Emacs.

Стандартное определение события delete-frame — удалить frame.

(iconify-frame (frame))

Это событие указывает, что пользователь свернул frame в иконку с помощью оконного менеджера. Его стандартное определение — ignore; поскольку фрейм уже был свёрнут, Emacs не нужно ничего делать. Назначение этого типа событий — чтобы вы могли отслеживать такие события, если захотите.

(make-frame-visible (frame))

Это событие указывает, что пользователь развернул frame из иконки с помощью оконного менеджера. Его стандартное определение — ignore; поскольку фрейм уже был сделан видимым, Emacs не нужно ничего делать.

(touch-end (position))

Это событие указывает, что палец пользователя убран с колёсика мыши или тачпада. Элемент position — это список позиции мыши (см. События щелчка), указывающий позицию курсора мыши в момент, когда палец был убран с колёсика мыши.

(wheel-up position clicks lines pixel-delta)
(wheel-down position clicks lines pixel-delta)

Эти события генерируются вращением колёсика мыши. Элемент position — это список позиции мыши (см. События щелчка), указывающий позицию курсора мыши в момент возникновения события.

clicks, если присутствует, — это количество раз, которое колёсико было повёрнуто в быстрой последовательности. См. Повторяющиеся события. lines, если присутствует и не равен nil, — это положительное количество строк экрана, которые должны быть прокручены (либо вверх, когда событие — wheel-up, либо вниз, когда событие — wheel-down). pixel-delta, если присутствует, — это ячейка cons вида (x . y), где x и y — это количество пикселей для прокрутки по каждой оси, также известные как попиксельные дельты. Обычно только одно из двух будет ненулевым, другое будет либо нулём, либо очень близким к нулю; большее число указывает ось для прокрутки окна. Когда переменная mwheel-coalesce-scroll-events равна nil, команды прокрутки игнорируют элемент lines, даже если он не равен nil, и используют данные pixel-delta; в этом случае направление прокрутки определяется знаком попиксельных дельт, а направление (вверх или вниз), подразумеваемое типом события, игнорируется.

Вы можете использовать эти попиксельные дельты x и y, чтобы определить, насколько фактически переместилось колёсико мыши с пиксельным разрешением. Например, попиксельные дельты можно использовать для прокрутки отображения с пиксельным разрешением, точно в соответствии с вращением колёсика мыши пользователем. Эта попиксельная прокрутка возможна только тогда, когда mwheel-coalesce-scroll-events равен nil, и в общем случае данные pixel-delta не генерируются, когда эта переменная не равна nil.

События wheel-up и wheel-down генерируются только в некоторых системах. В других системах вместо них используются другие события, такие как mouse-4 и mouse-5. Переносимый код должен обрабатывать как события wheel-up и wheel-down, так и события, указанные в переменных mouse-wheel-up-event и mouse-wheel-down-event, определённых в mwheel.el. Имейте в виду, что по историческим причинам переменная mouse-wheel-up-event содержит событие, которое должно обрабатываться аналогично wheel-down, и наоборот.

То же самое относится и к горизонтальным движениям колёсика, которые обычно представлены событиями wheel-left и wheel-right, но для которых переносимый код также должен учитывать переменные mouse-wheel-left-event и mouse-wheel-right-event, определённые в mwheel.el. Однако некоторые мыши также генерируют другие события одновременно с этими событиями прокрутки, которые могут мешать. Способ исправить это — обычно отвязать эти события (например, mouse-6 или mouse-7, но это сильно зависит от аппаратного обеспечения и операционной системы).

(pinch position dx dy scale angle)

Это событие генерируется, когда пользователь выполняет жест «щипок», помещая два пальца на тачпад и перемещая их навстречу друг другу или друг от друга. position — это список позиции мыши (см. События щелчка), который предоставляет позицию указателя мыши в момент возникновения события, dx — это изменение горизонтального расстояния между пальцами с момента последнего события в той же последовательности, dy — это вертикальное перемещение пальцев с момента последнего события в той же последовательности, scale — это отношение текущего расстояния между пальцами к этому расстоянию в начале последовательности, а angle — это угловая разница в градусах между направлением линии, соединяющей пальцы в этом событии, и направлением этой линии в последнем событии той же последовательности.

Поскольку события щипка отправляются только в начале или во время последовательности щипка, они не сообщают о жестах, когда пользователь вращает два пальца на тачпаде, не сжимая их.

Все аргументы после position являются числами с плавающей точкой.

Это событие обычно отправляется как часть последовательности, которая начинается с того, что пользователь помещает два пальца на тачпад, и заканчивается тем, что пользователь убирает эти пальцы. dx, dy и angle будут равны 0.0 в первом событии последовательности; последующие события будут сообщать ненулевые значения для этих элементов структуры события.

dx и dy сообщаются в воображаемых относительных единицах, в которых 1.0 — это соответственно ширина и высота тачпада. Обычно они интерпретируются как относительные к размеру объекта под жестом: изображения, окна и т. д.

(preedit-text arg)

Это событие отправляется, когда системный метод ввода сообщает Emacs отобразить некоторый текст, чтобы указать пользователю, что будет вставлено. Содержимое arg зависит от используемой оконной системы.

В X arg — это строка, описывающая некоторый текст для размещения за курсором. Это может быть nil, что означает удаление любого ранее отображавшегося текста.

Во фреймах PGTK (см. Фреймы) arg — это список строк с информацией об их цвете и атрибутах подчёркивания. Он имеет следующий вид:

   ((string1
     (ul . underline-color)
     (bg . background-color)
     (fg . foreground-color))
    (string2
     (ul . underline-color)
     (bg . background-color)
     (fg . foreground-color))
    …
   )

Информация о цвете может быть опущена, останется только текст строк. underline-color может быть t, что означает подчёркнутый текст с цветом подчёркивания по умолчанию, или это может быть строка — название цвета для рисования подчёркивания.

Это специальное событие (см. Специальные события), которое обычно не должно привязываться пользователем к какой-либо команде. Emacs обычно отображает текст, содержащийся в событии, в оверлее за точкой, когда оно получено.

(drag-n-drop position files)

Это событие генерируется, когда группа файлов выбрана в приложении вне Emacs, а затем перетащена и опущена на фрейм Emacs.

Элемент position — это список, описывающий позицию события, в том же формате, что используется в событии щелчка мыши (см. События щелчка), а files — это список имён файлов, которые были перетащены и опущены. Обычный способ обработки этого события — посетить эти файлы.

Это событие генерируется в настоящее время только в некоторых системах.

help-echo

Это событие генерируется, когда указатель мыши перемещается на часть текста буфера, которая имеет текстовое свойство help-echo. Сгенерированное событие имеет следующий вид:

(help-echo frame help window object pos)

Точное значение параметров события и способ использования этих параметров для отображения текста help-echo описаны в Текстовое help-echo.

sigusr1
sigusr2

Эти события генерируются, когда процесс Emacs получает сигналы SIGUSR1 и SIGUSR2. Они не содержат дополнительных данных, поскольку сигналы не несут дополнительной информации. Они могут быть полезны для отладки (см. Вход в отладчик при ошибке).

Чтобы перехватить пользовательский сигнал, привяжите соответствующее событие к интерактивной команде в special-event-map (см. Управление активными клавиатурными картами). Команда вызывается без аргументов, а конкретное событие сигнала доступно в last-input-event (см. Разные возможности ввода событий). Например:

(defun sigusr-handler ()
  (interactive)
  (message "Пойман сигнал %S" last-input-event))

(keymap-set special-event-map "<sigusr1>" 'sigusr-handler)

Чтобы проверить обработчик сигнала, вы можете заставить Emacs отправить сигнал самому себе:

(signal-process (emacs-pid) 'sigusr1)
language-change

Это событие генерируется в MS-Windows, когда изменяется язык ввода. Это обычно означает, что клавиши клавиатуры будут отправлять в Emacs символы другого языка. Сгенерированное событие имеет следующий вид:

(language-change frame codepage language-id)

Здесь frame — это фрейм, который был текущим, когда изменился язык ввода; codepage — это новый номер кодовой страницы; а language-id — это числовой идентификатор нового языка ввода. Система кодирования (см. Системы кодирования), соответствующая codepage, — это cpcodepage или windows-codepage. Чтобы преобразовать language-id в строку (например, для использования в различных функциях, зависящих от языка, таких как set-language-environment), используйте функцию w32-get-locale-info, например:

;; Получить сокращённое название языка, например "ENU" для английского
(w32-get-locale-info language-id)
;; Получить полное английское название языка,
;; например "English (United States)"
(w32-get-locale-info language-id 4097)
;; Получить полное локализованное название языка
(w32-get-locale-info language-id t)
end-session

Это событие генерируется в MS-Windows, когда операционная система сообщает Emacs, что пользователь завершил интерактивную сессию или что система завершает работу. Стандартное определение этого события — вызов команды kill-emacs (см. Завершение Emacs) для упорядоченного завершения Emacs; если есть несохранённые изменения, это создаст файлы автосохранения (см. Автосохранение), которые пользователь может использовать после перезапуска сессии для восстановления несохранённых правок.

Если одно из этих событий поступает в середине последовательности клавиш — то есть после префиксной клавиши — то Emacs переупорядочивает события так, чтобы это событие располагалось либо до, либо после многособытийной последовательности клавиш, но не внутри неё.

Некоторые из этих специальных событий, такие как delete-frame, по умолчанию вызывают команды Emacs; другие не привязаны. Если вы хотите организовать вызов команды по специальному событию, вы можете сделать это через special-event-map. Команда, которую вы привяжете к клавише-функции в этой карте, затем может исследовать полное событие, вызвавшее её, в last-input-event. См. Специальные события.