我正在将格式化的按键捕获到与VimGolf minor模式相关的缓冲区中,我已经工作了几天了。
我几乎完全在我想要的地方拥有捕获功能,除了它似乎无法捕获由<f4>
触发的kmacro-end-or-call-macro
命令或由C-x *
触发的calc-dispatch
命令。我不确定还有什么潜在的缺失,因为我的测试只暴露了这些异常。
如果你不想点击到github,下面是现在的函数:
<>之前(defun vimgolf-capture-keystroke)(with-current-buffer (get-buffer-create vimgolf-keystrokes-buffer-name))(end-of-buffer)(if (not(或execute -kbd-macro prefix-arg))(progn(insert (key-description (this-command-keys)))(插入")))))"(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)(删除钩子'预命令钩子'vimgolf-capture-keystroke))之前即使我将executing-kbd-macro
从附加到缓冲区的限制中关闭,它仍然没有捕获该事件。我试着检查从后命令钩子下来的实际向量,在所有情况下,这正是我所期望的,但对于<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
我记得有一个包可以做到这一点——我刚刚试用了一下,它捕获了那些特定的键。另一个好处是,它将捕获的键限制在当前缓冲区中。另外,您可以指定某些不会被记录的命令,这对于排除特定于vimgolf的命令非常方便。(题外话,如果您为vimgolf-mode
使用单独的"控制缓冲区",而不是ediff-mode
,那么您将不会得到任何特定于vimgolf的击键,从而污染挑战缓冲区的命令日志。
前面提到的包的限制(目前)是它不会捕获在minibuffer中输入的按键(例如M-x sort-lines RET
),但应该可以通过捕获(minibufferp)
时的按键来扩展。
该包通过钩接pre-command-hook
而不是当前使用的post-command-hook
来工作。
如果你愿意,你可以在关键字描述中不使用尖括号——它们从来都不是必要的(没有任何用途——只是噪音)。库naked.el
允许您这样做。这里描述。