Почему некоторые функции Emacs недоступны через `M-x`?

Этот ответ сказал мне, что я могу установить размер шрифта Emacss с помощью set-face-attribute:

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

Комментарии показывают, что вы не можете запустить set-face-attribute с помощью M-x:

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

Вместо этого вы должны запустить его с помощью M-::

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

Почему некоторые команды, например set-face-attribute, недоступны через M-x?

Ответ 1

  • M-x привязан к команде execute-extended-command, которая позволяет вам вводить имя команды и 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-attribute с M-x, состоит в том, что ее определение не содержит interactive формы, поэтому set-face-attribute не является командой. Вы должны назвать это простой функцией в S-выражениях. Вы можете сделать это из минибуфера с помощью M-: или из других мест любым другим способом оценки кода.


Руководство по Emacs Mini → Понятия → Команда имеет короткое, разное описание разницы между нормальными функциями и командами. Связь между функциями и командами Emacs объясняет некоторые детали не в этом ответе.