【发布时间】:2014-12-03 02:02:47
【问题描述】:
我是 emacs 新手,有一个菜鸟问题。我可以通过(global-set-key (kbd "C-c a b c") 'some-command) 将键绑定到特定函数,其中some-command 是一个函数。如何通过一键绑定调用两个函数(比如some-command 和some-other-command)?非常感谢!
【问题讨论】:
标签: emacs elisp key-bindings
我是 emacs 新手,有一个菜鸟问题。我可以通过(global-set-key (kbd "C-c a b c") 'some-command) 将键绑定到特定函数,其中some-command 是一个函数。如何通过一键绑定调用两个函数(比如some-command 和some-other-command)?非常感谢!
【问题讨论】:
标签: emacs elisp key-bindings
您可以定义自己的函数来调用这两个函数,并将键绑定到您自己的函数。或者使用一个简单的 lambda:
(global-set-key (kbd "C-c a b c") (lambda () (interactive) (some-command) (some-other-command)))
【讨论】:
'(...)是一个列表,而不是一个函数。见stackoverflow.com/questions/16801396/…
find-name-dired)、enter、*py、t、Q ..从这里继续@songyuanyao
我建议永远不要将 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 @(输入它绑定的键序列)。
【讨论】:
定义一个命令,有条件地调用您想要的每个函数(命令)。使用前缀 arg 来区分调用哪个。因此,如果新的调度命令绑定到 C-o,则 C-u C-o 将调用其中一个函数,C-o(不带前缀 arg)将调用另一个函数。
您将需要执行 C-h f interactive,以了解如何定义识别前缀参数的命令等。也请参阅 Elisp 手册 - 使用 i interactive 查找它在哪里教授这一点。
这是一个简单而有趣的练习。学习定义自己的简单命令是开始使用 Emacs 自己的语言进行对话的好方法。
【讨论】:
您可以使用defun定义另一个函数,在其中您使用funcall或apply调用其他函数,所以当您调用第三个函数(您也可以绑定)时,它将调用其他函数。
【讨论】: