सबसे पहले, एक अस्वीकरण। मैंने कई बार इस पर शोध किया है, और मुझे पूरा यकीन है कि मुझे पहले से ही एक या दूसरे तरीके का जवाब मिल गया है, लेकिन मैं अभी इसे समझ नहीं पाया हूं।
मेरी समस्या निम्नलिखित है:
- मेरे पास कॉमिंट के माध्यम से एक प्रक्रिया चल रही है
- मैं इनपुट की एक लाइन भेजना चाहता हूं, आउटपुट कैप्चर करना चाहता हूं और देखना चाहता हूं कि कब खत्म हो (जब आउटपुट की आखिरी लाइन एक प्रॉम्प्ट के लिए 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))))
और मैं हर बार इनपुट लाइन भेजने के बाद, और अगले को भेजने से पहले इसे कॉल करता हूं। अच्छा ... यह काम करता है, यह पहले से ही कुछ है।
लेकिन यह आउटपुट के इंतजार के दौरान एमएसीएस को लटका भी देता है। कारण स्पष्ट है, और मुझे लगा कि अगर मैंने sleep-for
लूप में किसी तरह के एसिंक्रोनस (उदाहरण के लिए 1s) को शामिल किया है तो यह 1 एस से आउटपुट में देरी करेगा, लेकिन फांसी को दबा देगा। सिवाय इसके कि ऐसा लगता है कि इस तरह की अतुल्यकालिक
sleep-for
मौजूद नहीं है ।
या करता है? अधिक आम तौर पर, वहाँ इस emacs के साथ प्राप्त करने का एक मुहावरेदार तरीका है? दूसरे शब्दों में:
किसी प्रक्रिया में इनपुट कैसे भेजें, आउटपुट की प्रतीक्षा करें, फिर अतुल्यकालिक रूप से अधिक इनपुट भेजें?
जब चारों ओर खोज (संबंधित प्रश्नों को देखें), मैंने मुख्य रूप से प्रहरी का उल्लेख देखा है (लेकिन मुझे नहीं लगता कि यह मेरे मामले में लागू होता है, क्योंकि प्रक्रिया समाप्त नहीं होती है) और कुछ कॉमिंट हुक के (लेकिन फिर क्या चाहिए?) हुक को बफ़र-स्थानीय बनाएं, मेरी "शेष रेखाओं का मूल्यांकन" एक फंक्शन में करें, इस फंक्शन को हुक में जोड़ें और हुक को बाद में साफ़ करें; यह वास्तव में गंदा लगता है, है ना?)।
मुझे खेद है कि अगर मैं खुद को स्पष्ट नहीं कर रहा हूं, या अगर कहीं एक स्पष्ट जवाब उपलब्ध है, तो मैं वास्तव में प्रक्रिया की बातचीत की सभी जटिलताओं से भ्रमित हूं।
यदि आवश्यक हो, तो मैं यह सब एक कार्यशील उदाहरण बना सकता हूं, लेकिन मुझे डर है कि यह सिर्फ एक और "विशिष्ट प्रक्रिया उत्तर के साथ विशिष्ट प्रक्रिया प्रश्न" बना देगा, जो मुझे पहले मिला था और मेरी मदद नहीं की।
SO पर कुछ संबंधित प्रश्न: