编辑器命令循环会设置若干 Lisp 变量,用于记录自身及所运行命令的
状态。除 this-command 和 last-command 外,在 Lisp
程序中修改这些变量通常是不推荐的做法。
该变量记录命令循环执行的上一个命令(当前命令的前一个)的名称。 其值通常是带有函数定义的符号,但不保证一定如此。
当一个命令返回命令循环时,该变量的值会从 this-command 复制,
除非该命令为后续命令指定了前缀参数。
此变量始终是当前终端的局部变量,且不能是缓冲区局部变量。 See Multiple Terminals。
Emacs 会像设置 last-command 一样初始化该变量,
但 Lisp 程序不会修改它。
该变量存储最近执行的、不属于输入事件的命令。这是 repeat
函数会尝试重复执行的命令(See Repeating in The GNU Emacs Manual)。
该变量记录编辑器命令循环正在执行的命令名称。与 last-command
类似,其值通常是带有函数定义的符号。
命令循环会在运行命令前设置该变量,并在命令结束时将其值复制到
last-command(除非该命令为后续命令指定了前缀参数)。
部分命令会在执行期间设置该变量,作为后续运行命令的标志。
特别是文本删除类函数会将 this-command 设置为
kill-region,以便紧随其后的删除命令知晓应将新删除的文本
追加到上一次删除的内容之后。
如果不希望某个命令在出错时被识别为上一个命令,你必须在该命令中
编写相应逻辑来防止这种情况。一种方法是在命令开始时将
this-command 设置为 t,并在结束时恢复其原始值:
(defun foo (args...)
(interactive ...)
(let ((old-this-command this-command))
(setq this-command t)
...do the work...
(setq this-command old-this-command)))
我们不使用 let 绑定 this-command,因为 let
在出错时会恢复旧值 — 而这正是我们要避免的行为。
除命令重映射发生时(see 命令重映射),该变量的值与
this-command 相同。发生重映射时,this-command 表示
实际运行的命令(重映射的结果),而 this-original-command
表示原本指定要运行但被重映射为其他命令的原命令。
该变量的值与 this-command 相同,但在进入迷你缓冲区时会被递归绑定。
迷你缓冲区钩子等场景可通过该变量确定启动当前迷你缓冲区会话的命令。
该函数返回包含触发当前命令的按键序列的字符串或向量。
命令通过 read-event(无超时)读取的所有事件都会追加到末尾。
但若命令调用了 read-key-sequence,则该函数返回最后读取的按键序列
(See 读取按键序列)。如果序列中的所有事件都是可存储在字符串中的字符,
则返回值为字符串(See 输入事件)。
(this-command-keys)
;; Now use C-u C-x C-e to evaluate that.
⇒ "^X^E"
与 this-command-keys 类似,但始终以向量形式返回事件,
因此无需处理将输入事件存储在字符串中的复杂问题(see 将键盘事件存入字符串)。
该函数清空 this-command-keys 用于返回的事件表。
除非 keep-record 为非 nil,否则还会清空
recent-keys 函数后续要返回的记录(see Recording Input)。
读取密码后使用此函数非常有用,可防止密码在某些情况下作为下一个命令的一部分意外回显。
该变量保存作为按键序列一部分读取的最后一个输入事件(不计入鼠标菜单产生的事件)。
该变量的一个用途是告知 x-popup-menu 在哪里弹出菜单,
也被 y-or-n-p 内部使用(see Yes-or-No 查询)。
该变量被设置为命令循环读取的、作为命令一部分的最后一个输入事件。
该变量的主要用途是在 self-insert-command 中(用于决定插入哪个字符),
以及在 post-self-insert-hook 中(see User-Level Insertion Commands,
用于获取刚插入的字符)。
last-command-event
;; Now use C-u C-x C-e to evaluate that.
⇒ 5
值为 5 是因为这是 C-e 的 ASCII 编码。
该变量记录最后一个输入事件发往的框架。通常是事件生成时被选中的框架, 但如果该框架已将输入焦点重定向到另一框架,则值为事件被重定向到的框架。 See Input Focus。
如果最后一个事件来自键盘宏,则值为 macro。
输入事件一定有来源;有时是键盘宏、信号或
unread-command-events,但通常是来自用户操作的、连接到
计算机的物理输入设备。这些设备被称为 输入设备(input devices),Emacs 会
将每个输入事件与其来源的输入设备关联起来。它们用对每个输入
设备唯一的名称来标识。
能否确定具体使用的输入设备取决于各个系统的细节。当无法获取 该信息时,Emacs 会将键盘事件报告为来自 ‘"Virtual core keyboard"’,其他事件报告为来自 ‘"Virtual core pointer"’。(这些值在所有平台上都使用, 因为当无法获取详细设备信息时,X 服务会报告这些值。)
该变量记录最后读取的输入事件所来自的输入设备名称。
如果不存在这样的设备(即最后一个输入事件来自
unread-command-events 或来自键盘宏),则为 nil。
在 X Windows 上使用 X Input 扩展时,设备名称是一个字符串, 唯一标识连接到 X 服务的每个物理键盘、定位设备和触摸屏。 否则,根据事件是由定位设备(如鼠标)还是键盘生成, 它的值为字符串 ‘"Virtual core pointer"’ 或 ‘"Virtual core keyboard"’。
设备有多种不同类型,可以从它们的名称判断。该函数可用于判断 来自 frame 框架的事件所对应设备 name 的正确类型。
返回值是下列符号之一(“设备类别(device classes)”):
core-keyboard核心键盘;表示该设备是类键盘设备,但其他特性未知。
core-pointer核心指针;表示该设备是定位设备,但其他特性未知。
mouse计算机鼠标。
trackpoint指点杆或游戏杆(或其他类似控制装置)。
eraser绘图板手写笔的另一端,或独立橡皮擦。
pen绘图板上的笔尖、手写笔或其他类似设备。
puck外观类似鼠标,但报告相对于某个表面的绝对坐标的设备。
power-button电源按钮或音量按钮(或其他类似控制装置)。
keyboard计算机键盘。
touchscreen触摸屏。
pad通常位于绘图板周围的一组感应按钮、圆环和触控条。
touchpad间接触摸设备,如触控板。
piano电子琴等乐器。
testXTEST 扩展用于上报输入的测试设备。