有时对鼠标进行 跟踪(track) 十分有用,这意味着显示某种内容以指示鼠标位置,并在鼠标移动时同步移动该指示器。为高效实现鼠标跟踪,你需要一种方式来等待鼠标真正发生移动。
实现鼠标跟踪的便捷方式是请求生成表示鼠标移动的事件。之后你可以通过等待事件来等待移动。此外,你还能轻松处理期间可能发生的其他各类事件。这一点很有用,因为通常你并不想永久跟踪鼠标—只需跟踪到某个其他事件发生为止,例如鼠标按键松开。
该宏在启用鼠标移动事件生成的情况下执行 body。通常,body 会使用 read-event 读取移动事件并相应地修改显示。See 移动事件,了解鼠标移动事件的格式。
track-mouse 的返回值为 body 中最后一个表达式的值。你应当设计 body 在检测到表示按键松开的抬起事件,或其他表示应当停止跟踪的事件时返回。该宏的返回值还会控制按住鼠标按键期间鼠标事件的上报方式:若为 dropping 或 drag-source,移动事件将相对于指针下方的框架上报。若不存在这样的框架,则事件将相对于首次按下鼠标按键时所在的框架上报。此外,若返回值为 drag-source,鼠标位置列表中的 posn-window 将为 nil。这可用于判断鼠标指针正下方是否存在直接可见的框架。
track-mouse 宏通过将变量 track-mouse 绑定为非 nil 值,使 Emacs 生成鼠标移动事件。若该变量取值为特殊值 dragging,它还会指示显示引擎保持鼠标指针形状不变。这在需要在 Emacs 显示区域大范围拖动鼠标的 Lisp 程序中很有必要,否则指针可能会根据悬停区域改变形状 (see 指针形状)。因此,需要在拖动期间保持鼠标指针原始形状的 Lisp 程序,应在 body 开头将 track-mouse 绑定为 dragging。
跟踪鼠标移动的常见用途是在屏幕上指示在当前位置按下或松开按键所产生的效果。
在很多场景下,你可以通过使用 mouse-face 文本属性 (see 具有特殊含义的文本属性) 避免手动跟踪鼠标。该机制运行在更低层级,比 Lisp 层的鼠标跟踪更流畅。