我正在努力将格式化的击键捕获到与VimGolf相关的缓冲区中。 minor mode我已经为此工作了几天了。
我有capture function几乎正是我想要的地方,只是它似乎无法捕获 kmacro-end-or-call-macro
由 <f4>
触发的命令或calc-dispatch
由 C-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/