Ответ 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 объясняет некоторые детали не в этом ответе.