핵심은 기능과 명령 사이에 차이 가 있다는 것입니다 .
Emacs lisp에서는 기본적으로 함수를 대화식으로 호출 할 수 없습니다. 즉 M-x
, 키 또는 마우스 클릭을 통해 액세스 하거나 바인딩 할 수 없습니다 . 그렇게하려면 함수를 명시 적으로 선언해야합니다.이 함수 는 본문에서 첫 번째 행으로 양식을 interactive
추가하여 (interactive)
(문서 문자열 다음에) 수행합니다. 대화식 기능을 명령 이라고합니다 . (info "(elisp) Using Interactive")
(온라인 버전) 설명서에 설명되어 있습니다 .
표시되는 오류 메시지 Wrong type argument: commandp, my-function
는 함수를 대화식으로 호출하려고하지만 해당 함수가 명령 이 아님을 나타냅니다 .
실제 오류를 설명하기 위해 문자 p
는 종종 술어 또는 테스트를 나타 내기 위해 lisp에서 사용됩니다. 이 경우 Emacs는 test my-function
를 사용한 명령인지 확인하기 위해 테스트하고 commandp
있습니다. 그렇지 않아 오류가 발생합니다. 잘못된 유형의 객체를 사용할 때마다 비슷한 오류가 나타납니다. Emacs가 문자열을 예상하고 기호를 전달하면 stringp
예를 들어에 대한 참조가 표시 될 수 있습니다 .
요청에 따라 질문에 대답하려면 (interactive)
정의에 행을 추가해야합니다 .
(defun my-function ()
(interactive)
(message "This is a great function"))
양식에는 정보를 함수에 전달하는 모든 종류의 방법을 지원 하는 많은 옵션이 있습니다 interactive
. 자세한 내용은 설명서를 확인하십시오.
이 상황에서 키보드 매크로는 특별한 경우입니다. 키보드 매크로는 일련의 입력 이벤트이며 문자열로 표시됩니다. 키보드 매크로는 명령처럼 동작하므로 interactive
선언을 추가하지 않아도 키에 바인딩 할 수 있습니다 . 예를 들어 다음과 같습니다.
(global-set-key (kbd "C-c l") "λ")
"λ"
키보드 매크로이므로 C-c l
문제없이 바인딩 할 수 있습니다 . 함수로 같은 일을하려고하면 함수를 interactive
다음 과 같이 정의해야합니다 .
(global-set-key (kbd "C-c k")
(lambda () (insert "λ"))
;; C-c k is undefined! We tried to bind it to a function
(global-set-key (kbd "C-c m")
(lambda () (interactive) (insert "λ"))
;; C-c m is bound to a command that inserts λ