为什么某些Emacs功能不能通过`Mx`获得?

Ror*_*ane 20 emacs

这个Stack Overflow回答告诉我,我可以设置Emacs的字体大小set-face-attribute:

(set-face-attribute 'default nil :height 100)
Run Code Online (Sandbox Code Playgroud)

这些评论表明您不能运行set-face-attribute使用M-x:

Mx set-face-attribute [不匹配]

相反,你必须运行它M-::

Eval :( set-face-attribute'默认为nil:height 100)

为什么有些命令,例如set-face-attribute,不可用M-x

Ror*_*ane 32

  • M-x绑定到命令execute-extended-command,它允许您键入命令的名称并运行它.
  • M-:绑定到命令eval-expression,它允许您键入包含函数调用的任意S表达式并对其进行求值.

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

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

使函数成为命令的目的是让最终用户轻松调用它,而不仅仅是Emacs Lisp程序员.命令(运行M-x)更容易以这些方式以交互方式运行:

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

你不能调用函数的原因set-face-attributeM-x是,它的定义不包含的interactive形式,所以set-face-attribute不是命令.您必须在S表达式中将其称为普通函数.您可以使用迷你缓冲区M-:,或通过其他任何方式评估代码.


Emacs Mini手册→概念→命令对正常功能和命令之间的区别有一个简短的,措辞不同的解释.Emacs函数和命令之间的关系解释了这个答案中没有的一些细节.

  • 把它放在另一个问题上的主动性很好.从技术上讲,你的答案很棒,但是,为了完整起见,我要从用户体验的角度来看,将所有函数作为命令公开是不明智的 - 这会使名称空间变得混乱并使自动完成变得不那么有用.因此,大多数功能都不能通过Mx获得(在我看来,仍有太多的命令让人在那里记住;)) (2认同)