我正在编写一个次要模式(键盘记录器),它通过自定义pre-command-hook
存储有关每个命令的详细信息(时间戳等)。但它不能很好地与 transient-mark-mode
配合使用 - 特别是通过 with-current-buffer
在钩子(Hook)中将另一个缓冲区设置为事件状态似乎会填满事件区域在我实际正在处理的缓冲区中。
我打开了transient-mark-mode
,当我C-SPC
并四处移动点时,事件区域会像平常一样突出显示,并且所有事件区域都会突出显示。 -region 命令有效。但是,一旦我添加了包含对 with-current-buffer
调用的日志记录 Hook ,我就无法再突出显示区域了。
最小损坏示例:
(defun test-pre-command-hook ()
(with-current-buffer (get-buffer-create "*test-buffer*")
(insert "foo")))
(add-hook 'pre-command-hook 'test-pre-command-hook)
此时,C-h vtransient-mark-mode
仍然是t
,但在视觉上事件区域并未突出显示,并且在事件区域上工作的命令例如comment-dwim
不起作用。
一旦我取下钩子(Hook),事情就又恢复了。
(remove-hook 'pre-command-hook 'test-pre-command-hook)
有什么想法吗?
最佳答案
问题不是 set-buffer
或 with-current-buffer
而是设置 deactivate-mark
的 insert
> 全局。
通常的解决方法是让您的 pre-command-hook 周围绑定(bind) deactivate-mark
:
(defun test-pre-command-hook ()
(let (deactivate-mark)
(with-current-buffer (get-buffer-create "test-buffer")
(insert "foo"))))
请注意,这个问题有望在当前的 Emacs 主干中得到解决(即可能会成为 Emacs-24.5)。
关于emacs - transient 标记模式、预命令 Hook 和带电流缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23884218/