14

据我了解,在 Emacs 中,我可以运行诸如(顺便说一下,我认为它代表 )之类的命令。该命令本身用于运行诸如通过键入minibuffer 之类的事情。M-xexecute-extended-commandM-xcustomize_faceM-x customize-face

我的问题是:

问题 1。customize-face命令?或者它是一个功能?我们是否说它作为参数customize-face传递给命令M-x

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

4

2 回答 2

23

是的,所有 Emacs 命令都是函数,但并非所有函数都是 Emacs 命令。M-x您可以使用以下命令使任意 elisp 函数成为可访问的命令(interactive)

(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并输入您的键序列。这将为您提供将在该键序列上调用的函数的文档。如果您运行我给您的代码,doingC-h k C-c f会给您一个包含(除其他外)您的文档字符串的缓冲区:

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 如此易于定制的部分原因。如果您想知道您的正常操作调用了哪些函数,您可以轻松查找它们,如果您想添加更多命令,您只需在函数中多写一行。

于 2012-09-25T15:21:52.543 回答
6

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

已经讨论过扩展,interactive以便在交互式调用时,它不仅可以采用形式,(interactive ARGs-FORM)还可以采用RETURN-FORM指定如何处理返回值的形式。典型的例子:作为一个函数不打印任何东西,只是返回一个数字,但是当交互运行时(即用作命令),如果它不打印任何东西就变得无用,所以RETURN-FORM将获取返回的数字并打印它。(interactive ARGS-FORM RETURN-FORM)current-column

于 2012-09-27T00:55:12.460 回答