Каждая команда является функцией, но не каждая функция также является командой. 1
Команда включает в себя вызов interactive
; Вот почему команды обычно называют «интерактивными функциями». Команды могут быть вызваны через M-x name-of-command
RET, и они также могут быть связаны с последовательностью клавиш. Обычные функции не включают вызов interactive
, не могут быть вызваны с помощью M-x, и вы не можете связать их с последовательностью клавиш. Чтобы запустить функцию, которая не является интерактивной, вы можете нажать M-:( eval-expression
), ввести имя функции, а затем значения для всех необходимых аргументов, заключенные в скобки, и нажать RET:
M-: (name-of-function arg1 arg2 arg3)
RET
Если функция не должна работать с текущим буфером, вы также можете ввести
(name-of-function arg1 arg2 arg3)
в *scratch*
буфере и нажмите C-x C-e( eval-last-sexp
) с точкой, расположенной после закрывающей скобки.
Чтобы сделать функцию bar
доступной как команду, вы можете обернуть ее в пользовательскую интерактивную функцию ( foo
) следующим образом:
(defun foo ()
(interactive)
(bar))
Конечно, если bar
принимает один или несколько аргументов, вам нужно будет предоставить их для foo
правильной работы.
Если вы видите, что люди используют термины «функция» и «команда» взаимозаменяемо, это может указывать (в зависимости от контекста), что они не знают о различиях между основными понятиями.
1 Обратите внимание, что я говорю о defun
с здесь. Как отмечает @Stefan в комментариях, клавиатурные макросы являются особым случаем: их можно рассматривать как команды , но они не являются функциями.
C-h i
, выберите руководство Elisp ,i command
- помещает вас прямо в узелWhat is a function?
, который делает все это кристально чистым. Помогите пользователям научиться спрашивать Emacs. (Только одно мнение.)