ก่อนอื่นข้อจำกัดความรับผิดชอบ ฉันค้นคว้ามาหลายครั้งแล้วและฉันค่อนข้างมั่นใจว่าฉันได้พบคำตอบแล้วไม่ทางใดก็ทางหนึ่ง แต่ฉันก็ไม่เข้าใจ
ปัญหาของฉันคือต่อไปนี้:
- ฉันมีกระบวนการทำงานผ่าน comint
- ฉันต้องการส่งบรรทัดอินพุตจับเอาต์พุตและดูเมื่อมันจบ (เมื่อบรรทัดสุดท้ายของเอาต์พุตตรงกับ regexp สำหรับพรอมต์)
- เมื่อกระบวนการส่งเอาต์พุตเสร็จสิ้นแล้วเท่านั้นฉันต้องการส่งอินพุตอีกบรรทัดหนึ่ง (ตัวอย่าง)
สำหรับพื้นหลังเล็กน้อยให้คิดว่าเป็นโหมดหลักที่ใช้การโต้ตอบกับโปรแกรมซึ่งอาจส่งคืนเอาต์พุตจำนวนเท่าใดก็ได้ในเวลานานโดยพลการ นี่ไม่ควรเป็นสถานการณ์ที่ผิดปกติใช่มั้ย โอเคบางทีส่วนที่ฉันต้องรอระหว่าง อินพุตนั้นผิดปกติ แต่ก็มีข้อดีเล็กน้อยในการส่งอินพุตโดยรวม:
- บัฟเฟอร์เอาต์พุตถูกจัดรูปแบบเป็นอย่างดี: อินพุตเอาต์พุตอินพุตเอาต์พุต ...
- ที่สำคัญกว่านั้นเมื่อส่งข้อความจำนวนมากไปยังกระบวนการข้อความจะถูกตัดเป็นชิ้น ๆ และชิ้นส่วนจะถูกวางกลับโดยกระบวนการ จุดตัดเป็นสิ่งที่ไม่แน่นอนและบางครั้งสิ่งนี้ทำให้อินพุตไม่ถูกต้อง (กระบวนการของฉันจะไม่วางกลับอย่างถูกต้องเช่นการป้อนข้อมูลที่อยู่ตรงกลางของตัวระบุ)
อย่างไรก็ตามผิดปกติหรือไม่ปรากฏว่ามีความซับซ้อน ตอนนี้ฉันกำลังใช้บางสิ่งบางอย่างตามแนวของ
(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 ค้างในขณะที่รอเอาต์พุต เหตุผลชัดเจนและฉันคิดว่าถ้าฉันรวม asynchronous sleep-for
(ตัวอย่างเช่น 1s) ในลูปมันจะหน่วงเวลาเอาต์พุตโดย 1s แต่ระงับการแขวน ยกเว้นว่ามันดูเหมือนว่าชนิดของการไม่ตรงกันนี้
ไม่ได้อยู่sleep-for
หรือไม่ โดยทั่วไปแล้วจะมีวิธีการสำนึกในเรื่องนี้ด้วย emacs หรือไม่? ในคำอื่น ๆ :
วิธีส่งอินพุตไปยังกระบวนการรอเอาต์พุตจากนั้นส่งอินพุตเพิ่มเติมแบบอะซิงโครนัส?
เมื่อค้นหาไปรอบ ๆ (ดูคำถามที่เกี่ยวข้อง) ฉันได้เห็นการกล่าวถึง sentinels เป็นส่วนใหญ่ (แต่ฉันไม่คิดว่ามันใช้ในกรณีของฉันเนื่องจากกระบวนการไม่เสร็จสิ้น) และมี comint hooks (แต่ถ้าเป็นเช่นนั้นฉันควรทำอย่างไร ทำให้ hook buffer-local เปลี่ยน "ประเมินบรรทัดที่เหลือ" ของฉันเป็นฟังก์ชั่นเพิ่มฟังก์ชั่นนี้ลงใน hook และทำความสะอาด hook หลังจากนั้น - ซึ่งฟังดูสกปรกจริงๆใช่ไหม?)
ฉันขอโทษถ้าฉันไม่ทำให้ตัวเองชัดเจนหรือถ้ามีคำตอบที่ชัดเจนอยู่ที่ไหนสักแห่งฉันก็สับสนด้วยความสลับซับซ้อนทั้งหมดของการมีส่วนร่วมในกระบวนการ
หากจำเป็นฉันสามารถทำให้เป็นตัวอย่างที่ใช้งานได้ทั้งหมด แต่ฉันกลัวว่ามันจะทำให้ "คำถามกระบวนการเฉพาะเจาะจงอีกหนึ่งคำตอบกับกระบวนการเฉพาะ" อีกครั้งเหมือนกับที่ฉันพบก่อนหน้านี้และไม่ได้ช่วยฉันเลย
บางคำถามที่เกี่ยวข้องกับ SO: