คำถามติดแท็ก comint

1
แบบอะซิงโครนัสรอผลลัพธ์จากกระบวนการ comint
ก่อนอื่นข้อจำกัดความรับผิดชอบ ฉันค้นคว้ามาหลายครั้งแล้วและฉันค่อนข้างมั่นใจว่าฉันได้พบคำตอบแล้วไม่ทางใดก็ทางหนึ่ง แต่ฉันก็ไม่เข้าใจ ปัญหาของฉันคือต่อไปนี้: ฉันมีกระบวนการทำงานผ่าน 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)) …

1
เป็นไปได้หรือไม่ที่จะอ่านอินพุตของผู้ใช้จาก STDIN ขณะที่กำลังบล็อกซอร์สบล็อก?
เป็นไปได้ไหมที่จะอ่านอินพุตของผู้ใช้จาก STDIN ในขณะที่กำลังบล็อกซอร์สด้วยorg-babel-tangle? ผมตระหนักถึงเรื่องนี้: Org โหมดบาเบล - code อินเตอร์แอคทีประเมินบล็อก นั่นไม่ได้ช่วยแก้กรณีการใช้งานนี้โดยเฉพาะเนื่องจากมันยังไม่อนุญาตอินพุต STDIN ที่เหมาะสมจากเชลล์ แต่จำลองอินพุตที่ จำกัดภายใน Emacs เท่านั้น พื้นหลัง ฉันต้องการใช้ Babel ของ Org เพื่อเรียนรู้ภาษาการเขียนโปรแกรมใหม่ (Perl และ Bash) โดยใช้บทเรียนจากไฟล์ org หนึ่งไฟล์ ปัญหาคือบทเรียนจำนวนมากพึ่งพา STDIN ตัวอย่างเช่นหากมีการทำงานชิ้นอาหารอันโอชะ Perl ต่อไปนี้: #+BEGIN_SRC perl :tangle hello-name.pl :results output :export code use 5.010; use strict; use warnings; say "What is …

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

1
การจดจำประวัติระหว่างเซสชันใน Inferior Emacs Lisp Mode
ฉันไม่สามารถทำให้ Emacs จดจำประวัติของ*ielm*บัฟเฟอร์ระหว่างเซสชันได้ comint-input-ringเท่าที่ผมสามารถบอกประวัติดังกล่าวจะถูกบันทึกไว้ในตัวแปรบัฟเฟอร์ท้องถิ่น ดังนั้นฉันจึงได้เพิ่มการแสดงออกต่อไปนี้ไปยังไฟล์ init ของฉัน: (setq desktop-locals-to-save (append desktop-locals-to-save '((comint-input-ring . 50)))) มันไม่ทำงาน ฉันรู้ว่าdesktopแพคเกจใช้งานได้เพราะ Emacs จดจำตัวแปรทั่วโลกที่ฉันเพิ่มไว้desktop-globals-to-saveในไฟล์ init ของฉัน - แก้ไข: savehistไม่ทำงานอย่างใดอย่างหนึ่ง ฉันคิดว่าเป็นเพราะcomint-input-ringเป็นตัวแปรบัฟเฟอร์ท้องถิ่น

4
วิธีทำให้คำสั่ง shell-shell รันโดยใช้เชลล์โปรไฟล์และ hooks ไดเรกทอรีปัจจุบัน (เช่น direnv)
ฉันพยายามที่จะรับshell-commandและasync-shell-commandบูรณาการอย่างราบรื่นกับสองสามโปรแกรมใน.bashrcไฟล์ของฉันโดยเฉพาะdirenvในตัวอย่างนี้ ฉันพบว่าถ้าฉันปรับแต่งshell-command-switchฉันจะได้รับกระบวนการเปลือกโหลดโปรไฟล์ของฉันราวกับว่ามันเป็นเปลือกเข้าสู่ระบบแบบโต้ตอบปกติ: (setq shell-command-switch (purecopy "-ic")) (setq ชัดแจ้ง -bash-args '("-ic" "ส่งออก EMACS =; stty echo; bash")) นอกจากนี้ผมยังใช้exec เส้นทางจากเปลือก ว่าฉันมี~/.bashrcไฟล์ด้วย: ... eval "$ (direnv hook $ 0)" echo "foo" ข้างใน~/code/fooฉันมี.envrcไฟล์ด้วย: ส่งออก PATH = $ PWD / bin: $ PATH echo "bar" ถ้าฉันรันM-x shellด้วยdefault-directoryset to ~/code/foo, bash shell จะโหลดโปรไฟล์ของฉันอย่างถูกต้องและรัน direnv hook เพื่อเพิ่มเข้าไปในเส้นทางของฉัน: …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.