<double-mouse-1>绑定的选择单词/符号功能是什么


11

我喜欢在鼠标双击时选择单词/符号的功能。我希望能够通过键盘来完成此操作,因此我想将其绑定到击键(或者可能已经绑定了?),所以我需要函数的名称。我认为该功能必须已经存在,但是我无法弄清楚它的名称是什么。

我尝试过,C-h k但是当我双击鼠标时,会<down-mouse-1>显示帮助信息(我认为帮助系统不会等待第二次单击或类似的操作)。我还在21.2节中定义了此功能的文档中进行了搜索,但没有说明该功能的名称。

更新:对于典型的键绑定,我想它分别等于<C-left>跟着的<C-S-right>是are left-word和and right-word,尽管为后者保留了shift键。(我不完全了解带有Shift键的键盘名称与它们到功能的映射之间的关系,在<C-S-right><C-right>其标识为之前将其转换为帮助right-word


使用C-h b并搜索该缓冲区显示了具有特定事件的<double-mouse-1>调用mouse-set-point(来自“ mouse.el”)。不知道这有多大帮助:)
VanLaser

1
对于C右和C左的偏移版本和非偏移版本之间的关系,这是的作用shift-selection-mode(请参阅参考资料(info "(emacs) Shift Selection"))。另请参阅emacs.stackexchange.com/questions/12858/…–
YoungFrog

@YoungFrog这种复杂性通常会使我的大多数emacs程序保持为键盘宏。一个简单的kbd宏基于, <right> <C-left> <C-S-right>我不需要完全解决该链接中详细讨论的细微问题。
Chip Grandits

Answers:


9

实际上有点复杂。双击时mouse-1有多个动作。<down-mouse-1>当您按下按钮时,首先发生。然后mouse-1,当您释放按钮时。

<down-mouse-1>绑定到命令mouse-drag-region,并且该命令调用mouse-drag-track。该函数计算鼠标单击的次数并跟踪任何鼠标的移动(如果双击,则表示您没有移动鼠标)。

mouse-drag-track调用函数mouse-start-end 来确定要选择的文本范围。它mouse-start-end作为第三个参数传递到您单击的位置,前两个参数和点击计数。这是mouse-start-end

mouse-start-end is a compiled Lisp function in `mouse.el'.

(mouse-start-end START END MODE)

Return a list of region bounds based on START and END according to MODE.
If MODE is 0 then set point to (min START END), mark to (max START END).
If MODE is 1 then set point to start of word at (min START END),
mark to end of word at (max START END).
If MODE is 2 then do the same for lines.

作为第三个参数(MODE)传递的点击数是1。

您将无法仅从键盘按键序列中调用其中一些代码,但是检查代码可能有助于您编写键盘可绑定命令来完成所需的操作。


感谢您解释为什么 C-h k不适用于鼠标事件。我发现调查Emacs如何“处理鼠标”的最好方法是将其记录为键盘宏,命名,然后查看由生成的代码。insert-kbd-macro 通常,我不会尝试在鼠标中使用鼠标事件。宏,因此这些临时宏仅对了解Emacs的工作很有用。
Chip Grandits

6

@Drew解释了与绑定到鼠标动作的事件相关的一些复杂性。至于使用键盘在该点标记单词的最终目标,您可能对expand-region感兴趣。

expand-region允许您通过语义单位来操纵区域。例如,当没有区域处于活动状态时,调用er/expand-region(通常绑定到C-=)将标记当前单词。再次调用它将区域扩展到当前句子。然后是段落,段落等。实际单位将取决于您所处的模式,因此在大写模式下,它们将是符号,包含符号的表达式,包含该表达式的表达式等。

链接的页面有进一步的说明和演示该视频的视频。


1
是的,我在melpa的软件包列表中看到expand-region软件包。非常有用,我很惊讶它不是Emacs中的默认值,或者至少与CEDET捆绑在一起。谢谢你的提示!
Chip Grandits '16

Chip Grandits:这取决于作者将其软件包提交给FSF并进行适当的版权分配。如果作者未提交,它就不能成为Emacs的默认部分。
phils 2016年

2

这是我从中提取的函数,mouse-set-region当您双击时会做标记:

(defun ora-mark-like-double-mouse-1 ()
  (interactive)
  (let ((bnd (mouse-start-end (point) (point) 1)))
    (goto-char (car bnd))
    (push-mark)
    (set-mark (point))
    (goto-char (cadr bnd))))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.