जब एक अवर प्रक्रिया लंबी लाइनें उत्पन्न करती है तो धीमी गति से बचाव कैसे करें?


14

मैं कुछ स्कीम कोड पर हैक करने के लिए Geiser के साथ Emacs का उपयोग करता हूं। जैसा कि मैं REPL में चारों ओर खेल रहा हूं मैं कभी-कभी उन भावों का मूल्यांकन करता हूं जिनके परिणामस्वरूप बहुत सारे आउटपुट होते हैं, अक्सर सभी एक पंक्ति में।

उदाहरण के लिए, मैंने सिर्फ SRFI-41 (स्ट्रीम) के साथ खेला और एक बड़ी फाइल से कैरेक्टर स्ट्रीम बनाया; फिर मैंने स्ट्रीम को मजबूर कर दिया और गेसर ने फाइल की पूरी सामग्री को मेरे बफर में कैरेक्टर स्ट्रीम के रूप में रोक दिया। लगभग तुरंत, Emacs अधिक से अधिक वर्णों को एक पड़ाव में ले जाता है जहां आउटपुट लाइन में जोड़ा जाता है, और कोई फर्क नहीं पड़ता कि मैं कितनी देर तक दबाए रखता था C-gया C-c C-cमैं Emacs (या Geiser) को रोक नहीं सकता था।

इसने मेरे पूरे Emacs सत्र को तोड़ दिया क्योंकि Emacs अब मेरे इनपुट को पूरी तरह से अनदेखा कर रहा है, यह सोचकर कि इस विशाल चरित्र स्ट्रीम को एक पंक्ति में सभी को गैर-जिम्मेदार Geiser REPL बफर में प्रिंट करने के लिए प्राथमिकता देने की आवश्यकता है।

क्या कुछ है जो मैं अपने Emacs सत्र को अपनी विनाशकारी जिज्ञासा से बचाने के लिए कर सकता हूं? ( वैसे भी बहुत लंबी लाइनें प्रदर्शित करने पर Emacs इतना धीमा क्यों हो जाता है ?) क्या मैं लंबी लाइनों के लिए एक सीमा निर्धारित कर सकता हूं और Emacs को बता सकता हूं कि बस बहुत लंबी लाइनों को प्रदर्शित करने का प्रयास नहीं करना ठीक है?



2
खैर, मेरा सवाल प्रति लंबी लंबी लाइनों को प्रदर्शित करने के बारे में नहीं है; मैं जानना चाहता हूं कि मैं इस तरह की चीज से कैसे बच सकता हूं (Emacs एक हीन प्रक्रिया से पंक्ति पढ़ता है, यह उस फाइल से नहीं पढ़ा जाता है जिसे मैं ठीक कर सकता था); और यह इस बारे में है कि मैं अपने Emacs सत्र को Emacs के समर्पण को एक एकल डायनेमिक बफर में खोने से कैसे रोक सकता हूं।
21

"ठीक है, मेरा सवाल लंबी लाइनों को प्रदर्शित करने के बारे में नहीं है" तो शायद आपको अपना शीर्षक बदलना चाहिए। शायद आप एक निश्चित मात्रा में वर्णों के बाद अवर प्रक्रिया आउटपुट को फ़िल्टर करना और नई पंक्ति जोड़ना चाहते हैं?
नानी

वास्तव में, यह लंबी लाइनों के साथ बहुत कम है। yesएक में ansi-termउदाहरण के लिए एक समान (लेकिन नहीं है कि भयानक) प्रभाव। वास्तव में यह सिर्फ टेक्स्ट का वॉल्यूम है जो इमैक पॉज़ देता है।
पायथनटन

एक बफर में पाठ सम्मिलन बहुत तेज है, यह रीडिसप्ले ऑपरेशन है जो इसे वास्तव में है की तुलना में धीमा दिखाई देता है। ईमानदार होने के लिए, yesएक VTE टर्मिनल एमुलेटर में चलने से मेरे सभी सीपीयू कोर निकल जाते हैं, इसलिए मैं इसका उपयोग उदाहरण के तौर पर नहीं करूंगा।
वामासा

जवाबों:


12

जैसा कि पहले ही टिप्पणियों में उत्तर दिया गया है, लंबी रेखाओं के लिए रेडिसप्ले में बहुत धीमी गति से बनने वाले एमएसीएस एक प्रसिद्ध मुद्दा है । इसे ठीक करना बहुत अच्छा होगा, लेकिन सही तरीके से खींचे जाने के लिए बहुत सारे विचारों की आवश्यकता होती है। मुझे इस बात का अंदाजा है कि इस दस्तावेज़ के खंड 6.3 के आधार पर इसे कैसे पूरा किया जा सकता है (मूल रूप से, वर्तमान बफर में विज़ुअल लाइन की जानकारी संग्रहीत करें और इसे व्हॉट्सएप, प्रदर्शन गुण, विंडो परिवर्तन आदि के सम्मिलन पर अपडेट करें, फिर उस जानकारी का उपयोग करें) redisplay कोड हर समय इसके लिए स्कैनिंग से बचने के लिए), लेकिन सी इंटर्नल्स के साथ इसे खींचने के लिए पर्याप्त परिचित नहीं है।

हालांकि वर्कअराउंड हैं। सबसे अधिक स्पष्ट प्रदर्शन-संबंधी मापदंडों को ट्यूनिंग करना होगा (जैसे, चित्रमय Emacs उदाहरण में विज़ुअल लाइन ट्रंकेशन को सक्षम करना, गैर-ग्राफ़िकल Emacs का उपयोग करना जो स्वचालित रूप से किया गया है, बीड़ी सुविधाओं को अक्षम करना, आदि) और फ़ाइल सामग्री को पूर्व-निर्धारित करना ' फिर से पढ़ना। एक कम स्पष्ट रूप से फ़ाइलों को स्वचालित रूप से पोस्ट-प्रोसेसिंग किया जाता है, यह वास्तव में उनकी पंक्तियों को छोटा करने या पाठ गुणों को जोड़ने से हो सकता है जो लाइनों को वास्तव में की तुलना में कम दिखाई देते हैं। इसे और अधिक दिलचस्प जवाब में बदलने के लिए, मैं पूर्व विकल्प का एक बहुत ही बदसूरत हैक पेश करूंगा जो केवल- comintमोड वाले मोड के लिए काम करेगा :

(defun my-comint-shorten-long-lines (text)
  (let* ((regexp "^\\(.\\{80\\}\\).*?$")
         (shortened-text (replace-regexp-in-string regexp "\\1" text)))
    (if (string= shortened-text text)
        text
      (propertize shortened-text 'help-echo text))))

(add-hook 'comint-preoutput-filter-functions 'my-comint-shorten-long-lines)

यह परिभाषित करता है my-comint-shorten-long-lines, एक फ़ंक्शन जो संभवतः एक स्ट्रिंग लेता है जिसमें कई लाइनें शामिल होती हैं और 80 रेखाओं की लंबाई के साथ या उससे अधिक छोटे संस्करण के साथ नियमित रूप से अभिव्यक्ति की शक्ति का उपयोग करता है जो मूल पाठ को प्रदर्शित करता है जब इसके ऊपर मंडराता है। जब comint-preoutput-filter-functionsइसे हुक के रूप में उपयोग किया जाता है तो comintयह प्रदर्शित होने से पहले सभी आउटपुट को फ़िल्टर कर देगा ।

हालांकि, हैक के इस प्रतिपादन में काफी गंभीर कमजोरी है। उन मोड्स में, जिनमें बुनियादी फॉन्टिफिकेशन चल रहा है (जैसे M-x ielm), यह उन लाइनों को ख़ुशी से काट देगा जो एक स्ट्रिंग का हिस्सा हैं और इस तरह से सब कुछ फॉन्ट करेंगी जब तक कि अगली बोली स्ट्रिंग के रूप में न हो जाए! यह वह नहीं है जो हम चाहते हैं और थोड़ा और रेगेक्स महारत के साथ तय किया जा सकता है (लेकिन संभवतः पायथन जैसी भाषा के लिए एक आरईपीएल के अंदर टूट जाएगा)। जब हम इस पर होते हैं, तो आइए संक्षिप्त आउटपुट को उजागर करें:

(defun my-comint-shorten-long-lines (text)
  (let* ((regexp "^\\(.\\{80\\}\\).*?\\(\"?\\)$")
         (shortened-text (replace-regexp-in-string regexp "\\1\\2" text)))
    (if (string= shortened-text text)
        text
      (propertize shortened-text 'font-lock-face 'shadow 'help-echo text))))

(add-hook 'comint-preoutput-filter-functions 'my-comint-shorten-long-lines)

यह थोड़ा बेहतर है, लेकिन फिर भी बदसूरत है। की तरह कुछ के उत्पादन पर मँडरा find /में M-x shellअपील नहीं कर रहा है (हम आदर्श केवल unshortened लाइन, सभी उत्पादन प्रदर्शित करना चाहते हैं चाहते हैं), स्ट्रिंग का पता लगाने सबसे अच्छे रूप में अल्पविकसित है और काट-छांट के बजाय सब कुछ fontifying के अनेक बिंदुओं के साथ बेहतर संकेत दिया जा सकता है। उसके ऊपर, यह भी गारंटी नहीं है कि आने वाला पाठ बैचों में बदल नहीं गया है। यह सब एक अस्थायी बफर में प्रसंस्करण कदम करने के लिए चिल्लाता है, लेकिन पाठक को व्यायाम (या संभावित ब्लॉग लेखक के रूप में) के लिए छोड़ दिया जाएगा।


4

जैसा कि इस वैसे ही अजगर के साथ हुआ, अजगर-mode.el, पर समाधान https://launchpad.net/python-mode , सीधे कार्रवाई करने के लिए कनेक्ट करने के लिए comint-मोड के माध्यम से नहीं है।

पर निर्भर करता है start-processऔर प्रक्रिया-भेज-स्ट्रिंग

उदाहरण के लिए फ़ंक्शन py--start-fast-processऔर देखेंpy--fast-send-string-intern

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.