我正在努力将格式化的击键捕获到与VimGolf minor mode相关的缓冲区中,这些缓冲区我已经工作了好几天了。
我的capture function几乎就是我想要的地方,除了它似乎无法捕获kmacro-end-or-call-macro
触发的<f4>
命令或calc-dispatch
触发的C-x *
命令1}}。我不确定还有什么可能遗漏,因为我的测试只暴露了这些异常现象。
如果你不想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
,它仍然不会捕获该事件。我试图检查从post-command-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
答案 0 :(得分:4)
我记得a package that can do this - 我只是尝试了它,它捕获了那些特定的键。另一个好处是,为了您的目的,它将捕获的键限制为当前缓冲区。另外,您可以指定某些不会被记录的命令,这对于排除特定于vimgolf的命令很方便。 (另外;如果你为vimgolf-mode
使用单独的“控制缓冲区”,la ediff-mode
,那么你将不会获得任何特定于vimgolf的击键来攻击挑战缓冲区的命令日志。)< / p>
上述软件包的限制(当前)是它不会捕获在迷你缓冲区中输入的击键(例如,对于M-x sort-lines RET
),但是应该可以通过在(minibufferp)
时捕获密钥来扩展。
该程序包的工作方式是挂钩pre-command-hook
而不是您当前使用的post-command-hook
。
答案 1 :(得分:1)