मैं एक बफर को पॉपअप किए बिना पृष्ठभूमि में एक async प्रक्रिया कैसे चला सकता हूं?


23

मैंने async-shell-commandअपने .emacs का उपयोग करके async बैकग्राउंड प्रोसेस को चलाने के लिए कुछ फ़ंक्शन को परिभाषित किया है , लेकिन हर बार जब मैं कमांड चलाता हूं तो एक नई विंडो (फ्रेम नहीं) बनाई जाती है और प्रक्रिया 'बफर' वहां दिखाई जाती है। मैं "पॉप अप" बफर के बिना कमांड कैसे चला सकता हूं?

जवाबों:


21

आप पृष्ठभूमि प्रक्रियाओं को शुरू कर सकते हैं start-process, जो एक बफर को पॉप अप नहीं करना चाहिए:

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

प्रक्रिया नामों को आवश्यक रूप से दोहराव से बचने के लिए संशोधित किया जाता है, इसलिए इसके बारे में चिंता न करें। बस इसे भविष्य में डिबगिंग के लिए उपयोगी नाम दें!

यदि आप एक देते हैं "buffer-name", तो एक बफर बनाया जाएगा लेकिन तुरंत नहीं दिखाया जाएगा। यह प्रक्रियाओं के प्रबंधन और आउटपुट को देखने के लिए सुविधाजनक हो सकता है। यदि आप बफ़र बिलकुल नहीं बनाना चाहते हैं, nilतो बफ़र नाम के रूप में पास करें:

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

क्या start-processसुडोल कमांड के लिए उपयोग करना संभव है ? मैंने अपना कॉल रैप करने की कोशिश की start-process, (let ((default-directory "/sudo::")) ... )लेकिन यह मेरे लिए काम नहीं आया।
साइड-काप

@ sid-kap: मुझे नहीं पता। आपको शायद यह पूछना चाहिए कि एक स्टैंडअलोन प्रश्न के रूप में।
तिखन जेल्विस

1
"program"इस मामले में केवल कार्यक्रम का नाम है (उदाहरण के लिए नॉटिलस, काजा, फ़ायरफ़ॉक्स) और "arg1 arg2 ..."चौथे स्थिति तर्क में होना चाहिए start-process। मुझे लगा कि दस्तावेज़ीकरण पढ़कर :)
biocyberman

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))))

Emacs फ़ंक्शन विवरण से:

(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तो आपको Emacs प्रलेखन से संक्षिप्त उत्तर मिलेगा: (सेट-प्रोसेस-सेंटीनेल प्रोसेस सेंटिनल) प्रोसील को सेंटिनल सेंटिनल दें; डिफ़ॉल्ट के लिए शून्य। जब प्रक्रिया में परिवर्तन होता है, तो प्रहरी को एक फ़ंक्शन के रूप में कहा जाता है। यह दो तर्क देता है: प्रक्रिया, और परिवर्तन का वर्णन करने वाला एक स्ट्रिंग।
वायमंडो सेप

1
पर प्रहरी जीएनयू Emacs मैनुअल पृष्ठों और प्रक्रियाओं वास्तव में अधिक विस्तृत जानकारी के लिए बहुत अच्छे हैं।
वेमोडो

ठंडा। शायद आप अपने उत्तर में लिंक संपादित कर सकते हैं? मुझे लगता है कि एक और अधिक बस का उपयोग कर सीख सकता है C-h f...
Tikhon Jelvis

2

यह बदलने की आवश्यकता नहीं है कि आप एक अतुल्यकालिक कमांड कैसे चलाते हैं। Emacs में एक सामान्य क्षमता होती है, जिससे आप यह नियंत्रित कर सकते हैं कि कोई भी बफर पॉप-अप करेगा, एकल डेटा संरचना को संशोधित करके display-buffer-alist

नीचे दिए गए समाधान में, आप देख सकते हैं कि एक्शन फ़ंक्शन display-buffer-no-window(अर्थात। कोई पॉप-अप) नाम के साथ किसी भी बफर के साथ जुड़ा होने की शुरुआत नहीं है *Asynchronous Shell Command*(emacs एक वृद्धिशील प्रत्यय जोड़ता है जब इसे एक से अधिक बनाने के लिए कहा जाता है)।

अन्य उपलब्ध प्रदर्शन विकल्पों 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))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.