emacs - 如何捕获 `M-0 <f4>` 事件并将其写入 Emacs 中该格式的缓冲区?

标签 emacs elisp

我正在努力将格式化的击键捕获到与VimGolf相关的缓冲区中。 minor mode我已经为此工作了几天了。

我有capture function几乎正是我想要的地方,只是它似乎无法捕获 kmacro-end-or-call-macro<f4> 触发的命令或calc-dispatchC-x * 触发的命令。我不确定还可能缺少什么,因为我的测试只暴露了这些异常情况。

如果您不想click over to github ,这是现在的功能:

(defun vimgolf-capture-keystroke ()
  (with-current-buffer (get-buffer-create vimgolf-keystrokes-buffer-name)
    (end-of-buffer)
    (if (not (or executing-kbd-macro prefix-arg))
        (progn
          (insert (key-description (this-command-keys)))
          (insert " ")))))

(defun vimgolf-capture-keystrokes ()
  (add-hook 'post-command-hook 'vimgolf-capture-keystroke))

(defun vimgolf-stop-capture-keystrokes ()
  (remove-hook 'post-command-hook 'vimgolf-capture-keystroke))

我所知道的两个问题函数之间的唯一联系是,它们在完成实际执行的命令之前都会递归执行其他命令。

通过将上面的捕获函数转换为:我可以捕获命令的开头,但不能捕获命令的结尾:

(defun vimgolf-capture-keystrokes ()
  (add-hook 'pre-command-hook 'vimgolf-capture-keystroke))

(defun vimgolf-stop-capture-keystrokes ()
  (remove-hook 'pre-command-hook 'vimgolf-capture-keystroke))

即使我关闭executing-kbd-macro由于附加到缓冲区的限制,它仍然没有捕获该事件。我尝试检查从命令后 Hook 得出的实际向量,在所有情况下,这正是我所期望的,但对于 <f4>它呈现一个空向量。

那么如何将这些键放入我的捕获缓冲区中?

<小时/>

为了方便起见,我一直在使用挑战 ID 4d2fb20e63b08b08b0000075 对此进行测试。 .

我按下的确切按键是 <f3> C-e M-4 M-b M-d C-b M-2 <C-S-backspace> M-2 C-y C-f <f4> M-0 <f4> C-o M-< C-x * : M-1 v r C-u y

这些键进入我的捕获缓冲区的方式与目前的功能是<f3> C-e M-4 M-b M-d C-b M-2 <C-S-backspace> M-2 C-y C-f <f4> C-o M-< : M-1 v r C-u y

最佳答案

我记得a package that can do this -- 我刚刚尝试了一下,它捕获了那些特定的键。出于您的目的,另一个好处是它将捕获的键限制为当前缓冲区。另外,您可以指定某些不会被记录的命令,这对于排除 vimgolf 特定的命令非常方便。 (顺便说一句;如果您为 vimgolf-mode 使用单独的“控制缓冲区”,即 ediff-mode,那么您将不会受到任何 vimgolf 特定的击键污染质询缓冲区的命令日志。)

上述包的限制(当前)是它不会捕获在迷你缓冲区中输入的击键(例如,对于M-x sort-lines RET),但是应该可以通过捕获键来扩展当(minibufferp)时。

该包的工作原理是 Hook 到您当前使用的 pre-command-hook 而不是 post-command-hook

关于emacs - 如何捕获 `M-0 <f4>` 事件并将其写入 Emacs 中该格式的缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8089292/

相关文章:

emacs - 使用 ESS/R 重构 R 代码

node.js - 设置 lintnode

emacs - 如何在 `.#filename` 中创建临时文件 `/tmp` ,而不是工作目录

emacs - 本地到 `let` 与本地到函数

bash - 在 emacs 终端中打开 emacs 缓冲区中的文件

emacs - 这个次要模式是什么——表示最近左边距的变化

ubuntu - 在 Emacs 25.2.2 中完全禁用鼠标滚动

emacs - 自定义内部链接的颜色 orgmode

emacs - Elisp 交互功能,具有输入历史记录

elisp - 如何从流程输出中删除换行符?