Emacs命令历史记录包括由键调用的命令以及传递给它们的参数

时间:2014-07-16 15:46:46

标签: emacs macros elisp

有没有办法用参数显示完整的命令历史记录?

repeat-complex-command绑定到:

<again>, <redo>, C-x M-:, C-x M-ESC

不显示从键绑定调用的命令,kmacro-edit-macro(绑定到C-x C-k RET)不显示传递给命令的参数。

动机。将键盘宏转换为elisp函数会更快。现在,我调用kmacro-edit-macro来查看要使用的命令的名称,然后通过逐个阅读命令文档来计算要传递的参数。 (示例工作流程:https://stackoverflow.com/a/24784563/1446335

请注意。可以以编程方式从elisp函数中按下键序列,但它的用处很小。

2 个答案:

答案 0 :(得分:1)

是的,要获得所需内容,请使用pre-command-hook来调用将给定命令添加到extended-command-history的函数。例如,这是Icicles代码将菜单执行的命令添加到此历史记录中的功能:

;; This is done when you turn on Icicle mode.
(if icicle-menu-items-to-history-flag
    (add-hook 'pre-command-hook 'icicle-add-menu-item-to-cmd-history)
  (remove-hook 'pre-command-hook 'icicle-add-menu-item-to-cmd-history))

(defun icicle-add-menu-item-to-cmd-history ()
  "Add `this-command' to command history, if it is a menu item.
Menu items that are not associated with a command symbol are ignored.
Used on `pre-command-hook'."
  (condition-case nil                   ; Just in case, since this is on `pre-command-hook'.
      (when (and (> (length (this-command-keys-vector)) 0)
                 (equal '(menu-bar) (elt (this-command-keys-vector) 0))
                 ;; Exclude uninterned symbols such as `menu-function-356'.
                 (symbolp this-command) (or (< emacs-major-version 21)  (intern-soft this-command)))
        (pushnew (symbol-name this-command) extended-command-history))
    (error nil)))

答案 1 :(得分:1)

有一种方法可以将键盘宏转换为一大块Elisp代码,但是为了使这一块Elisp代码变得有用,它应该是有点惯用的,但在很多情况下,惯用的Elisp代码做一些事情与键盘 - 宏的方式完全不同(例如,惯用代码不应该使用标记和杀死环来提取和移动文本)。

所以转录不是直截了当的。我认为写这样一个东西的方法是从小开始#34;并接受它不会100%可靠的事实。