Uruchom interaktywne polecenie powłoki jako bufor emacsa

1

Chciałbym uruchomić polecenie powłoki, które zadaje kilka interaktywnych pytań przed kontynuowaniem, z poziomu Emacsa. Funkcjonalność, której szukam, jest jak xterm -e <command>, tylko otwierając okno Emacsa. Nie wymagałoby to zbyt wielu możliwości emulacji terminala (w zasadzie naciśnięcie „y” kilka razy), ale nadal wymaga wprowadzania danych z klawiatury. Czy można to jakoś zrobić?

Próbowałem użyć term i ansi-term już; gdy otrzymasz polecenie inne niż / bin / bash, oba zamykają się natychmiast, nie pozostawiając czasu na odczytanie problemu.

Latanius
źródło
1
Jeśli wiesz, że odpowiedzi są „y”, prawdopodobnie nie musisz wchodzić w interakcje z tym, co się dzieje. Zapewniając więcej szczegółów, ktoś może prawdopodobnie napisać rozwiązanie, które eliminuje potrzebę interakcji.
lawlist

Odpowiedzi:

1

Krótka odpowiedź:

M-x terminal-emulator

brzmi dokładnie tak, jak prosisz.

Co ty potrzeba może być inny - jeśli naprawdę musisz dać programowi serię y linie na standardowe wejście, rozważ yes | program. Jeśli program naprawdę chce, aby stał się tty, rozważ użycie expect.

Toby Speight
źródło
0

Możesz zmontować makro edycji emacsa („edytowanie makr” to nazwa, z której pochodzi nazwa „emacs”) oraz polecenia umieszczania makr klawiatury, które uruchamiają skrypty Gnu Bash lub inne programy powłoki i tworzą skrypty, które wysyłają zapytanie do użytkownika o Y lub N odpowiedzi.

Aby utworzyć makro, zrobiłbyś coś takiego:

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 )

Zapisz makro i umieść je w programie lisp emacs, który ładujesz do ponownego użycia.

Makro byłoby oczywiście użyteczne od tego momentu w emacs i / lub można uruchomić całość jako plik wsadowy z wiersza poleceń, jak każdy inny program.

Inne narzędzia i sugestie: spójrz na edycję rekursywną emacsa (która zatrzymuje i ponownie uruchamia makra i daje czas użytkownikowi na odpowiedź lub nawet na edycję) i wbudowaną funkcję wiadomości lub skrzynki emacsa lub tylko wiadomość funkcjonować. Możesz użyć tkquery (łatwego w konfiguracji programu Tcl / Tk, który pyta użytkowników o dane wejściowe) i / lub używać zenity do tworzenia prostych graficznych pól interakcji, które są łatwe do zaprogramowania i łatwe w użyciu dla użytkowników końcowych.

Możesz stworzyć procedurę pytań i odpowiedzi w Gnu Make i uruchomić ją w Gnu Emacs. Aby to zrobić i wejść w interakcję z uruchomioną sesją Make możesz użyć procesu-ciąg-wysyłania, taki jak ten fragment z jednego z moich plików makefile:

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

To znaczy, możesz użyć funkcji emacs-string-string do komunikowania się i odpowiadania na pytania Y-or-N za pomocą uruchomionego programu Gnu Make, który działa w buforze Gnu Emacs.

Wreszcie, wracając do swojego pytania i zastanawiając się dlaczego xterm -e <your-program> szybko się kończy: możesz po prostu robić takie rzeczy emacs -l <emacs-lisp-file-with-question-and-answer-macro-in-it> & disown i / lub xterm -e <your-program-which-queries-the-end-users> & disown. Ale to zależy od tego, jak chcesz uruchomić program, jako proces synchroniczny lub asynchroniczny; Mam na myśli, czy chcesz zablokować uruchamianie programu, gdy użytkownik końcowy odpowiada na pytania, czy nie?

Z tymi narzędziami w ręku myślę, że możesz dostać to, co chcesz z Gnu Emacsem; a ponieważ Gnu Emacs jest rozszerzalny, możesz go z pewnością zrobić tak, jak chcesz - jeśli go rozszerzysz, programując samemu.

BrianGPowellMS
źródło