更改缓冲区

时间:2015-05-14 17:12:19

标签: emacs elisp

我正在创建一个自定义.emacs文件(使用GNU Emacs 24.3.1),其中我有一个自定义函数,绑定到自定义快捷方式,复制所选区域“(kill-ring-save(region-开始)(region-end))“然后将其粘贴在不同的位置。然后我尝试选择一个新区域。但是当我这样做时,该区域不再突出显示。标记设置,因为我可以复制/粘贴。

如果我跳过功能中的粘贴步骤,则会突出显示新区域。只是以任何方式编辑缓冲区会导致区域突出显示停止工作。

来自https://www.fnal.gov/docs/products/emacs/emacs/emacs_12.html: “对缓冲区的任何更改(例如插入或删除字符)都会取消激活标记。这意味着在区域上运行的任何后续命令都会出错并拒绝操作。您可以通过键入Cx Cx使该区域再次激活。 “

C-x C-x只是调用(交换点和标记),但如果我在我的函数中调用(交换点和标记),突出显示仍然不会再次打开。为什么不呢?

免责声明:我对emacs并不熟悉,我只是对一些正常工作的代码进行试验和错误,但在编辑缓冲区后,我找不到突出显示所选区域的方法。我的解决方法是在我的.emacs中调用一个不同的函数,绑定到一个不同的快捷方式,只需调用(交换点和标记),然后突出显示以前选择的区域。

编辑:添加代表性代码

(defun func1 ()
  (interactive)
  (set-mark (point))
  (forward-char)
  (forward-char) ; at this point two characters are highlighted
  (set-mark (point))
  (forward-char)
  (forward-char) ; at this point two different characters are highlighted
)

(defun func2 ()
  (interactive)
  (set-mark (point))
  (forward-char)
  (forward-char) ; at this point two characters are highlighted
  (insert "a")
  (set-mark (point))
  (forward-char)
  (forward-char) ; at this point nothing is highlighted because of the insert, but the mark IS set
)

(defun func3 ()
  ; if I call this right after calling func2 the region is highlighted
  (interactive)
  (exchange-point-and-mark)
)

(global-set-key (kbd "<f5> x") 'func1)
(global-set-key (kbd "<f5> c") 'func2)
(global-set-key (kbd "<f5> v") 'func3)

1 个答案:

答案 0 :(得分:1)

[这是在评论讨论后重新编辑]

确保启用transient-mark-mode后(这就是hilighting),可能没有太多其他工作可以完成这项工作。

我的推测是transient-mark-mode在关键输入之间的空闲时间内工作,它可能只是测试缓冲区自上次运行以来是否被修改,在这种情况下,任何函数都试图设置并激活标记,以便显示一些hilighting,同时修改缓冲区,永远不会成功触发transient-mark-mode hilight任何东西。