2014-12-03 79 views
9

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

回答

10

您可以定义自己的调用两个函数的函数,并将该函数绑定到您自己的函数中。或者使用一个简单的λ:

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

@Stefan请问你解释为什么不引用lambdas? – songyuanyao 2014-12-03 03:27:15

+0

这很好用。谢谢!虽然我有同样的问题 - 我通常也引用lambdas,并想知道为什么不。 – 2014-12-03 03:36:06

+2

@songyuanyao:因为''(...)'是*列表*,而不是*函数*。请参阅http://stackoverflow.com/questions/16801396/when-should-emacs-function-syntax-be-used/16802304#16802304 – Stefan 2014-12-03 04:20:52

0

您可以定义另一个functon与defun在你调用别人用funcallapply所以,当你调用这个第三个功能(你也可以绑定),它会调用其他人。

1

定义一个命令,可以有条件地调用所需的每个函数(命令)。使用前缀arg来区分要调用的内容。因此,如果新的调度命令被绑定到C-o,那么C-u C-o将调用其中一个功能,C-o(不带前缀arg)会调用另一个功能。

你会想要做C-h f interactive,看看如何定义一个识别前缀参数的命令等。另请参阅Elisp手册 - 使用i interactive找到它在哪里教这个。

这是一个简单而有趣的练习。学习定义自己的简单命令是开始以自己的语言与Emacs交谈的好方法。

15

我建议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)在帮助缓冲区提供,或者通过使用的Mxfind-function(输入函数的名称),或的Mxfind-function-on-key(键入它绑定到按键序列)。

+2

非常重要的是,您可以使用这种方法跳转到定义。 – 2014-12-03 09:45:02