根据我的理解,在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易于定制的部分原因.如果你想知道你的正常动作调用了什么函数,你可以轻松查找它们,如果你想添加更多命令,你的函数中只需要一行.
还有一个细节:对于那些想知道你为什么需要添加(interactive)标签函数同时也是一个命令的人来说,诀窍在于interactive解释如何为函数提供参数.所以(interactive)说"这也是一个命令,当交互运行时,只需调用不带参数的函数",其中(interactive (list 2))说"这也是一个命令,当交互运行时,评估表达式(list 2)将构建传递给命令的参数列表".
还有的是关于扩大的讨论interactive,这样,而不是仅仅采取形式(interactive ARGs-FORM),也可以采取的形式(interactive ARGS-FORM RETURN-FORM),其中RETURN-FORM指定了与返回值,当交互称为做.典型示例:current-column由于函数不打印任何东西而只是返回一个数字,但是当交互式运行(即用作命令)时如果它不打印任何东西它就变得无用,所以RETURN-FORM将获取返回的数字并打印它.