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