22.7.12 其他系统事件

还有一些其他事件类型表示系统内部发生的状况。

text-conversion

这类事件在系统级输入法对一个或多个缓冲区执行编辑 之后 发送。

事件发送后,输入法可能已经在多个不同框架内的多个缓冲区中做出了修改。 要确定哪些缓冲区被修改以及进行了哪些编辑,可以使用变量 text-conversion-edits,该变量在每次 text-conversion 事件发送之前被设置;它是一个如下形式的列表:

((buffer beg end ephemeral) ...)

其中 buffer 是被修改的缓冲区,begend 是在编辑完成时设置到编辑位置的标记, 而 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 是一个鼠标位置列表(see 点击事件), 指定手指离开滚轮时鼠标光标的位置。

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

这些事件由滚动鼠标滚轮产生。 position 是一个鼠标位置列表(see 点击事件), 指定事件发生时鼠标光标的位置。

clicks(如果存在)是滚轮快速连续滚动的次数。See 重复事件lines(如果存在且非 nil)是应滚动的屏幕行数(正数): 事件为 wheel-up 时向上滚动,wheel-down 时向下滚动。 pixel-delta(如果存在)是格式为 (x . y) 的 cons 单元, 其中 xy 是各轴上应滚动的像素数,即 像素级增量(pixelwise deltas)。 通常两者中只有一个非零,另一个为零或接近零; 数值较大的那个轴即为窗口滚动轴。 当变量 mwheel-coalesce-scroll-eventsnil 时, 滚动命令会忽略 lines 元素(即使非 nil),转而使用 pixel-delta 数据; 此时滚动方向由像素增量的符号决定,忽略事件类型隐含的方向(上或下)。

你可以使用这些 xy 像素增量来精确判断鼠标滚轮实际移动了多少像素。 例如,像素增量可用于根据用户滚轮转动情况精确地以像素级滚动显示内容。 这种像素级滚动仅在 mwheel-coalesce-scroll-eventsnil 时可用; 通常当该变量非 nil 时不会生成 pixel-delta 数据。

wheel-upwheel-down 事件仅在某些类型的系统上生成。 在其他系统上,会改用 mouse-4mouse-5 等事件。 可移植代码应同时处理 wheel-upwheel-down 事件 以及 mwheel.el 中定义的变量 mouse-wheel-up-eventmouse-wheel-down-event 所指定的事件。 注意:由于历史原因,mouse-wheel-up-event 变量中保存的是 应与 wheel-down 类似处理的事件,反之亦然。

水平滚轮移动通常由 wheel-leftwheel-right 事件表示, 但可移植代码同样应遵循 mwheel.el 中定义的变量 mouse-wheel-left-eventmouse-wheel-right-event。 不过,某些鼠标在生成这些滚动事件的同时还会产生其他可能造成干扰的事件。 解决方法通常是取消绑定这些事件(例如 mouse-6mouse-7), 但这高度依赖于硬件和操作系统。

(pinch position dx dy scale angle)

这类事件由用户在触控板上放置两根手指并相向或相离移动(“捏合(pinch)” 手势)产生。 position 是事件发生时鼠标指针位置的鼠标位置列表(see 点击事件); dx 是自同一序列中上一事件以来手指间水平距离的变化; dy 是自同一序列中上一事件以来手指的垂直移动; scale 是手指当前间距与序列开始时间距的比值; angle 是本次事件中连接手指的线段方向与同一序列中上一事件方向的角度差(以度为单位)。

由于捏合事件仅在捏合序列开始或期间发送, 它们不会报告用户在触控板上双指旋转但不捏合的手势。

position 之后的所有参数均为浮点数。

该事件通常作为序列的一部分发送: 以用户将双指放在触控板上开始,以用户抬起手指结束。 在序列的第一个事件中,dxdyangle0.0; 后续事件会报告这些结构成员的非零值。

dxdy 以虚拟相对单位报告, 其中 1.0 分别对应触控板的宽度和高度。 它们通常被解释为相对于手势下方对象(图像、窗口等)的大小。

(preedit-text arg)

当系统输入法通知 Emacs 显示某些文本以向用户提示将要插入的内容时,发送此事件。 arg 的内容取决于所使用的窗口系统。

在 X 中,arg 是一个字符串,描述要放置在光标后的文本。 它可以是 nil,表示清除之前显示的任何文本。

在 PGTK 框架中(see Frames),arg 是一个字符串列表, 包含它们的颜色和下划线属性信息,格式如下:

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

可以省略颜色信息,只保留字符串文本。 underline-color 可以是 t,表示使用默认下划线颜色的下划线文本; 也可以是一个字符串,即绘制下划线所用颜色的名称。

这是一个特殊事件(see 特殊事件), 通常不应由用户绑定到任何命令。 Emacs 收到后通常会在光标后的覆盖层中显示事件包含的文本。

(drag-n-drop position files)

当在 Emacs 外部的应用程序中选中一组文件, 然后将其拖拽并放置到 Emacs 框架上时,生成此类事件。

position 是描述事件位置的列表,格式与鼠标点击事件相同(see 点击事件); files 是被拖拽文件的文件名列表。 处理此事件的通常方式是打开这些文件。

目前此类事件仅在某些类型的系统上生成。

help-echo

当鼠标指针移动到具有 help-echo 文本属性的缓冲区文本部分时,生成此类事件。 生成的事件格式如下:

(help-echo frame help window object pos)

事件参数的确切含义以及使用这些参数显示帮助提示文本的方式 在 Text help-echo 中描述。

sigusr1
sigusr2

当 Emacs 进程收到信号 SIGUSR1SIGUSR2 时生成这些事件。 它们不包含额外数据,因为信号不携带附加信息。 它们可用于调试(see 发生错误时进入调试器)。

要捕获用户信号,请在 special-event-map 中将对应的事件绑定到交互式命令(see 控制活跃按键映射表)。 该命令不带参数调用,具体的信号事件可在 last-input-event 中获取(see 事件输入的杂项功能)。 例如:

(defun sigusr-handler ()
  (interactive)
  (message "Caught signal %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 是新输入语言的数字 ID。 与 codepage 对应的编码系统(see Coding Systems) 是 cpcodepagewindows-codepage。 要将 language-id 转换为字符串(例如用于各种语言相关功能,如 set-language-environment), 可以使用 w32-get-locale-info 函数,如下所示:

;; Get the abbreviated language name, such as "ENU" for English
(w32-get-locale-info language-id)
;; Get the full English name of the language,
;; such as "English (United States)"
(w32-get-locale-info language-id 4097)
;; Get the full localized name of the language
(w32-get-locale-info language-id t)
end-session

在 MS-Windows 上,当操作系统通知 Emacs 用户终止了交互会话或系统正在关机时,生成此事件。 该事件的标准定义是调用 kill-emacs 命令(see Killing Emacs), 以便有序关闭 Emacs;如果存在未保存更改,将生成自动保存文件(see 自动保存), 用户可在重启会话后使用这些文件恢复未保存的编辑。

如果这些事件中的某一个在按键序列中间到达—即在前缀键之后— 那么 Emacs 会重新排列事件顺序,使该事件出现在多事件按键序列之前或之后,而不会插入其中。

其中一些特殊事件(如 delete-frame)默认会调用 Emacs 命令; 另一些则未绑定。 如果你想安排某个特殊事件调用命令,可以通过 special-event-map 实现。 你在该映射中绑定到功能键的命令可以在 last-input-event 中查看触发它的完整事件。 See 特殊事件.


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike