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

时间:2011-11-11 03:20:55

标签: emacs elisp

我正在努力将格式化的击键捕获到与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

2 个答案:

答案 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)

FWIW,如果你想要你可以在关键描述中没有尖括号 - 它们永远不是必需的(没有用处 - 只是噪音)。库naked.el允许您执行此操作。说明here