Escribí una función, y quiero llamarla a través de Mx, y vincularla a una tecla. Esta es mi función:
(defun my-function ()
(message "This is a great function"))
Si trato de llamarlo M-x my-function
, aparece el error: [no match]
en el mini-buffer.
Si trato de vincularlo a una tecla (o clic del mouse):
(global-set-key (kbd "C-c a") 'my-function)
Parece funcionar, pero cuando trato de llamarlo C-c a
, aparece el error
Argumento de tipo incorrecto: commandp, my-function
¿Por qué no puedo usar mi función?
functions
commands
interactive
Tyler
fuente
fuente
interactive
, por ejemplo, a veces un comando desaparece de una nueva versión de una biblioteca. El error se puede generar en cualquier contexto donde Emacs espera un comando.commandp
, para tratar de encontrar otras Q que puedan cerrarse como duplicados de esta. Sin embargo, tenga cuidado de leer las preguntas y respuestas, ya que algunas son diferentes. En algunos casos, la respuesta (y el contexto Q) puede valer la pena repetir aquí. En otros casos, la pregunta no está relacionada y debe dejarse como está (no cerrada).Respuestas:
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óninteractive
, 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á probandomy-function
para ver si es un comando que usa la pruebacommandp
. 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 referenciastringp
, por ejemplo.Para responder la pregunta tal como se le preguntó, debe agregar la
(interactive)
línea a la definición: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:"λ"
es una macro de teclado, por lo que podemos vincularlaC-c l
sin ningún problema. Si intentamos hacer lo mismo con una función, debemos asegurarnos de definir la función comointeractive
:fuente
M-x my-function
en su ejemplo. Además, como principiante de emacs, todavía no estoy 100% claro sobre quéC-x C-e
hace exactamente o cuándo necesitas ejecutarlo, pero parece que eh ... cuando lo ejecutas, analiza el búfer y lo sobrescribemy-function
en la memoria porque si yo No ejecutarC-x C-e
M-x
ejecuta la función desde la última vez que ejecutéC-x C-e
C-x C-e
evalúa el búfer , parece que el resultado de evaluar un búfer que contiene adefun
es registrar la función, aunque este artículo parece hacerme pensar que debería ejecutar la función, y sin embargo, lo único que se muestra en el minibúfer esmy-function
(¿implica que devuelve la función?), noThis is a great function
. Debo estar perdiendo algo aquí.