
Emacs 内から、処理を進める前にいくつかの対話型の質問をするシェル コマンドを実行したいと思います。私が求めている機能は、 に似ていますがxterm -e <command>
、代わりに Emacs ウィンドウが開きます。端末エミュレーション機能はそれほど必要ありません (基本的には「y」を数回押すだけです) が、キーボード入力は必要です。これを何らかの方法で実現することは可能ですか?
term
すでに との使用を試しましたがansi-term
、/bin/bash とは異なるコマンドが指定されると、両方ともすぐに閉じてしまい、問題が何であったのかを読み取る時間がありません。
答え1
短い答え:
M-x terminal-emulator
まさにあなたが求めているものと同じですね。
あなたが必要y
異なる場合があります。プログラムにstdin に一連の行を渡したいだけの場合は、 を検討しyes | program
てください。プログラムが stdin を tty にしたい場合は、 の使用を検討してくださいexpect
。
答え2
emacs 編集マクロ (「emacs」の名前は「編集マクロ」に由来しています) を作成し、キーボード マクロに Gnu Bash スクリプトまたはその他のシェル プログラムを実行するコマンドを配置して、ユーザーに 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 または message 関数のみを調べてください。tkquery (ユーザーに入力データを問い合わせる、セットアップが簡単な Tcl/Tk プログラム) を使用したり、zenity を使用して、プログラムしやすくエンド ユーザーが使いやすいシンプルなグラフィカル インタラクション ボックスを作成したりすることもできます。
Gnu Make で質問と回答のルーチンを作成し、それを Gnu Emacs 内で実行することができます。これを実行し、実行中の Make セッションと対話するには、次の私の makefile からの抜粋のように、process-send-string を使用できます。
echo "(process-send-string \"*compilation*\" \" \\n \") "
つまり、emacs の process-send-string 関数を使用して、Gnu Emacs バッファー内で実行されている Gnu Make プログラムと通信し、Y または N の質問に答えることができます。
最後に、あなたの質問に戻り、なぜxterm -e <your-program>
すぐに終了するのか疑問に思うのですが、emacs -l <emacs-lisp-file-with-question-and-answer-macro-in-it> & disown
や のようなことを実行することもできますxterm -e <your-program-which-queries-the-end-users> & disown
。ただし、これは、プログラムを同期プロセスとして実行するか、非同期プロセスとして実行するかによって異なります。つまり、エンドユーザーが質問に答えている間にプログラムの実行をブロックするかどうかということです。
これらのツールを利用すれば、Gnu Emacs で必要なものを実現できると思います。また、Gnu Emacs は拡張可能なので、自分でプログラミングして拡張すれば、何らかの方法で必要なものを実現できます。