De vez en cuando me encuentro usando funciones interactivas dentro de una función que estoy escribiendo para mi propio uso. Si una función solicita información (por ejemplo, "Archivo de salida: ~ /"), ¿hay alguna forma general de elisp para agregar texto al minibúfer y luego presione Intro para que el usuario no tenga que hacerlo?
Como ejemplo, suponga que quiero ejecutar org-latex-export-to-pdf
dentro de una función pero no quiero que el usuario tenga que especificar un nombre de archivo. Correr (org-latex-export-to-pdf)
moverá el punto al minibúfer, pero poner algo como (insert "filename.tex")
en la siguiente línea no parece funcionar.
interactive
cláusula. Cuando se llama desde elisp, debería poder pasar la información como un argumento de función. Por supuesto, esto no le ayuda, en caso de que la función que está intentando llamar no siga este diseño.Respuestas:
Interesante problema Parece que el editor se ejecuta
post-command-hook
cada vez que ingresa un nuevo ciclo de comandos, es decir, arecursive-edit
. Pero podemos comenzar conminibuffer-setup-hook
, que ejecuta una función después de ingresar al minibúfer. Si bien esto permite la inserción de la entrada, es demasiado pronto para salir del minibúfer, porque aún no se ha configurado la captura.Ahí es donde necesitamos envolver los 'argumentos' en nuestro propio 'bucle de comandos', que se ejecuta cada vez que ingresamos a
recursive-edit
, en ese punto aparece un argumento y sube un nivel, a través deexit-minibuffer
.fuente
Escribí una macro para esta llamada
with-simulated-input
, que puedes obtener aquí . Le permite proporcionar una entrada arbitraria, así como ejecutar formularios arbitrarios de lisp para simular la interacción del usuario.Por ejemplo:
volvería
"hello world"
, con el "hola" insertado por la primera cadena, el "mundo" insertado a través del código lisp, y finalmente "RET" para finalizar la entrada.Viene con un conjunto de pruebas que puede consultar para obtener más ejemplos de uso.
fuente
Parece que usar
run-with-timer
coninsert
hará el trabajo.El comando
insert
cuando se coloca después aparece demasiado rápido. Intenta insertar la cadena antes de que haya un lugar para insertarla.fuente
org-export-output-file-name
mediante programación al usarorg-latex-export-to-pdf
para que el usuario no solicite el nombre del archivo. Puede poner sus esfuerzos en la pregunta, por ejemplo,run-with-timer
etc., sin embargo, no es una buena solución (en mi opinión). La mejor solución es pasar correctamente un nombre de archivo mediante programación para que el minibúfer nunca se abra en primer lugar. Recomendaría eliminar esta respuesta para que alguien con máselisp
experiencia obtenga una mejor solución .org-latex-export-to-pdf
no es la que me interesa. Es un ejemplo, ya que parecía decidido a agregar uno. La pregunta que hice es a la que me refería: ¿hay alguna manera de responder de manera confiable un aviso de minibúfer a través de elisp? Una solución caso por caso no es lo que estoy buscando. De su comentario, puedo inferir que no se recomienda.