更改缓冲区后,标记区域不会在emacs中突出显示

更改缓冲区后,标记区域不会在emacs中突出显示,emacs,elisp,Emacs,Elisp,我正在创建一个自定义的.emacs文件(使用GNU emacs 24.3.1),其中有一个自定义函数,绑定到一个自定义快捷方式,该函数复制选定的区域“(kill ring save(区域开始)(区域结束)),然后将其粘贴到另一个位置。然后我尝试选择一个新区域。但当我这样做时,该地区不再突出显示。标记已设置,因为我可以复制/粘贴 如果跳过函数中的粘贴步骤,新区域将高亮显示。只是以任何方式编辑缓冲区都会导致区域高亮显示停止工作 发件人: 对缓冲区的任何更改(如插入或删除字符)都会停用标记。这意味着对

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

如果跳过函数中的粘贴步骤,新区域将高亮显示。只是以任何方式编辑缓冲区都会导致区域高亮显示停止工作

发件人: 对缓冲区的任何更改(如插入或删除字符)都会停用标记。这意味着对某个区域进行操作的任何后续命令都会出错并拒绝操作。您可以通过键入C-x C-x使该区域再次处于活动状态

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

免责声明:我对emacs不太熟悉,我只是在试用一些工作代码,但在编辑缓冲区后,我找不到突出显示所选区域的方法。我的解决方法是在My.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)
(defun func1()
(互动)
(设定标记(点))
(向前字符)
(向前字符);此时突出显示两个字符
(设定标记(点))
(向前字符)
(向前字符);此时突出显示两个不同的字符
)
(defun func2()
(互动)
(设定标记(点))
(向前字符)
(向前字符);此时突出显示两个字符
(插入“a”)
(设定标记(点))
(向前字符)
(向前字符);此时,由于插入,不会突出显示任何内容,但会设置标记
)
(defun func3()
;如果我在调用func2之后立即调用此函数,则区域将高亮显示
(互动)
(交换点和标记)
)
(全局设置键(kbd“x”)'func1)
(全局设置键(kbd“c”)'func2)
(全局设置键(kbd“v”)功能3)

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

确保启用了
瞬态标记模式
(这就是hilighting的作用)后,可能没有其他方法可以实现此功能


我的推测是,
瞬态标记模式
在键输入之间的空闲时间内工作,它可能只是测试缓冲区自上次运行以来是否被修改,在这种情况下,任何试图设置和激活标记的功能都会显示一些hilighting,同时修改缓冲区时,将无法成功触发
瞬态标记模式
以点亮任何东西。

显示您的代码。我们猜不出你在干什么。必须清理(瞬态标记模式1)无效(我尝试了各种组合)在尝试测试之前(和之后)是否检查了缓冲区的活动模式?(即调用
描述模式
)基本模式始终启用:启用次要模式:自动合成自动压缩自动加密删除选择文件名阴影字体锁定全局字体锁定Gpm鼠标线号菜单栏鼠标滚轮工具栏工具提示瞬变标记Xterm鼠标次要模式未更改HMMM。。。。好的,
transient mark mode
看起来确实启用了,并且保持启用状态。您看到的影响可能是一个bug,但它也可能与
瞬态标记模式
(用C实现,而不是elisp)检测缓冲区是否有修改有关,即它是否应该做任何事情。我的猜测是,它只在顶级交互调用函数之间进行尝试,并且由于在`func2中,缓冲区在该顶级函数中被修改,因此它认为一旦该函数返回,就不应该执行任何hilighting操作。是否可能以某种方式触发两个顶级函数以一个热键交互运行?