
我想在 Emacs 中運行一個 shell 命令,在繼續操作之前詢問一些互動式問題。我正在尋找的功能類似於xterm -e <command>
,只是打開了一個 Emacs 視窗。它不需要太多的終端模擬功能(基本上就是按幾次“y”),但它仍然需要鍵盤輸入。有可能以某種方式做到這一點嗎?
我已經嘗試過使用term
andansi-term
了;當給予與 /bin/bash 不同的命令時,兩者都會立即關閉,而不會留下任何時間來了解問題所在。
答案1
簡短回答:
M-x terminal-emulator
聽起來完全符合你的要求。
你什麼需要可能會有所不同 - 如果您確實只需要在標準輸入上為程式提供一系列y
行,請考慮yes | program
.如果程式確實希望其標準輸入是 tty,請考慮使用expect
.
答案2
您可以製作一個 emacs 編輯巨集(「編輯巨集」是「emacs」名稱的來源),並在鍵盤巨集中放置執行 Gnu Bash 腳本或其他 shell 程式的命令,並建立查詢使用者 Y 或 N 的腳本答案。
因此,要建立宏,您需要執行以下操作:
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 )
儲存巨集並將其放入您載入的 emacs lisp 程式中以供重複使用。
當然,從那時起,該巨集就可以在 emacs 中使用,並且/或您可以像任何其他程式一樣從命令列將整個檔案作為批次檔運行。
其他工具和建議:研究 emacs 遞歸編輯(它會停止並重新啟動宏,並為最終用戶提供時間來回答問題甚至編輯內容)和 emacs 內建函數 message-or-box 或只是訊息功能。您可以使用 tkquery(一種易於設定的 Tcl/Tk 程序,用於查詢使用者輸入資料)和/或使用 zenity 來製作簡單的圖形交互框,這些框易於編程且易於最終用戶使用。
您可以在 Gnu Make 中建立問答例程並在 Gnu Emacs 中運行它。要執行此操作並與正在運行的 Make 會話交互,您可以使用 process-send-string,例如我的 makefile 之一的摘錄:
echo "(process-send-string \"*compilation*\" \" \\n \") "
我的意思是,您可以使用 emacs process-send-string 函數與正在 Gnu Emacs 緩衝區內運行的正在運行的 Gnu Make 程式進行通訊並回答 Y-or-N 問題。
最後,回到你的問題,你想知道為什麼xterm -e <your-program>
很快就終止了:你可以做像emacs -l <emacs-lisp-file-with-question-and-answer-macro-in-it> & disown
and/or 這樣的事情xterm -e <your-program-which-queries-the-end-users> & disown
。但這取決於您希望如何運行程序,作為同步進程還是非同步進程;我的意思是,您是否想在最終用戶回答問題時阻止程式運行?
有了這些工具,我想你可以透過 Gnu Emacs 得到你想要的東西;而且,由於 Gnu Emacs 是可擴展的,如果您透過自己編程來擴展它,您當然可以讓它以某種方式做您想做的事情。