以编程方式选择区域
问题描述:
我想要执行的操作与通过按下C-Space
+移动箭头键但在elisp中执行的操作相同。以编程方式选择区域
无法找到正确的功能(如果他们只是在逻辑上分组在名称空间或以某种方式标记...)。哪一个?
答
您可以使用将键盘翻译为elisp C-h k 密钥。
您会注意到用于设置标记set-mark-command
的elisp函数,它带有一个非可选参数。 Emacs使用特殊的interactive
函数来允许elisp函数自然地用参数写入。这允许它们是通用的并且易于在其他elisp程序中重用,同时仍然可以从击键直接调用。它还具有一些内置的前缀逻辑的C-u。
在set-mark-command
的情况下,其第一个功能是(interactive "P")
,这意味着从键盘调用前缀作为参数传入。您可以直接在elisp的与模拟这个:
(set-mark-command nil)
例如,要选择在elisp的当前行:
(defun my-select-current-line()
(interactive)
(move-beginning-of-line nil)
(set-mark-command nil)
(move-end-of-line nil)
(setq deactivate-mark nil))
注意你必须告诉Emacs的离开标志活跃在年底要不然该地区将不会突出显示(尽管点和标记将是您离开他们的地方)。
答
您应该使用在Emacs推标志Lisp代码,如下所示:
(defun mark-n (n)
"Programmtically mark the next N lines"
(interactive "nNum lines to mark: ")
(push-mark)
(next-line n))
答
万一这个附加信息是利用别人,我发现以下几点:
- 至于编程式运动,请参见Moving Point
-
(point)
和(mark)
检索它们各自的位置,因此可以做(set-mark (+ 5 (mark)))
,例如。
如果我将这个点设置在一行的末尾,然后运行'(set-mark-command 0)',那么点会移动但不是标记,因此没有任何选择。我错过了什么?谢谢。 – vemv 2012-07-27 15:08:47
在该区域的起点处设置标记,然后将该点移动到最后。另外,arg实际上应该是“零”而不是零。我用一个例子更新了我的答案。 – ataylor 2012-07-27 15:38:33
功能有效(谢谢!)我没有获得视觉反馈,即'deactivate-mark'似乎没有什么区别。无论如何,这对我的特殊目的不重要。 – vemv 2012-07-27 17:36:57