2012-08-23 9 views
18

मैं शेल-कमांड का उपयोग कर एक emacs बफर में किसी एप्लिकेशन का आउटपुट चला रहा हूं।मैं एसिंक्रोनस शेल-कमांड से emacs आउटपुट को कैसे बढ़ा सकता हूं?

(shell-command "verbose-app &" "*verbose-app*") 

समस्या यह आदेश अत्यंत verbose है। इतने सारे, कि कभी-कभी emacs बफर को पकड़ने के लिए कई सेकंड लगते हैं। यह वास्तविक आउटपुट के साथ कई सेकंड तक लगी है।

क्या कोई तरीका है कि मैं कुछ अक्षम करके आउटपुट स्क्रॉलिंग को तेज कर सकता हूं? रेगेक्स-मिलान या सिंटैक्स हाइलाइटिंग की तरह?

भविष्य में संदर्भ के लिए:

वर्बोज़ एप्लिकेशन adb logcat है।

(defun adb-logcat() 
    (interactive) 
    (shell-command "adb logcat -v threadtime&" "*adb-logcat*") 
    (pop-to-buffer "*adb-logcat*") 
    (buffer-disable-undo)) 
निम्नलिखित करने के लिए

:

(defun adb-logcat() 
    (interactive) 
    (start-process "*adb-logcat*" "*adb-logcat*" "/bin/sh" "-c" "adb logcat -v threadtime") 
    (pop-to-buffer "*adb-logcat*") 
    (buffer-disable-undo)) 

अब यह तरीका तेजी से स्क्रॉल मैं अपने मौजूदा समारोह बदल दिया है। वाह!

+0

आप वर्बोज़ ऐप के आउटपुट को अनबफर करने का प्रयास कर सकते हैं: http : //stackoverflow.com/a/3466024/265069 – Tom

+0

मै मैकॉक्स चला रहा हूं, इसलिए अनबफर उपलब्ध नहीं है। – hyperlogic

+0

मुझे ओएस एक्स नहीं पता, लेकिन Google यह कहता है: http://jubianchi.fr/help/3.Tweaks/unbuffered-processes यदि यह काम नहीं करता है तो आप Google – Tom

उत्तर

10

प्रलेखन की तरह, shell-command एक निम्नतम खोल में कमांड चलाता है, जिसका अर्थ shell-mode है। यदि आप केवल आउटपुट और सुविधाओं में से कोई भी नहीं चाहते हैं, तो start-process के साथ कमांड चलाने से आप जो चाहते हैं उसके करीब हो सकते हैं।

(start-process "*verbose-app*" "*verbose-app*" 
"/bin/sh" "-c" "verbose-app") 

इसे किसी फ़ंक्शन में लपेटना बहुत मुश्किल नहीं होना चाहिए। आप देखना चाहते हैं कि shell-command एसिंक आदेश कैसे लागू करता है; उदाहरण के लिए, यह पूछेगा कि क्या यह मौजूदा प्रक्रिया को समाप्त कर देना चाहिए यदि आप एक बनाते हैं तो कोई दूसरा अस्तित्व में है। http://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/simple.el#n2447 एक अच्छा प्रारंभिक बिंदु हो सकता है। (यदि लिंक खराब हो जाता है, तो यह defun shell-command के अंदर एक लिंक है, जो एम्पर्सेंड को संभालने के बारे में एए टिप्पणी को इंगित करता है। यदि यह है, तो कमांड अतुल्यकालिक रूप से चलाया जाएगा।)

+0

हम्म के साथ विकल्पों की तलाश कर सकते हैं। आज के रूप में वर्तमान हेड को इंगित करने के लिए मैं गिट लिंक कैसे ठीक करूं? – tripleee

+0

आप महोदय, जीतो! यह अब कम से कम 4x तेज है। – hyperlogic

0

यदि आदेश वर्बोज़ है, तो क्या वास्तविक समय में पूर्ण आउटपुट को कैप्चर करने में कोई उपयोग है? हो सकता है कि आप पृष्ठभूमि में verbose-app > app.log चलाएं और फिर लॉग फ़ाइल की अंतिम कुछ पंक्तियों को देखने के लिए बफर को अद्यतन रखने के लिए emacs के भीतर while true; do tail -n50 app.log; sleep 1; done जैसे कुछ चलाएं। बाद में जब आप पूर्ण आउटपुट चाहते हैं तो आप emacs में लॉग फ़ाइल खोल सकते हैं।

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