まず、免責事項。私はこれを何度も研究しました、そして、私はすでに何らかの方法で答えをすでに見つけたと確信していますが、私はそれを理解しません。
私の問題は次のとおりです。
- comintを実行しているプロセスがあります
- 入力行を送信し、出力をキャプチャして、それが終了したとき(出力の最後の行がプロンプトの正規表現に一致したとき)を確認したい
- プロセスが出力の送信を完了したときにのみ、別の入力行を送信したい(たとえば)。
少しの背景として、プログラムとの対話を実装するメジャーモードを考えてください。プログラムは、任意の時間で任意の量の出力を返す可能性があります。これは異常な状況ではありませんよね?さて、 入力間で待機する必要がある部分は珍しいかもしれませんが、入力全体を送信するよりもいくつかの利点があります。
- 出力バッファはきれいにフォーマットされています:入力出力入力出力...
- さらに重要なことは、プロセスに大量のテキストを送信する場合、テキストは断片に分割され、その断片はプロセスによって貼り付けられます。切断ポイントは任意であり、これにより無効な入力が行われることがあります(たとえば、プロセスは識別子の途中で入力カットを正しく貼り付けません)
とにかく、珍しいかどうかにかかわらず、それは複雑であることがわかります。今、私はの線に沿って何かを使用しています
(defun mymode--wait-for-output ()
(let ((buffer (mymode-get-buffer)))
(with-current-buffer buffer
(goto-char (point-max))
(forward-line 0)
(while (not (mymode-looking-at-prompt))
(accept-process-output nil 0.001)
(redisplay)
(goto-char (point-max))
(forward-line 0))
(end-of-line))))
入力ラインを送信した後、次のラインを送信する前に毎回これを呼び出します。まあ...それは動作します、それはすでに何かです。
ただし、出力を待機しているときにemacsがハングすることもあります。その理由は明らかでありsleep-for
、ループに何らかの非同期(たとえば1)を含めると、出力は1秒遅延しますが、ハングは抑制されると考えました。この種の非同期sleep-for
は存在しないように見えることを除いて
。
それともそうですか?より一般的には、emacsでこれを達成する慣用的な方法はありますか?言い換えると:
プロセスに入力を送信し、出力を待ってから、さらに入力を非同期に送信する方法は?
周りを検索するとき(関連する質問を参照)、主にセンチネル(プロセスが終了しないため、私の場合には当てはまらないと思います)といくつかのcomintフック(しかし、何をすべきですか?フックをバッファローカルにし、「残りの行を評価する」を関数に変え、この関数をフックに追加し、その後フックをきれいにしますか?それは本当に汚いですね?)
自分自身を明確にしない場合、またはどこかで利用可能な明らかな答えがある場合、プロセスの相互作用のすべての複雑さに本当に混乱しています。
必要に応じて、これをすべて実用的な例にすることができますが、以前に見つけて助けにならなかったすべてのような「特定のプロセスの答えを持つ特定のプロセスの質問」をもう1つ作成するだけです。
SOに関するいくつかの関連する質問: