Inicie el comando de shell interactivo como un búfer de emacs

Inicie el comando de shell interactivo como un búfer de emacs

Me gustaría ejecutar un comando de shell que haga algunas preguntas interactivas antes de continuar, desde Emacs. La funcionalidad que estoy buscando es similar xterm -e <command>, solo que se abre una ventana de Emacs. No necesitaría demasiada capacidad de emulación de terminal (básicamente es presionar "y" varias veces), pero aún necesita entrada de teclado. ¿Es posible hacer esto de alguna manera?

Intenté usarlo termy ansi-termya; cuando se les da un comando diferente de /bin/bash, ambos se cierran inmediatamente, sin dejar tiempo para leer cuál fue el problema.

Respuesta1

Respuesta corta:

M-x terminal-emulator

Suena exactamente como lo que estás pidiendo.

Lo que tunecesidadpodría ser diferente: si realmente solo necesita darle al programa una serie de ylíneas en stdin, considere yes | program. Si el programa realmente quiere que su entrada estándar sea un tty, considere usar expect.

Respuesta2

Puede crear una macro de edición de emacs ("macros de edición" es de donde se deriva el nombre "emacs") y en la macro del teclado colocar comandos que ejecuten scripts Gnu Bash u otros programas de shell y crear scripts que consulten al usuario Y o N. respuestas.

Entonces, para crear la macro, harías algo como esto:

Cx (
Mx new-frame return
Mx shell return (or just Mx eshell return--to use the emacs built-in shell)
bash <bash-program-that-queries-end-user-for-Y-or-N-answers> &
Mx delete-frame
Cx )

Guarde la macro y colóquela en un programa emacs lisp que cargue para reutilizarla.

Por supuesto, la macro se podrá utilizar a partir de ese momento dentro de emacs y/o se podría ejecutar todo como un archivo por lotes, desde la línea de comandos, como cualquier otro programa.

Otras herramientas y sugerencias: busque la edición recursiva de emacs (que detiene y reinicia macros y le da tiempo al usuario final para responder preguntas o incluso editar cosas) y la función integrada de emacs mensaje o cuadro o simplemente el mensaje. función. Puede usar tkquery (un programa Tcl/Tk fácil de configurar que consulta a los usuarios para obtener datos de entrada) y/o usar zenity para crear cuadros de interacción gráfica simples que sean fáciles de programar y fáciles de usar por parte de los usuarios finales.

Podrías crear una rutina de preguntas y respuestas en Gnu Make y ejecutarla dentro de Gnu Emacs. Para hacer esto e interactuar con una sesión Make en ejecución, podrías usar Process-Send-string como este extracto de uno de mis archivos Make:

echo "(process-send-string \"*compilation*\" \" \\n \") "

Quiero decir, podrías usar la función de cadena de envío de proceso de emacs para comunicarte y responder preguntas Y o N con un programa Gnu Make en ejecución que se ejecuta dentro de un búfer de Gnu Emacs.

Por último, volviendo a su pregunta y a su pregunta por qué xterm -e <your-program>termina rápidamente: podría simplemente hacer cosas como emacs -l <emacs-lisp-file-with-question-and-answer-macro-in-it> & disowny/o xterm -e <your-program-which-queries-the-end-users> & disown. Pero esto depende de cómo desee ejecutar el programa, como un proceso sincrónico o asincrónico; Quiero decir, ¿desea bloquear la ejecución del programa mientras el usuario final responde las preguntas o no?

Con estas herramientas en la mano creo que puedes conseguir lo que quieres con Gnu Emacs; y, dado que Gnu Emacs es extensible, ciertamente puedes lograr que haga lo que quieras de alguna manera, si lo extiendes programándolo tú mismo.

información relacionada