emacs - transient 标记模式、预命令 Hook 和带电流缓冲区

标签 emacs elisp

我正在编写一个次要模式(键盘记录器),它通过自定义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-bufferwith-current-buffer 而是设置 deactivate-markinsert > 全局。 通常的解决方法是让您的 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/

相关文章:

emacs - 如何分割 emacs 屏幕以使回显缓冲区位于水平右侧?

emacs - 需要帮助关闭端口列表中信号后的重新对齐注释。 (Verilog 模式)

git - emacs 临时文件的奇怪 .gitignore 行为

emacs - 如何只在某些模式下显示工具栏?

emacs - Emacs Elscreen-如何禁用“分屏”?

emacs - 确定模式行中的窗口焦点?

Emacs 自动完成 : the function `define-package` is not known

python - 为什么我在 Emacs 中得到了太多的标签?

emacs - 无论主要模式如何,如何强制使用空格而不是制表符?

linux - 更改 emacs 字体(菜单中没有 "set default font"选项;.emacs 脚本不起作用)