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



我正在将格式化的按键捕获到与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允许您这样做。这里描述

最新更新