เพื่อความชัดเจนฉันไม่ได้พูดถึงสิ่งที่ควรกำหนดให้ emacs เป็นแบบมัลติเธรด ในการทำซ้ำ:
- emacs -Q # ฉันทำงาน 24.4.1
- ทำเฟรมที่สอง
- สลับกลับไปที่เฟรมแรก
- Mx เชลล์
- Mx เปลี่ยนชื่อไม่ซ้ำใคร (เราจะสร้างเชลล์ที่สองในภายหลัง)
- เริ่มวิ่ง:
while true; do echo "hello world"; done
- ในเฟรมที่สอง Mx shell
เชลล์ที่สองแทบจะไม่แสดงผลเลย (แทบจะไม่ได้ผลเลยหลังจากพยายามซ้ำหลายครั้ง) เห็นได้ชัดว่า emacs จะไม่มีวันหยุดพักจากการอ่านเอาต์พุตของเชลล์แรกเพื่อฟังเอาต์พุตที่มาจากกระบวนการอื่น ๆ มันจะเป็นพฤติกรรมที่ดีกว่ามากสำหรับการปัดโรบินเมื่อมีหลายกระบวนการที่มีเอาต์พุตที่ค้างอยู่ มีวิธีใดที่จะทำให้พฤติกรรมดีขึ้นหรือไม่
เคล็ดลับเดียวที่ฉันรู้คือการทำให้เชลล์บัฟเฟอร์เป็นกระบวนการของตัวเอง แต่น่าเสียดายที่มันไม่ได้ผลสำหรับฉัน แม้ว่าฉันจะทำเช่นนั้นฉันก็ต้องเรียกใช้ subprocess เพื่อฟังซอคเก็ตเพื่อให้ซอฟต์แวร์รู้จำเสียงพูดทำงานได้เพื่อที่ฉันจะสามารถควบคุมเชลล์ได้ตั้งแต่แรกนั่นคือวิธีที่ฉันค้นพบสิ่งนี้ การเรียกใช้ลูปไม่สิ้นสุดเช่นด้านบนป้องกันไม่ให้ข้อมูลใด ๆ ถูกถอดออกจากซ็อกเก็ต
start-process
กับ aset-process-filter
และ aset-process-sentinel
- สิ่งนี้ช่วยให้ฉันสามารถทำสิ่งอื่น ๆ ได้ในขณะที่กระบวนการทำงาน - ฉันยังส่งผลลัพธ์ของฉันไปยัง*Messages*
บัฟเฟอร์โดยใช้บางครั้งเพื่อinsert
ให้พื้นที่ echo ของฉันไม่ถูกแตะต้องหรือใช้ บัฟเฟอร์เอาต์พุตกระบวนการเฉพาะ (ถ้าจำเป็น) ตัวอย่างเช่นฉันสามารถเรียกใช้rsync
เซสชั่นที่มีความยาว ฉันไม่มีประสบการณ์ใด ๆ ที่พยายามใช้หลาย ๆ อย่างพร้อมกัน / มีความยาวstart-process
ดังนั้นฉันไม่แน่ใจว่า Emacs จะจัดการกับสิ่งเหล่านี้ได้อย่างไร