Pertama-tama, penafian. Saya telah meneliti ini berkali-kali, dan saya cukup yakin bahwa saya sudah menemukan jawabannya, tetapi saya tidak memahaminya.
Masalah saya adalah sebagai berikut:
- Saya memiliki proses yang berjalan melalui comint
- Saya ingin mengirim sederetan input, menangkap output dan melihat kapan usai (ketika baris terakhir dari output cocok dengan regexp untuk prompt)
- hanya ketika prosesnya selesai mengirimkan output, saya ingin mengirim jalur input lain (misalnya).
Untuk sedikit latar belakang, pikirkan mode utama yang menerapkan interaksi dengan suatu program, yang dapat mengembalikan jumlah output yang sewenang-wenang, dalam waktu yang lama secara sewenang-wenang. Ini seharusnya bukan situasi yang tidak biasa, bukan? Oke, mungkin bagian di mana saya harus menunggu di antara input tidak biasa, tetapi memiliki beberapa keunggulan dibandingkan mengirim input secara keseluruhan:
- buffer output diformat dengan baik: input output input output ...
- yang lebih penting, ketika mengirim banyak teks ke suatu proses, teks tersebut dipotong-potong dan potongan-potongan tersebut ditempelkan kembali oleh proses; titik potong sewenang-wenang dan ini kadang-kadang membuat input tidak valid (misalnya, proses saya tidak akan menempelkan kembali dengan benar potongan input di tengah pengenal, misalnya)
Pokoknya, tidak biasa atau tidak, ternyata bahwa itu adalah rumit. Saat ini, saya menggunakan sesuatu di sepanjang baris
(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))))
dan saya menyebutnya setiap kali setelah mengirim saluran input, dan sebelum mengirim yang berikutnya. Yah ... itu berhasil, itu sudah sesuatu.
Tapi itu juga membuat emacs hang sambil menunggu output. Alasannya jelas, dan saya pikir jika saya memasukkan semacam asinkron sleep-for
(misalnya 1s) dalam loop itu akan menunda output oleh 1s, tetapi menekan penggantinya. Kecuali bahwa tampaknya jenis sinkron
sleep-for
tidak ada .
Atau apakah itu? Secara umum, adakah cara idiomatis untuk mencapai hal ini dengan emacs? Dengan kata lain:
Bagaimana cara mengirim input ke suatu proses, menunggu output, kemudian mengirim lebih banyak input, secara tidak sinkron?
Ketika mencari di sekitar (lihat pertanyaan terkait), saya terutama melihat menyebutkan penjaga (tapi saya tidak berpikir itu berlaku dalam kasus saya, karena prosesnya tidak selesai) dan beberapa kait komint (tapi kemudian apa? Haruskah saya buat hook-buffer lokal, ubah "evaluasi sisa baris" saya menjadi fungsi, tambahkan fungsi ini ke hook dan bersihkan hook sesudahnya? kedengarannya sangat kotor, bukan?).
Saya minta maaf jika saya tidak membuat diri saya jelas, atau jika benar-benar ada jawaban yang jelas di suatu tempat, saya benar-benar bingung dengan semua kerumitan interaksi proses.
Jika perlu, saya bisa menjadikan ini semua contoh yang baik, tetapi saya khawatir itu hanya akan membuat satu lagi "pertanyaan proses spesifik dengan jawaban proses spesifik" seperti semua yang saya temukan sebelumnya dan tidak membantu saya.
Beberapa pertanyaan terkait pada SO: