Starten Sie den interaktiven Shell-Befehl als Emacs-Puffer

Starten Sie den interaktiven Shell-Befehl als Emacs-Puffer

Ich möchte aus Emacs heraus einen Shell-Befehl ausführen, der vor dem Fortfahren einige interaktive Fragen stellt. Die von mir gesuchte Funktionalität ist ähnlich wie xterm -e <command>, nur dass sich stattdessen ein Emacs-Fenster öffnet. Es wären nicht allzu viele Terminalemulationsfunktionen erforderlich (es reicht im Grunde aus, ein paar Mal „y“ zu drücken), aber es sind trotzdem Tastatureingaben erforderlich. Ist das irgendwie möglich?

Ich habe bereits versucht , termund zu verwenden ansi-term. Wenn ein anderer Befehl als /bin/bash eingegeben wird, werden beide sofort geschlossen, ohne dass Zeit bleibt, nachzulesen, wo das Problem lag.

Antwort1

Kurze Antwort:

M-x terminal-emulator

klingt genau nach dem, was Sie verlangen.

Was dubrauchenykann anders sein - wenn Sie dem Programm wirklich nur eine Reihe von Zeilen auf stdin geben müssen , ziehen Sie in Betracht yes | program. Wenn das Programm wirklich möchte, dass sein stdin ein tty ist, ziehen Sie die Verwendung in Betracht expect.

Antwort2

Sie können ein Emacs-Bearbeitungsmakro erstellen (der Name „Emacs“ leitet sich von Bearbeitungsmakros ab) und in das Tastaturmakro Befehle einfügen, die Gnu-Bash-Skripte oder andere Shell-Programme ausführen und Skripte erstellen, die den Benutzer nach J- oder N-Antworten abfragen.

Um das Makro zu erstellen, gehen Sie etwa so vor:

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 )

Speichern Sie das Makro und fügen Sie es in ein Emacs-Lisp-Programm ein, das Sie zur Wiederverwendung laden.

Das Makro wäre von da an natürlich in Emacs verwendbar und/oder Sie könnten das Ganze als Batchdatei von der Befehlszeile aus ausführen, wie jedes andere Programm.

Andere Tools und Vorschläge: Sehen Sie sich die rekursive Bearbeitung von Emacs an (die Makros stoppt und neu startet und dem Endbenutzer Zeit gibt, Fragen zu beantworten oder sogar Dinge zu bearbeiten) und die in Emacs integrierte Funktion „message-or-box“ oder einfach die Nachrichtenfunktion. Sie könnten tkquery (ein einfach einzurichtendes Tcl/Tk-Programm, das Benutzer nach Eingabedaten abfragt) und/oder Zenity verwenden, um einfache grafische Interaktionsfelder zu erstellen, die einfach zu programmieren und von Endbenutzern einfach zu verwenden sind.

Sie könnten eine Frage- und Antwortroutine in Gnu Make erstellen und sie in Gnu Emacs ausführen. Dazu und zur Interaktion mit einer laufenden Make-Sitzung könnten Sie process-send-string wie diesen Auszug aus einem meiner Makefiles verwenden:

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

Ich meine, Sie könnten die Emacs-Funktion „process-send-string“ verwenden, um mit einem laufenden Gnu Make-Programm, das in einem Gnu Emacs-Puffer ausgeführt wird, zu kommunizieren und J-oder-N-Fragen zu beantworten.

Kommen wir abschließend auf Ihre Frage zurück und auf Ihre Frage, warum xterm -e <your-program>es schnell beendet wird: Sie könnten einfach Dinge wie emacs -l <emacs-lisp-file-with-question-and-answer-macro-in-it> & disownund/oder xterm -e <your-program-which-queries-the-end-users> & disowntun. Aber das hängt davon ab, wie Sie das Programm ausführen möchten, als synchronen oder asynchronen Prozess. Ich meine, möchten Sie die Ausführung des Programms blockieren, während der Endbenutzer die Frage(n) beantwortet, oder nicht?

Mit diesen Werkzeugen in der Hand können Sie meiner Meinung nach mit Gnu Emacs erreichen, was Sie möchten. Und da Gnu Emacs erweiterbar ist, können Sie es sicherlich dazu bringen, das zu tun, was Sie möchten – wenn Sie es durch eigene Programmierung erweitern.

verwandte Informationen