Her şeyden önce, bir feragatname. Bunu birçok kez araştırdım ve cevabı zaten bir şekilde bulduğuma eminim, ama sadece anlamıyorum.
Benim sorunum şudur:
- Comint üzerinden geçen bir süreç var
- Bir girdi satırı göndermek, çıktıyı yakalamak ve ne zaman bittiğini görmek istiyorum (çıktının son satırı bir istem için normal ifadeyle eşleştiğinde)
- yalnızca işlem çıktı göndermeyi bitirdiğinde, başka bir girdi satırı göndermek istiyorum (örneğin).
Biraz arka plan için, keyfi olarak uzun bir süre içinde keyfi bir çıktı verebilecek bir programla etkileşim uygulayan büyük bir modu düşünün. Bu alışılmadık bir durum olmamalı, değil mi? Tamam, belki de girişler arasında beklemem gereken kısım olağandışıdır, ancak girişi bir bütün olarak göndermeye göre birkaç avantajı vardır:
- çıkış tamponu güzel biçimlendirilmiş: giriş çıkış giriş çıkış ...
- daha da önemlisi, bir sürece çok fazla metin gönderirken, metin parçalara ayrılır ve parçalar süreç tarafından yapıştırılır; kesme noktaları isteğe bağlıdır ve bu bazen geçersiz girdi yapar (örneğin, işlemim bir tanımlayıcının ortasındaki bir girdi kesimini doğru şekilde yapıştırmaz)
Neyse, olağandışı ya da olmasın, o çıkıyor edilir karmaşık. Şu anda, bir şey kullanıyorum
(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))))
ve bunu her giriş hattı gönderdikten sonra ve bir sonrakini göndermeden önce çağırıyorum. Şey ... işe yarıyor, bu zaten bir şey.
Ama aynı zamanda çıkış beklerken emacs asmak yapar. Nedeni açıktır ve sleep-for
döngüye bir tür asenkron (örneğin 1s) eklersem çıktıyı 1s geciktirir, ancak asılıyı bastırır. Dışında bu tür bir asenkron var
sleep-for
gibi görünmüyor .
Yoksa öyle mi? Daha genel olarak, bunu emacs ile başarmanın deyimsel bir yolu var mı? Diğer bir deyişle:
Bir işleme girdi göndermek, çıktıyı beklemek, sonra eşzamansız olarak daha fazla girdi göndermek nasıl?
Etrafta arama yaparken (ilgili sorulara bakın), esas olarak nöbetçilerden bahsederim (ancak işlem bitmediği için benim durumumda geçerli olduğunu düşünmüyorum) ve bazı comint kancalardan (ama sonra ne? kanca tampon-yerel yapmak, benim "kalan satırları değerlendirmek" bir fonksiyona çevirmek, bu işlevi kanca eklemek ve daha sonra kanca temizlemek? gerçekten kulağa geliyor, değil mi?).
Kendimi açıklığa kavuşturmamaya üzüldüğüm için üzgünüm ya da bir yerde gerçekten açık bir cevap varsa, süreç etkileşiminin tüm karmaşıklıklarıyla gerçekten kafam karıştı.
Gerekirse, tüm bunları çalışan bir örnek haline getirebilirim, ancak daha önce bulduğum ve bana yardım etmeyenler gibi bir "spesifik süreç cevabına sahip özel süreç sorusu" daha yapacağından korkuyorum.
SO ile ilgili bazı sorular: