【问题标题】:Emacs command history including commands called by keys and with arguments passed to themEmacs 命令历史记录,包括按键调用的命令和传递给它们的参数
【发布时间】:2014-07-16 15:46:46
【问题描述】:

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

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 函数中以编程方式按下按键序列,但它的用处很小。

【问题讨论】:

    标签: emacs macros elisp


    【解决方案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)))
    

    【讨论】:

    • 有没有办法提取传递给命令的参数?也许一个好名字可以是this-command-args的函数?
    • @JisangYoo 我不这么认为,但我可能忘记了一些事情——如果我错了,有人会纠正我。您也许可以在某个时候尝试使用全局变量values。但我怀疑这会有所帮助,因为可以访问完整命令(函数 + 实际参数)的代码是 callint.ccall-interactively 的 C 代码。但是你当然可以建议任何特定的命令来访问它的实际参数。
    【解决方案2】:

    如果有一种方法可以将键盘宏转换为一段 Elisp 代码,那就太好了,但是为了让这段 Elisp 代码有用,它应该有点惯用,但在许多情况下,惯用的 Elisp 代码做某事与键盘宏方式完全不同(例如,惯用代码不应使用标记和终止环来提取和移动文本)。

    所以转录并不简单。我认为写这种东西的方法是“从小处着手”并接受它不会 100% 可靠的事实。

    【讨论】:

      猜你喜欢
      • 2013-06-07
      • 2013-08-17
      • 2018-07-31
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多