প্রথমত, একটি দাবি অস্বীকার। আমি এটি বহুবার গবেষণা করেছি এবং আমি নিশ্চিত যে আমি উত্তরটি ইতিমধ্যে এক বা অন্যভাবে খুঁজে পেয়েছি তবে আমি এটি বুঝতে পারি না।
আমার সমস্যা নিম্নলিখিত:
- আমার একটি প্রক্রিয়া কমেন্টের মাধ্যমে চলছে
- আমি ইনপুটটির একটি লাইন প্রেরণ করতে, আউটপুট ক্যাপচার করতে এবং এটি শেষ হয়ে গেলে দেখতে চাই (যখন আউটপুটটির শেষ লাইনটি একটি প্রম্পটের জন্য রিজেক্সের সাথে মেলে)
- প্রক্রিয়াটি আউটপুট প্রেরণ শেষ করলেই আমি অন্য একটি লাইন ইনপুট (উদাহরণস্বরূপ) প্রেরণ করতে চাই।
কিছুটা ব্যাকগ্রাউন্ডের জন্য, এমন কোনও প্রোগ্রামের সাথে ইন্টারঅ্যাকশন প্রয়োগকারী একটি মোড মোডের কথা চিন্তা করুন, যা নির্বিচারে দীর্ঘ সময় ধরে নির্বিচারে আউটপুট দিতে পারে। এটি একটি অস্বাভাবিক পরিস্থিতি হওয়া উচিত না, তাই না? ঠিক আছে, আমার যে অংশটি ইনপুটগুলির মধ্যে অপেক্ষা করতে হবে এটি অস্বাভাবিক, তবে সামগ্রিকভাবে ইনপুটটি প্রেরণের কয়েকটি সুবিধা রয়েছে:
- আউটপুট বাফারটি সুন্দরভাবে ফর্ম্যাট করা হয়েছে: ইনপুট আউটপুট ইনপুট আউটপুট ...
- আরও গুরুত্বপূর্ণ বিষয়, কোনও প্রক্রিয়ায় প্রচুর পাঠ্য প্রেরণ করার সময়, পাঠ্যটি টুকরো টুকরো করে কেটে দেওয়া হয় এবং প্রক্রিয়া দ্বারা টুকরোগুলি পেস্ট করা হয়; কাটিং পয়েন্টগুলি স্বেচ্ছাচারিত হয় এবং এটি কখনও কখনও অবৈধ ইনপুট করে তোলে (উদাহরণস্বরূপ, আমার প্রক্রিয়াটি সনাক্তকারীটির মাঝখানে কোনও ইনপুট কাট সঠিকভাবে পেস্ট করবে না)
যাই হোক, অস্বাভাবিক না, এটি সক্রিয় আউট এটি করা হয় জটিল। এই মুহুর্তে, আমি এর লাইনে কিছু ব্যবহার করছি
(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
অস্তিত্ব নেই ।
নাকি তা করে? আরও সাধারণভাবে, ইমাস সহ এটি অর্জনের কোনও মূ ?় উপায় আছে কি? অন্য কথায়:
কীভাবে কোনও প্রক্রিয়াতে ইনপুট প্রেরণ করা যায়, আউটপুটটির জন্য অপেক্ষা করুন, তারপরে আরও ইনপুট, সংশ্লেষক্রমে প্রেরণ করবেন?
আশেপাশে অনুসন্ধান করার সময় (সম্পর্কিত প্রশ্নগুলি দেখুন), আমি মূলত সেন্ডিনেলগুলির উল্লেখ দেখেছি (তবে আমার মনে হয় না যে এটি আমার ক্ষেত্রে প্রযোজ্য, যেহেতু প্রক্রিয়াটি শেষ হয় না) এবং কিছু কমেন্ট হুক (তবে কি তবে আমার উচিত?) হুক বাফার-লোকাল করুন, আমার "অবশিষ্ট রেখাগুলি মূল্যায়ন করুন" একটি ফাংশনে পরিণত করুন, এই ফাংশনটি হুকটিতে যুক্ত করুন এবং পরে হুকটি পরিষ্কার করুন? যা সত্যিই নোংরা শোনায়, তাই না?)।
আমি নিজেকে দুঃখিত করে দিচ্ছি না, বা যদি সত্যিই কোথাও একটি সুস্পষ্ট উত্তর পাওয়া যায় তবে আমি প্রক্রিয়া মিথস্ক্রিয়তার সমস্ত জটিলতার দ্বারা সত্যই বিভ্রান্ত হয়ে পড়েছি বলে আমি দুঃখিত।
যদি প্রয়োজন হয় তবে আমি এটি সমস্ত কার্যকরী উদাহরণ হিসাবে তৈরি করতে পারি, তবে আমি আশঙ্কা করছি যে এটি আমার আগে পাওয়া সমস্তগুলির মতো আরও একটি "নির্দিষ্ট প্রক্রিয়া উত্তর সহ একটি নির্দিষ্ট প্রক্রিয়া প্রশ্ন" তৈরি করবে।
এসও সম্পর্কিত কিছু সম্পর্কিত প্রশ্ন: