为什么某些 Emacs 功能无法通过“M-x”使用?

Why are some Emacs functions not available via `M-x`?

This Stack Overflow answer 告诉我可以用 set-face-attribute:

设置 Emacs 的字体大小
(set-face-attribute 'default nil :height 100)

评论显示你不能运行 set-face-attribute with M-x:

相反,您必须 运行 使用 M-::

为什么某些命令,如 set-face-attribute,无法通过 M-x 获得?

  • M-x 绑定到命令 execute-extended-command,它允许您键入 命令的名称 和 运行就这样了。
  • M-: 绑定到命令 eval-expression,它允许您键入包含 function 的任意 S 表达式调用并评估它。

您可以使用 M-: 调用的函数用于实现 Emacs 功能、自定义(例如在您的 .emacs 中)和插件。函数参数通常通过在 S 表达式中调用函数来传递。

任何函数如果在其定义中具有 interactive 形式,则可以 作为命令。 interactive 形式描述函数在作为命令调用时应如何获取其参数。例如,如果函数在其定义中包含 (interactive "bGive me a buffer: "),则可以使用 M-x 调用该函数。当用户使用 M-x 调用函数时,Emacs 将提示用户输入缓冲区名称(因为 b),并且他们键入的名称将作为参数传递到函数。

使函数成为命令的目的是让最终用户更容易调用它,而不仅仅是 Emacs Lisp 程序员。命令(运行 和 M-x)更容易通过以下方式进行交互 运行:

  • 您不必用 () 将命令名称括起来使其成为有效的 S 表达式。
  • 可以自动传递参数(例如光标位置),也可以提示您输入参数,这样您就不必记住需要哪些参数。
  • 当提示输入参数时,您可以自动完成它,因为 interactive 表单的 code characters(如 b)指定了期望的输入类型。

你不能用 M-x 调用函数 set-face-attribute 的原因是它的定义不包含 interactive 形式,所以 set-face-attribute 不是命令。您必须在 S 表达式中将其作为普通函数调用。您可以使用 M-: 从迷你缓冲区执行此操作,或者使用其他任何 ways of evaluating code.

从其他地方执行此操作

Emacs Mini Manual → Concepts → Command has a short, differently-worded explanation of the difference between normal functions and commands. Relationship between Emacs functions and commands 解释了一些不在此答案中的细节。