【问题标题】:Emacs key binding for multiple commands多个命令的 Emacs 键绑定
【发布时间】:2014-12-03 02:02:47
【问题描述】:

我是 emacs 新手,有一个菜鸟问题。我可以通过(global-set-key (kbd "C-c a b c") 'some-command) 将键绑定到特定函数,其中some-command 是一个函数。如何通过一键绑定调用两个函数(比如some-commandsome-other-command)?非常感谢!

【问题讨论】:

    标签: emacs elisp key-bindings


    【解决方案1】:

    您可以定义自己的函数来调用这两个函数,并将键绑定到您自己的函数。或者使用一个简单的 lambda:

    (global-set-key (kbd "C-c a b c") (lambda () (interactive) (some-command) (some-other-command)))
    

    【讨论】:

    • @Stefan 你能解释一下为什么不引用 lambdas 吗?
    • 这很好用。谢谢!不过,我对引用也有同样的问题 --- 我通常也会引用 lambda,并且想知道为什么不这样做。
    • @songyuanyao:因为'(...)是一个列表,而不是一个函数。见stackoverflow.com/questions/16801396/…
    • 另外,引用 lambdas 会损害字节编译。
    • 我可以在命令后跟随输入吗?例如:find-name-dired)enter*pytQ ..从这里继续@songyuanyao
    【解决方案2】:

    我建议永远不要将 lambda 表达式绑定到键,原因很简单,当您询问 Emacs 该键的作用时,它最终会告诉您类似的信息(以使用接受的代码,当字节编译时,作为示例):

    C-c a b c runs the command #[nil "\300 \210\301 \207" [some-command
    some-other-command] 1 nil nil], which is an interactive compiled Lisp
    function.
    
    It is bound to C-c a b c.
    
    (anonymous)
    
    Not documented.
    

    如果您从不对代码进行字节编译,那么它就不会那么神秘,但仍然是未格式化的:

    C-c a b c runs the command (lambda nil (interactive) (some-command)
    (some-other-command)), which is an interactive Lisp function.
    

    虽然在像这样的小函数的情况下仍然可读,但对于较大的函数很快变得难以理解。

    对比:

    C-c a b c runs the command my-run-some-commands, which is an
    interactive compiled Lisp function in `foo.el'.
    
    It is bound to C-c a b c.
    
    (my-run-some-commands)
    
    Run `some-command' and `some-other-command' in sequence.
    

    如果你命名函数,你会得到什么(这鼓励你比匿名函数更多地记录它)。

    (defun my-run-some-commands ()
      "Run `some-command' and `some-other-command' in sequence."
      (interactive)
      (some-command)
      (some-other-command))
    
    (global-set-key (kbd "C-c a b c") 'my-run-some-commands)
    

    最后,正如 abo-abo 指出的那样,这也意味着您可以随时轻松访问该函数的定义,以查看或编辑/重新评估代码,方法是遵循帮助缓冲区中提供的链接(在我的示例中为 foo.el),或使用 M-x find-function(输入函数名称)或 M-x @987654327 @(输入它绑定的键序列)。

    【讨论】:

    • 非常重要的是,您可以使用这种方法跳转到定义。
    【解决方案3】:

    定义一个命令,有条件地调用您想要的每个函数(命令)。使用前缀 arg 来区分调用哪个。因此,如果新的调度命令绑定到 C-o,则 C-u C-o 将调用其中一个函数,C-o(不带前缀 arg)将调用另一个函数。

    您将需要执行 C-h f interactive,以了解如何定义识别前缀参数的命令等。也请参阅 Elisp 手册 - 使用 i interactive 查找它在哪里教授这一点。

    这是一个简单而有趣的练习。学习定义自己的简单命令是开始使用 Emacs 自己的语言进行对话的好方法。

    【讨论】:

      【解决方案4】:

      您可以使用defun定义另一个函数,在其中您使用funcallapply调用其他函数,所以当您调用第三个函数(您也可以绑定)时,它将调用其他函数。

      【讨论】:

        猜你喜欢
        • 2011-03-04
        • 1970-01-01
        • 2011-02-20
        • 1970-01-01
        • 2017-09-14
        • 1970-01-01
        • 2012-01-23
        • 1970-01-01
        • 2021-11-07
        相关资源
        最近更新 更多