আমি বাফার পপিং না করে কীভাবে পটভূমিতে একটি অ্যাসিঙ্ক প্রক্রিয়া চালাতে পারি?


23

আমি .emacs ব্যবহার করে অ্যাসিঙ্ক ব্যাকগ্রাউন্ড প্রক্রিয়া চালানোর জন্য কিছু ফাংশন সংজ্ঞায়িত async-shell-commandকরেছি, তবে যতবার আমি কমান্ডগুলি চালনা করি একটি নতুন উইন্ডো (ফ্রেম নয়) তৈরি হয় এবং প্রক্রিয়াটির বাফারটি সেখানে প্রদর্শিত হয়। "পপ আপ" বাফার ছাড়াই আমি কীভাবে কমান্ডটি চালাতে পারি?

উত্তর:


21

আপনি এর সাথে ব্যাকগ্রাউন্ড প্রক্রিয়াগুলি শুরু করতে পারেন start-process, যা কোনও বাফার পপআপ করা উচিত নয়:

(start-process "process-name" "buffer-name" "program")

প্রক্রিয়া নামগুলি যথাযথভাবে সদৃশ এড়াতে পরিবর্তিত হয়, তাই এটি নিয়ে চিন্তা করবেন না। ভবিষ্যতে ডিবাগিংয়ের জন্য কেবল এটিকে একটি নাম দিন!

আপনি যদি একটি দেন "buffer-name", একটি বাফার তৈরি করা হবে তবে অবিলম্বে প্রদর্শিত হবে না। প্রক্রিয়া পরিচালনা এবং আউটপুট দেখার জন্য এটি সুবিধাজনক হতে পারে। আপনি যদি চান না যে কোনও বাফার মোটামুটি তৈরি হয়, nilতবে বাফারের নাম হিসাবে পাস করুন :

(start-process "process-name" nil "program")

start-processএকটি sudo কমান্ড ব্যবহার করা সম্ভব ? আমি আমার কল মোড়কে চেষ্টা start-processমধ্যে (let ((default-directory "/sudo::")) ... )কিন্তু এটা আমার জন্য কাজ করে নি।
sid-kap

@ সিড-ক্যাপ: আমি জানি না। আপনার সম্ভবত এটি একটি স্বতন্ত্র প্রশ্ন হিসাবে জিজ্ঞাসা করা উচিত।
টিখন জেলভিস

1
"program""arg1 arg2 ..."এক্ষেত্রে কেবলমাত্র প্রোগ্রামের নাম (যেমন নটিলাস, কাজা, ফায়ারফক্স) এবং এর চতুর্থ অবস্থানিক যুক্তিতে থাকা উচিত start-process। ডকুমেন্টেশন পড়ে আমি বুঝতে পেরেছি :)
বায়োসাইবারম্যান

8

টিখনের (start-process)যেমন উল্লেখ করা হয়েছে, সেভাবেই চলার পথ। আপনি যদি বাফার তৈরি করতে না চান তবে পটভূমি প্রক্রিয়া স্থিতিতে প্রতিক্রিয়া জানাতে চান, আপনি নিয়োগ করতে পারেন (set-process-sentinel)। আমি এখানে আমার projectorপ্যাকেজটি থেকে একটি পরিবর্তিত উদাহরণ নিচ্ছি :

(set-process-sentinel (start-process "process-name" nil "command") #'output-message-sentinel)

(defun output-message-sentinel (process msg)
  (when (memq (process-status process) '(exit signal))
    (message (concat (process-name process) " - " msg))))

ইমাস ফাংশন বর্ণনা থেকে:

(set-process-sentinel PROCESS SENTINEL)

Give PROCESS the sentinel SENTINEL; nil for default.
The sentinel is called as a function when the process changes state.
It gets two arguments: the process, and a string describing the change.

গনুহ প্রক্রিয়ার উপর ম্যানুয়াল পেজ আরও তথ্যের জন্য বেশ ভাল।


আপনি কি set-process-sentinelআরও কিছুটা নির্ভুলভাবে বর্ণনা করতে পারেন? প্রক্রিয়া পরিচালনা করে এমন একটি ক্রিয়াকলাপের সম্পর্কে আমি সাধারণ ধারণা পেয়েছি তবে আমি সমস্ত বিবরণ পুরোপুরি বুঝতে পারি না। ধন্যবাদ!
টিখন জেলভিস

আপনি যদি M-x describe-functionপ্রবেশ করেন এবং প্রবেশ করেন set-process-sentinelআপনি ইমাস ডকুমেন্টেশন থেকে সংক্ষিপ্ত উত্তর পাবেন: (সেট-প্রক্রিয়া-প্রেরণাত্মক প্রক্রিয়া কেন্দ্র) প্রসেসকে সেন্ডিনেল সেন্টিনেল দিন; ডিফল্ট জন্য শূন্য। প্রসেসের স্থিতি পরিবর্তিত হওয়ার সময় সেন্ডিনেলকে একটি ফাংশন হিসাবে ডাকা হয়। এটি দুটি যুক্তি পায়: প্রক্রিয়া এবং একটি স্ট্রিং পরিবর্তনের বর্ণনা দেয়।
ওয়েমমন্ডো

1
উপর সেন্টিনেল গনুহ গিয়ে Emacs ম্যানুয়াল পেজ এবং প্রসেস আসলে আরো বিস্তারিত তথ্যের জন্য বেশ ভাল আছে।
ওয়েমমন্ডো

কুল। সম্ভবত আপনি নিজের উত্তরের লিঙ্কগুলি সম্পাদনা করতে পারেন? আমি অনুমান করি যে কেউ কেবল ব্যবহার করে আরও শিখতে পারে C-h f...
তিখন জেলভিস

2

আপনি কীভাবে অ্যাসিক্রোনাস কমান্ড চালাবেন তা পরিবর্তন করার দরকার নেই। ইমাক্সের একটি সাধারণ ক্ষমতা রয়েছে যা আপনাকে কোনও একক ডেটা স্ট্রাকচার, ifyingষত্পরিবর্তন করে কোথায় বা কোনও বাফার পপ-আপ করবে কিনা তা নিয়ন্ত্রণ করতে দেয় display-buffer-alist

নীচের সমাধানে, আপনি দেখতে পাচ্ছেন যে অ্যাকশন ফাংশন display-buffer-no-window(অর্থাত্ কোনও পপ-আপ) কোনও নাম শুরুর সাথে কোনও বাফারের সাথে সম্পর্কিত হবে সেট করা হয়েছে *Asynchronous Shell Command*(যখন একাধিক তৈরি করতে বলা হয় তখন ইমাস একটি বর্ধিত প্রত্যয় যুক্ত করে)।

অন্যান্য উপলভ্য প্রদর্শন বিকল্পগুলির তালিকা দেখতে, টাইপ করুন C-h f display-bufferএবং "অ্যাকশন ফাংশন" এর তালিকাটি অনুসন্ধান করুন।

;; Buffers that I don't want popping up by default
(add-to-list 'display-buffer-alist
  '("\\*Async Shell Command\\*.*" display-buffer-no-window))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.