transient-mark-mode,pre-command-hook和with-current-buffer

时间:2014-05-27 08:11:05

标签: emacs elisp

我正在编写一个次要模式(键盘记录器),它通过自定义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)

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

问题不是set-bufferwith-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)。