El punto central es que hay una diferencia entre una función y un comando .
En Emacs lisp, las funciones no son interactivamente invocables por defecto. Eso significa que no puede acceder a ellos M-x
ni vincularlos a una tecla o hacer clic con el mouse. Si desea hacer eso, debe declarar explícitamente la función interactive
, lo que hace agregando un (interactive)
formulario como la primera línea en el cuerpo (siguiendo la cadena de documentación). Una función interactiva se denomina comando. Esto se explica en el manual: (info "(elisp) Using Interactive")
(versión en línea) .
El mensaje de error que ves Wrong type argument: commandp, my-function
indica que estás intentando llamar a una función de manera interactiva, pero esa función no es un comando .
Para explicar el error real, la letra a p
menudo se usa en ceceo para indicar un predicado o prueba. En este caso, Emacs está probando my-function
para ver si es un comando que usa la prueba commandp
. No lo es, lo que lleva al error. Aparecen errores similares cada vez que utiliza un objeto del tipo incorrecto: si Emacs espera una cadena y le pasa un símbolo, puede ver una referencia stringp
, por ejemplo.
Para responder la pregunta tal como se le preguntó, debe agregar la (interactive)
línea a la definición:
(defun my-function ()
(interactive)
(message "This is a great function"))
Hay muchas opciones para el interactive
formulario, que admiten todo tipo de formas de pasar información a su función. Consulte el manual para todos los detalles.
Las macros de teclado son un caso especial en este contexto. Una macro de teclado es una secuencia de eventos de entrada, representada como una cadena. Las macros de teclado se comportan como comandos, por lo que puede vincularlas a teclas sin preocuparse de agregar una interactive
declaración. Por ejemplo, en lo siguiente:
(global-set-key (kbd "C-c l") "λ")
"λ"
es una macro de teclado, por lo que podemos vincularla C-c l
sin ningún problema. Si intentamos hacer lo mismo con una función, debemos asegurarnos de definir la función 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 λ