O ponto principal é que há uma diferença entre uma função e um comando .
No Emacs lisp, as funções não são chamadas interativamente por padrão. Isso significa que você não pode acessá-los via M-x
ou vinculá-los a uma tecla ou clique do mouse. Se você quiser fazer isso, precisará declarar explicitamente a função interactive
, adicionando um (interactive)
formulário como a primeira linha do corpo (seguindo a sequência de documentação). Uma função interativa é chamada de comando. Isso é explicado no manual: (info "(elisp) Using Interactive")
(versão online) .
A mensagem de erro exibida Wrong type argument: commandp, my-function
indica que você está tentando chamar uma função interativamente, mas essa função não é um comando .
Para explicar o erro real, a letra p
é frequentemente usada no lisp para indicar um predicado ou teste. Nesse caso, o Emacs está testando my-function
para ver se é um comando usando o teste commandp
. Não é, o que leva ao erro. Erros semelhantes aparecem sempre que você usa um objeto do tipo errado: se o Emacs espera uma string e passa um símbolo, você pode ver uma referência a stringp
, por exemplo.
Para responder à pergunta conforme solicitado, você precisa adicionar a (interactive)
linha à definição:
(defun my-function ()
(interactive)
(message "This is a great function"))
Existem muitas opções para o interactive
formulário, suportando todos os tipos de maneiras de passar informações para sua função. Verifique o manual para todos os detalhes.
As macros do teclado são um caso especial nesse contexto. Uma macro de teclado é uma sequência de eventos de entrada, representada como uma sequência. As macros do teclado se comportam como comandos, para que você possa vinculá-las às teclas sem se preocupar em adicionar uma interactive
declaração. Por exemplo, no seguinte:
(global-set-key (kbd "C-c l") "λ")
"λ"
é uma macro de teclado, para que possamos vinculá-la C-c l
sem problemas. Se tentarmos fazer o mesmo com uma função, precisamos definir a função como 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 λ