* संदेश * बफर को प्रक्रिया उत्पादन भेजें, लेकिन गूंज क्षेत्र को बायपास करें


9

क्या किसी प्रोसेस-फ़िल्टर से *Messages*बफर में आउटपुट भेजना और उस मैसेज आउटपुट को इको एरिया में दिखाई देने से दबाना संभव है, जैसे कि मैं एक साथ minibuffer-promptचल रहे सबस्पेर फिल्टर आउटपुट द्वारा मिटाए बिना इंटरैक्टिव कमांड्स का उपयोग करने में सक्षम हूं ?

(defun rsync-process-filter (proc string)
  (when (not (or
      (string-match "files...\r" string)
      (string-match "files to consider\n" string)))
    (message "%s" string)))

EDIT (3 जनवरी, 2015): निम्नलिखित एक समान प्रश्न का लिंक है, हालांकि, मैं अभी तक इसे एक प्रक्रिया स्ट्रिंग के साथ काम करने में सक्षम नहीं हुआ हूं, जहां सटीक स्ट्रिंग अनकाउन्ट है - थ्रेड का शीर्षक है: Emacs - कुछ मिनीबफ़र संदेश अक्षम करें :

/superuser/669701/emacs-disable-some-minibuffer-messages


मुझे नहीं लगता कि आप कर सकते हैं। सिर्फ एक अलग बफर में प्रवेश क्यों नहीं? यही कारण है कि प्रक्रियाओं के साथ सौदा करने वाले सबसे अधिक तरीके हैं ...
lunaryorn

@lunaryorn - सुझाव के लिए धन्यवाद - समस्या को हल करने के लिए एक समर्पित बफर एक वैध विकल्प है। कुछ प्रक्रिया आउटपुट हैं जो मुझे *Messages*बफर में भेजे जाने के लिए एक व्यक्तिगत प्राथमिकता है - सिंक्रनाइज़ेशन संबंधित प्रोजेक्ट उनमें से एक है। अभी भी चीजों की एक जोड़ी मैंने कोशिश नहीं कर रहे हैं ( क्योंकि मैंने सोचा वहाँ हो सकता है एक अंतर्निहित समाधान ), इस तरह के बनाने के रूप में *Messages*बफर अस्थायी रूप से लिखने योग्य inhibit-read-onlyऔर का उपयोग कर insertपर point-max- अगर उस में दिखाई देगा मैं नहीं जानता साथ ही गूंज क्षेत्र। आज शाम को फिर से काम करूँगा। । ।
कानून व्यवस्था

रुचि का एक नोट यह है कि संदेश के लिए C फ़ंक्शन "इको" और "लॉगिंग" चिंताओं से बहुत अलग हैं, लेकिन यह अंतर elisp के संपर्क में नहीं है। शायद आप M-x report-emacs-bugइसे एक सुविधा के रूप में अनुरोध कर सकते हैं?
फिल्स

@ एफिल्स | @lunaryorn: मैं का उपयोग करके वांछित प्रभाव प्राप्त करने में सक्षम था (let ((inhibit-read-only t)) (with-current-buffer (get-buffer-create "*Messages*") (goto-char (point-max)) (insert string)))और मैंने एक मसौदा उत्तर पोस्ट किया, जो उपयोगकर्ता के स्वयं के प्रश्न पर अनिवार्य प्रतीक्षा अवधि के बाद स्वीकृति के लिए पात्र होगा। मैंने इसके साथ एक सुविधा अनुरोध दायर किया report-emacs-bug: debbugs.gnu.org/cgi/bugreport.cgi?bug=19495
17

लॉलिस्ट: मैं उस दृष्टिकोण का सुझाव नहीं देने जा रहा था क्योंकि आप डुप्लिकेट संदेशों को संभालने के लिए तर्क के पीछे भाग सकते हैं, लेकिन (यह भी ठीक हो सकता है; मुझे वास्तव में नहीं पता है।) आपको संभवतः (messages-buffer)बफर प्राप्त करने के लिए उपयोग करना चाहिए। , अगर आप इस विधि से चिपके रहते हैं, और ध्यान दें कि (point-max)हमेशा एक नई लाइन (जैसे उपयोग C-g) की शुरुआत नहीं होगी ।
फिल्स

जवाबों:


3

आप minibuffer-message-timeout0 पर सेट करके मिनीबफ़र में डिस्प्ले को दबा सकते हैं ।

उदाहरण के लिए, मैं कुछ स्थानों पर ऐसा उपयोग करता हूं जहां मैं 'मोड सक्षम' संदेश द्वारा बाधित किए बिना मिनीबर्फर प्रॉम्प्ट (जैसे इडो फाइंड-फाइल) में एक मामूली मोड को चालू करना चाहता हूं:

(let ((minibuffer-message-timeout 0))
    (toggle-some-mode))

सुझाव के लिए धन्यवाद; हालाँकि, इससे वांछित प्रभाव प्राप्त नहीं हुआ। (let ((minibuffer-message-timeout 0)) (message "%s" string))ईको-एरिया / मिनीबफ़र में अभी भी प्रदर्शित होने के साथ चल रही प्रक्रिया आउटपुट प्रिंटिंग जैसे execute-extended-commandया switch-to-buffer-other-window- यानी, प्रॉम्प्ट और सुझाए गए पूर्णताएं प्रक्रिया आउटपुट संदेशों द्वारा मिट जाती हैं।
कानून सूची

3

पहला रफ ड्राफ्ट (3 जनवरी, 2015): messages-bufferउपयुक्त बफर को खोजने या बनाने के लिए फ़ंक्शन का उपयोग करने के बारे में @phils की सहायक टिप्पणी के आधार पर संशोधित प्रारंभिक मसौदा (और इसे डाल दिया messages-buffer-mode); और, point-maxलाइन की शुरुआत में है या नहीं (यदि नहीं, तो संदेश स्ट्रिंग डालने से पहले एक नई लाइन को इनसेट करें) के लिए एक चेक जोड़ा ।

EDIT (4 जनवरी, 2015): ऐसी स्थितियाँ हैं जिनमें सम्मिलित स्ट्रिंग आवश्यक रूप से एक नई पंक्ति में समाप्त नहीं हो सकती है, और फ़ंक्शन के messageपास यह सुनिश्चित करने के लिए चेक नहीं है कि यह एक नई लाइन की शुरुआत में है, इसलिए हम इसका ध्यान रखते हैं इस समारोह में। इस प्रकार, किसी भी बिंदु पर जब messageएक नई लाइन सम्मिलित होती है, तो कहा जाता है कि लाइन बफर के फ्लश-बाएं से शुरू होगी।

(defun rsync-process-filter (proc string)
  (let ((inhibit-read-only t))
    (when (not (or
        (string-match "files...\r" string)
        (string-match "files to consider\n" string)))
      (with-current-buffer (messages-buffer)
        (goto-char (point-max))
        (when (not (bolp))
          (insert "\n"))
        (insert string)
        (when (not (bolp))
          (insert "\n"))))))

2

इसके डॉकस्ट्रिंग के माध्यम से जाने से messageऐसा लगता है कि आप अपनी इच्छित सामग्री के साथ nilकॉल करने के तुरंत बाद एक तर्क के साथ संदेश कॉल करके क्या प्राप्त करना चाहते हैं message। के docstring सेmessage

यदि पहला तर्क शून्य या रिक्त स्ट्रिंग है, तो फ़ंक्शन किसी भी मौजूदा संदेश को साफ़ करता है; यह मिनीबार सामग्री को दिखाने देता है।

इसलिए अपने फंक्शन को कुछ इस तरह से संशोधित करें कि निम्नलिखित कार्य करें

(defun rsync-process-filter (proc string)
  (when (not (or
      (string-match "files...\r" string)
      (string-match "files to consider\n" string)))
    (message "%s" string)
    (message nil)))

मैंने निम्न कार्य करके इसका परीक्षण किया

(defun test ()
  (message "%s" "Test")
  (message nil))

(run-at-time 5 5 #'test)

और यह काम करने लगता है


सुझाव के लिए धन्यवाद। यह विचार, जब *Messages*बफर के लिए एक रनिंग प्रोसेस आउटपुट के साथ परीक्षण किया जाता है और फिर इंटरएक्टिव कमांड को कॉल करता है execute-extended-command, तो निम्न दिखाता है: इंटरैक्टिव प्रॉम्प्ट (यानी, M-xऔर किसी भी आंशिक पूर्णता) और प्रक्रिया से आउटपुट - यानी, दो स्विच वापस और प्रकाश की गति से आगे, लेकिन दोनों के बीच झिलमिलाहट है। ऐसा प्रतीत होता है क्योंकि इस मुद्दे पर विशेष प्रक्रिया लगातार नए संदेशों को थूक रही है, और उस नए संदेश को प्रतिध्वनि क्षेत्र में एक सेकंड के एक अंश के लिए प्रदर्शित किया जा रहा है।
१५:१६
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.