Связь между функциями и командами Emacs

Из того, что я понимаю, в Emacs я могу запустить команды, например M-x (который, кстати, я считаю, означает execute-extended-command). Эта команда M-x сама используется для запуска таких вещей, как customize_face например. набрав M-x customize-face в минибуфере.

Мои вопросы:

Q.1. Является customize-face a команда? или это функция? И говорим ли мы, что customize-face передается команде M-x как аргумент ?

Q.2 У всех команд Emacs есть связанная Emacs функция? (т.е. когда я вхожу M-x customize-face, я предполагаю, что вызывается определенная функция ). Если да, то как я могу найти имя функции из имени команды? (и наоборот)

Ответ 1

Да, все команды Emacs являются функциями, но не все функции являются командами Emacs. Вы можете сделать произвольную функцию elisp командой, доступной через M-x, используя (interactive):

(defun my-command ()
 "This is the docstring"
 (interactive)
 (do-foo)
 (do-bar))

Теперь, когда вы определили my-command как интерактивный, вы можете немедленно получить к нему доступ с помощью M-x my-command. Emacs автоматически выполняет всю учетную запись с именем для вас.

Это все, что вам нужно сделать, чтобы добавить новую команду! Затем вы можете привязать его к ключу с чем-то вроде:

(global-set-key (kbd "C-c f") 'my-command)

Кроме того, каждое связывание ключей связано с такой интерактивной функцией. Вы можете найти, какая функция вызывается с помощью клавиши C-h k и ввода вашей последовательности клавиш. Это даст вам документацию для функции, которая будет вызываться в этой последовательности клавиш. Если вы запустили код, который я вам дал, то C-h k C-c f предоставит вам буфер, содержащий (помимо прочего) вашу doc-строку:

C-c f runs the command my-command, which is an interactive Lisp
function.

It is bound to C-c f.

(my-command)

This is the docstring

Итак: все команды Emacs - это просто функции, определенные с помощью (interactive). (На самом деле, есть также некоторые примитивные функции ядра Emacs C, но это не очень важно.)

Эта простая и элегантная связь между командами и функциями, которые легко отслеживать в любом направлении, является частью того, что делает Emacs настолько легко настраиваемым. Если вы когда-нибудь задавались вопросом о том, какие функции вы вызываете, вы можете легко просмотреть их, и если вы хотите добавить дополнительные команды, у вас будет только одна дополнительная строка в вашей функции.

Ответ 2

Еще одна деталь: для людей, которые задаются вопросом, почему вам нужно добавить (interactive), чтобы обозначить функцию как тоже команду, трюк заключается в том, что interactive должен объяснить, как предоставить аргументы функции. Поэтому (interactive) говорит: "Это тоже команда, а при запуске в интерактивном режиме просто вызовите функцию без аргументов", где (interactive (list 2)) говорит: "Это также команда, а при запуске в интерактивном режиме, выражение (list 2) будет создавать список аргументов перейти к команде".

Обсуждалось расширение interactive, так что вместо того, чтобы принимать форму (interactive ARGs-FORM), он также может принимать форму (interactive ARGS-FORM RETURN-FORM), где RETURN-FORM указывает, что делать с возвращаемым значением, когда он вызывается в интерактивном режиме. Типичный пример: current-column как функция ничего не печатает, а просто возвращает число, но когда он запускается интерактивно (т.е. Используется как команда), если он ничего не печатает, он становится бесполезным, поэтому RETURN-FORM будет принимать номер вернулся и распечатал его.