我正在编写一个次要模式(键盘记录器),它通过自定义pre-command-hook
存储有关每个命令的详细信息(时间戳等)信息。但它与transient-mark-mode
不能很好地协同工作 - 特别是在with-current-buffer
的钩子中将另一个缓冲区设置为活动状态似乎填满了我实际正在处理的缓冲区中的活动区域。
我已启用transient-mark-mode
,当我C-SPC
并移动点时,活动区域会正常突出显示,并且所有活动区域命令都有效。但是,一旦我添加了包含对with-current-buffer
的调用的日志记录挂钩,那么我就无法突出显示区域了。
最小破坏的例子:
(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 v transient-mark-mode
仍为t
,但在视觉上未突出显示活动区域,以及在活动区域上工作的命令,例如comment-dwim
不起作用。
一旦我取下钩子,事情就会变得很糟糕。
(remove-hook 'pre-command-hook 'test-pre-command-hook)
有什么想法吗?
答案 0 :(得分:2)
问题不是set-buffer
或with-current-buffer
,而是insert
全局设置deactivate-mark
。
通常的解决方法是在前命令挂钩周围绑定deactivate-mark
:
(defun test-pre-command-hook ()
(let (deactivate-mark)
(with-current-buffer (get-buffer-create "test-buffer")
(insert "foo"))))
请注意,有希望在当前的Emacs主干中修复此问题(即可能会成为Emacs-24.5)。