我是emacs的新手,并且有一个菜鸟问题。我可以通过(global-set-key (kbd "C-c a b c") 'some-command)
将键绑定到特定函数,其中some-command
是一个函数。如何使用一个键绑定调用两个函数(例如some-command
和some-other-command
)?非常感谢!
答案 0 :(得分:18)
我建议永远不要将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
),或者使用 Mx find-function
(输入函数名称)或 Mx find-function-on-key
(键入它绑定的键序列)。
答案 1 :(得分:17)
您可以定义自己的函数来调用这两个函数,并将该键绑定到您自己的函数。或者使用简单的lambda:
(global-set-key (kbd "C-c a b c") (lambda () (interactive) (some-command) (some-other-command)))
答案 2 :(得分:1)
定义一个命令,有条件地调用所需的每个函数(命令)。使用前缀arg来区分要调用的内容。因此,如果新的调度命令绑定到C-o
,则C-u C-o
将调用其中一个函数,而C-o
(没有前缀arg)将调用另一个函数。
您需要执行C-h f interactive
,以了解如何定义识别前缀参数的命令等。另请参阅Elisp手册 - 使用i interactive
查找教授此内容的位置。
这是一项轻松有趣的练习。学习定义自己的简单命令是开始用自己的语言与Emacs交谈的好方法。
答案 3 :(得分:0)
您可以使用defun
定义另一个函数,在其中使用funcall
或apply
调用其他函数,这样,当您调用第三个函数(也可以绑定)时,它将调用其他人。