为什么某些Emacs功能不能通过`M-x`获得?

时间:2015-03-22 21:01:52

标签: emacs

This Stack Overflow answer告诉我,我可以使用set-face-attribute设置Emacs的字体大小:

(set-face-attribute 'default nil :height 100)

评论显示您无法使用 M-x 运行set-face-attribute

  

M-x set-face-attribute [No match]

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

  

Eval: (set-face-attribute 'default nil :height 100)

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

1 个答案:

答案 0 :(得分:28)

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

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

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

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

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

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


Emacs Mini Manual → Concepts → Command对正常函数和命令之间的区别有一个简短的,措辞不同的解释。 Relationship between Emacs functions and commands解释了此答案中没有的一些细节。

相关问题