以编程方式选择区域

问题描述:

我想要执行的操作与通过按下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的离开标志活跃在年底要不然该地区将不会突出显示(尽管点和标记将是您离开他们的地方)。

+0

如果我将这个点设置在一行的末尾,然后运行'(set-mark-command 0)',那么点会移动但不是标记,因此没有任何选择。我错过了什么?谢谢。 – vemv 2012-07-27 15:08:47

+0

在该区域的起点处设置标记,然后将该点移动到最后。另外,arg实际上应该是“零”而不是零。我用一个例子更新了我的答案。 – ataylor 2012-07-27 15:38:33

+0

功能有效(谢谢!)我没有获得视觉反馈,即'deactivate-mark'似乎没有什么区别。无论如何,这对我的特殊目的不重要。 – vemv 2012-07-27 17:36:57

该区域是pointmark之间的缓冲区的一部分。

+0

我想我必须使用'set-mark'。但是它的POS参数的预期类型是什么? – vemv 2012-07-27 14:54:43

您应该使用在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))),例如。