Emacs函数和命令之间的关系

Ame*_*ina 14 emacs elisp

根据我的理解,在Emacs中,我可以运行诸如此类命令M-x(按照我认为的方式execute-extended-command).此命令M-x本身用于运行诸如customize_face输入M-x customize-face迷你缓冲区之类的内容.

我的问题是:

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

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

Tik*_*vis 23

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

(defun my-command ()
 "This is the docstring"
 (interactive)
 (do-foo)
 (do-bar))
Run Code Online (Sandbox Code Playgroud)

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

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

(global-set-key (kbd "C-c f") 'my-command)
Run Code Online (Sandbox Code Playgroud)

而且,每个键绑定都与这样的交互功能相关联.您可以使用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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请注意,技术上并非所有Emacs命令都是函数.如果您定义了键盘宏并使用`Mx name-last-kbd-macro`命名它,则会得到一个不是函数的命令.这样的名称可以与<kbd> Mx </ kbd>一起使用并传递给`global-set-key`,但不能从Lisp中调用它. (4认同)
  • 你可以做`Ch F`并输入命令名.如果你想查找一个*不一定是命令的函数,你可以使用`Ch f`,它适用于范围内的所有函数. (3认同)
  • http://www.gnu.org/software/emacs/manual/html_node/elisp/Command-Overview.html可能是进一步阅读的良好起点. (2认同)

Ste*_*fan 6

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

还有的是关于扩大的讨论interactive,这样,而不是仅仅采取形式(interactive ARGs-FORM),也可以采取的形式(interactive ARGS-FORM RETURN-FORM),其中RETURN-FORM指定了与返回值,当交互称为做.典型示例:current-column由于函数不打印任何东西而只是返回一个数字,但是当交互式运行(即用作命令)时如果它不打印任何东西它就变得无用,所以RETURN-FORM将获取返回的数字并打印它.