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-xou 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-functionindica 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-functionpara 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 interactiveformulá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 interactivedeclaração. Por exemplo, no seguinte:
(global-set-key (kbd "C-c l") "λ")
"λ"é uma macro de teclado, para que possamos vinculá-la C-c lsem 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 λ