【问题标题】:Programmatically selecting a region以编程方式选择区域
【发布时间】:2012-07-27 14:32:43
【问题描述】:

我想通过点击C-Space + 移动箭头键执行相同的操作,但在 elisp 中。

未能找到正确的函数(如果它们只是按逻辑分组在命名空间中或以某种方式标记...)。是哪一个?

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    您可以使用 C-h k key 将击键转换为 elisp。

    您会注意到用于设置标记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 在最后保持标记处于活动状态,否则该区域将不会保持突出显示(尽管点和标记将是您离开它们的位置)。

    【讨论】:

    • 如果我将点设置在行尾,然后运行(set-mark-command 0),点会移动但标记不会移动,因此不会选择任何内容。我错过了什么?谢谢。
    • 在区域的开头设置标记,然后将点移动到结尾。此外,arg 实际上应该是 nil 而不是零。我已经用一个例子更新了我的答案。
    • 该功能有效(谢谢!)我没有得到视觉反馈,即deactivate-mark 似乎没有什么不同。无论如何,对我的特定目的来说并不重要。
    • 只有当您使用(interactive) 将其定义为交互式命令并使用M-x command-name 调用它或将其绑定到某个键时,视觉反馈才会起作用。
    • 如何移动到缓冲区末尾或帧末尾?
    【解决方案2】:

    你应该在emacs lisp代码中使用push-mark,如下:

    (defun mark-n (n)
      "Programmtically mark the next N lines"   
      (interactive "nNum lines to mark: ")
      (push-mark)  
      (next-line n))
    

    【讨论】:

      【解决方案3】:

      以防万一此附加信息对其他人有用,我发现以下内容:

      • 关于程序化移动,请参阅Moving Point
      • (point)(mark) 检索它们各自的位置,例如,可以使用 (set-mark (+ 5 (mark)))

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我认为我必须使用set-mark。但是它的 POS 参数的预期类型是什么?
        猜你喜欢
        • 1970-01-01
        • 2012-05-22
        • 2012-03-26
        • 2012-10-16
        • 1970-01-01
        • 2016-12-05
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多