2013-05-19 8 views
7

मैं एक Emacs मामूली मोड लिख रहा हूं जिसमें कुछ Emacs कमांड हैं जो खोल कमांड का आह्वान करते हैं। मैं निम्नलिखित कोड का उपयोग कर रहा:मैं Emacs shell कमांड आउटपुट बफर को हमेशा नीचे कैसे अनुसरण कर सकता हूं?

(let ((output (get-buffer-create "*Foo Output*"))) 
     (start-process "Foo Process" output argv0) 
     (display-buffer output)) 

मैं, या बहुत कम से कम हों उनके खोल स्वचालित रूप से नीचे किसी भी समय उत्पादन डाला जाता है करने के लिए स्क्रॉल करने के लिए आदेश बफर करना चाहते हैं जब आदेश को क्रियान्वित करने समाप्त हो गया है। मैं उसे कैसे कर सकता हूँ?

उत्तर

8

आप process filter function का उपयोग करके ऐसा कर सकते हैं।

एक प्रक्रिया फ़िल्टर फ़ंक्शन एक ऐसा फ़ंक्शन है जो संबंधित प्रक्रिया से मानक आउटपुट प्राप्त करता है। यदि किसी प्रक्रिया में फ़िल्टर होता है, तो उस प्रक्रिया से सभी आउटपुट फ़िल्टर को पास कर दिया जाता है। प्रक्रिया बफर सीधे प्रक्रिया से आउटपुट के लिए उपयोग की जाती है जब कोई फ़िल्टर नहीं होता है।

[...]

कई फिल्टर कार्यों कभी कभी (या हमेशा), प्रक्रिया के बफर में उत्पादन डालने जब कोई फिल्टर Emacs के कार्यों की नकल उतार।

start-process रिटर्न एक प्रक्रिया उद्देश्य यह है कि लिस्प में नए उपप्रक्रिया जो आप एक चर में स्टोर कर सकते हैं के लिए खड़ा है, proc का कहना है। आप एक साधारण फ़िल्टर फ़ंक्शन लिख सकते हैं जो केवल संबंधित आउटपुट बफर में प्रक्रिया के आउटपुट को सम्मिलित करता है, जिससे बफर के अंत में point स्थानांतरित हो जाता है।

(defun my-insertion-filter (proc string) 
    (when (buffer-live-p (process-buffer proc)) 
    (with-current-buffer (process-buffer proc) 
     ;; Insert the text, advancing the process marker. 
     (goto-char (process-mark proc)) 
     (insert string) 
     (set-marker (process-mark proc) (point))))) 

उपयोग set-process-filter अपनी प्रक्रिया है कि फिल्टर समारोह आवंटित करने के लिए।

(set-process-filter proc 'my-insertion-filter) 

वैकल्पिक रूप से, अगर यह पर्याप्त है करने के लिए केवल बफर के अंत करने के लिए कूद एक बार प्रक्रिया समाप्त कर दिया है, तो आप एक sentinel उपयोग करने के लिए चाहते हो सकता है।

एक प्रक्रिया प्रहरी एक समारोह में कहा जाता है कि जब भी जुड़े प्रक्रिया किसी भी कारण से स्थिति बदल जाती है, संकेत (चाहे Emacs द्वारा भेजे गए या प्रक्रिया के अपने कार्यों के कारण) है कि , समाप्त बंद करो, या जारी रखने के लिए भी शामिल है प्रक्रिया। प्रक्रिया सेंटीनेल भी है जिसे कहा जाता है कि प्रक्रिया निकलती है या नहीं।

(defun my-sentinel (proc event) 
    (when (buffer-live-p (process-buffer proc)) 
    (with-current-buffer (process-buffer proc) 
     (end-of-buffer)))) 

(ध्यान दें कि इस प्रक्रिया के अंत करने के लिए इस समारोह स्क्रॉल हर बार यह कहा जाता है जो न केवल प्रक्रिया के अंत में हो सकता है बफ़र। आप वास्तव में केवल यह है कि क्या करना चाहते हैं जब प्रक्रिया समाप्त कर दिया है, अपनी प्रक्रिया है कि प्रहरी आवंटित करने के लिए जाँच करता है, तो event स्ट्रिंग "finished\n" है।)

उपयोग set-process-sentinel

(set-process-sentinel proc 'my-sentinel) 
+0

मेरे पास इस प्रश्न का एक रूप है। मैं एक निश्चित कुंजी संयोजन को खोल कमांड (शेल कमांड फ़ंक्शन के माध्यम से) चलाने के लिए अपने .emacs में ग्लोबल-सेट-कुंजी का उपयोग कर रहा हूं।मुझे ओपी के समान समस्या है; मैं केवल * शेल कमांड आउटपुट * के शीर्ष को देखता हूं, नीचे नहीं। मैंने अपनी .emacs फ़ाइल में उपरोक्त प्रक्रिया-फ़िल्टर सामग्री को अंधाधुंध टाइप किया और मुझे एक चेतावनी मिली "चर के रूप में प्रतीक का मान शून्य है: proc" सेट-प्रोसेस-फ़िल्टर कमांड से आ रहा है। मुझे लगता है कि proc को खोल के बफर से जुड़ी प्रक्रिया का नाम माना जाता है लेकिन मेरे पास 0 lisp ज्ञान है। क्या मुझे चल रहा था किमडविया एम-एक्स? –

+0

@ केविनबज़र्ड आपकी समस्या को किसी टिप्पणी में उत्तर देने के लिए बहुत जटिल है, अधिक विस्तृत उत्तर देने के लिए उचित प्रश्न पूछने पर विचार करें। – Thomas

संबंधित मुद्दे