Emacs函数和命令之间的关系

时间:2012-09-25 14:57:17

标签: emacs elisp

根据我的理解,在Emacs中我可以运行命令,例如 M-x (顺便说一下,我认为它代表execute-extended-command)。此命令 M-x 本身用于运行customize_face之类的内容,例如在迷你缓冲区中键入M-x customize-face

我的问题是:

Q.1。 customize-face命令?还是功能?我们是否将customize-face作为参数传递给命令 M-x

Q.2 所有Emacs命令都有关联的Emacs 功能吗? (即当我输入M-x customize-face时,我假定已经定义了一个定义的函数)。如果是这样,我如何从命令名称中查找函数名称? (反之亦然)

2 个答案:

答案 0 :(得分:23)

是的,所有Emacs命令都是函数,但并非所有函数都是Emacs命令。您可以使用M-x

通过(interactive)访问任意elisp函数命令
(defun my-command ()
 "This is the docstring"
 (interactive)
 (do-foo)
 (do-bar))

现在您已将my-command定义为互动,您可以使用M-x my-command立即访问它。 Emacs会自动为您完成所有簿记。

这是所有你需要做的添加新命令!然后,您可以使用以下内容将其绑定到密钥:

(global-set-key (kbd "C-c f") 'my-command)

此外,每个键绑定都与这样的交互式功能相关联。您可以使用C-h k找到通过哪个键调用哪个函数并输入您的键序列。这将为您提供将在该键序列上调用的函数的文档。如果你运行了我给你的代码,那么C-h k C-c f会给你一个包含(除此之外)你的doc-string的缓冲区:

C-c f runs the command my-command, which is an interactive Lisp
function.

It is bound to C-c f.

(my-command)

This is the docstring

所以:所有Emacs命令都只是用(interactive)定义的函数。 (实际上,Emacs的C核也有一些原始函数,但这并不是非常重要。)

命令和功能之间的这种简单而优雅的关系 - 易于遵循任何方向 - 是使Emacs易于定制的部分原因。如果你想知道你的正常动作调用了什么函数,你可以轻松查找它们,如果你想添加更多命令,你的函数中只需要一行。

答案 1 :(得分:6)

还有一个细节:对于那些想知道为什么你需要添加(interactive)来将函数标记为也是命令的人来说,诀窍是interactive可以解释如何提供参数到功能。所以(interactive)说“这也是一个命令,当以交互方式运行时,只需调用函数而不用参数”,其中(interactive (list 2))表示“这也是一个命令,当交互式运行时,评估表达式(list 2)将构建传递给命令“。

的参数列表

有关扩展interactive的讨论,以便不仅采用(interactive ARGs-FORM)形式,而且还可以采用(interactive ARGS-FORM RETURN-FORM)形式 RETURN-FORM 指定的内容以交互方式调用时返回值。典型示例:current-column作为函数不打印任何内容,只是返回一个数字,但是当以交互方式运行时(即用作命令),如果它没有打印它变得无用的任何东西,所以 RETURN-FORM 将获取返回的数字并打印出来。