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

如何捕获'M-0<;f4>;`事件并在Emacs中以该格式将其写入缓冲区?,emacs,elisp,Emacs,Elisp,我正在将格式化的击键捕获到一个缓冲区,该缓冲区与我已经工作了几天的 我几乎在我想要的地方就有了它,除了它似乎无法捕获由触发的kmacro end或call宏命令或由C-x*触发的calc dispatch命令之外。我不确定还有什么可能遗漏,因为我的测试只暴露了这些异常 如果您不想这样做,以下是目前的功能: (defun vimgolf-capture-keystroke () (with-current-buffer (get-buffer-create vimgolf-keystrokes

我正在将格式化的击键捕获到一个缓冲区,该缓冲区与我已经工作了几天的

我几乎在我想要的地方就有了它,除了它似乎无法捕获由
触发的
kmacro end或call宏
命令或由
C-x*
触发的
calc dispatch
命令之外。我不确定还有什么可能遗漏,因为我的测试只暴露了这些异常

如果您不想这样做,以下是目前的功能:

(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)) (取消捕获击键() (使用当前缓冲区(获取缓冲区创建按键缓冲区名称) (缓冲区结束) (如果(不是(或执行kbd宏前缀arg)) (项目 (插入(键说明(此命令键))) (插入“;”)) (取消捕获击键() (添加钩子“后命令钩子”和“捕捉击键”) (定义停止捕捉击键() (从捕捉击键中移除挂钩“后命令挂钩”) 我所知道的这两个问题函数之间唯一的联系是,它们都在完成实际执行的命令之前递归执行其他命令

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

(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)) (取消捕获击键() (在捕捉击键时添加钩子“预命令钩子”) (定义停止捕捉击键() (从捕捉击键中移除挂钩“预命令挂钩”) 即使我从附加到缓冲区的限制中关闭执行kbd宏的
,它仍然不会捕获该事件。我试图检查post命令钩子中的实际向量,在所有情况下,它都是我所期望的,但是对于
,它呈现一个空向量

那么如何将这些密钥放入捕获缓冲区呢


为了方便起见,我一直在使用质询ID
4D2FB20E63B08B008B0000075
测试这个问题

我按下的确切键是
C-em-4m-bm-ddc-bm-2m-2c-yc-yc-fm-0c-om-

这些键进入我的捕获缓冲区的方式和它现在的功能是
C-em-4m-bm-d C-bm-2m-2c-yc-f C-o M-<:M-1v r C-u y

我记得--我刚刚试过,它捕获了那些特定的键。出于您的目的,另一件好事是它将捕获的密钥限制在当前缓冲区内。另外,您可以指定某些不会被记录的命令,这对于排除特定命令非常方便。(旁白;如果您为
vimgolf模式
使用单独的“控制缓冲区”,为la
ediff模式
,则不会收到任何vimgolf特定的击键污染质询缓冲区的命令日志。)

上述软件包(目前)的限制是,它不会捕获在minibuffer中输入的击键(例如,对于
M-x排序行RET
),但当
(minibuffer p)
时,也可以通过捕获键来扩展


该包通过挂接到当前使用的
命令前钩子
而不是
命令后钩子
来工作。

FWIW,如果您愿意,您可以不使用键描述中的尖括号——它们从来都不是必需的(没有任何用途——只是噪音)。库允许您这样做。描述