आप कर सकते हैं एक तरह से लिस्प कोड से यह करते हैं। क्यों "की तरह"? क्योंकि मेसेज एक प्रिमिटिव है, जो C लिस्ट में है, लिस्प फंक्शन के बजाय, और, Emacs लिस्प रेफरेंस मैनुअल के अनुसार , C कोड से प्रिमिटिव्स को कॉल करना सलाह को नजरअंदाज करता है।
इसलिए, वास्तव में आप जो कार्यक्षमता चाहते हैं, उसे लागू करने का एक उचित काम करने के लिए, आपको लिस्प फ़ंक्शन के रूप में मेसेज आदिम को फिर से परिभाषित करना होगा; एक बार जब आप ऐसा कर लेते हैं, तो आप इसे कोड के साथ सलाह दे सकते हैं जो स्ट्रिंग को प्राप्त करता है MESSAGE, मिनीबफ़र को गूँजता है, इसकी तुलना उन संदेशों की सूची से करता है जिन्हें आप देखना नहीं चाहते हैं, और फिर कॉल करें या निर्भरता के अनुसार कॉल न करें परिणाम पर। सिद्धांत रूप में, यह उदाहरण के लिए पूरा किया जा सकता है (defvar *message-prim* (symbol-function 'message))
, और फिर (defun message (format &rest args) ... (funcall *message-prim* format args))
- लेकिन प्रतीक ने एक आदिम तर्क दिया है जो वास्तव में कॉल करने योग्य नहीं है, इसलिए FUNCALL एक वीओआईडी-फंक्शन स्थिति का संकेत देता है।
हालाँकि, अगर वह काम करता है, तब भी यह वास्तव में चाल नहीं चलेगा, क्योंकि एक आदिम को पुनर्परिभाषित करना केवल इस बात की गारंटी देता है कि फ़ंक्शन को लिस्प कोड से कॉल करने पर पुनर्परिभाषित का उपयोग किया जाएगा; सी कोड में कॉल अभी भी आदिम परिभाषा का उपयोग कर सकते हैं । (सी कोड के लिए Emacs लिस्प में कॉल करना संभव है, और ऐसे मामलों में पुनर्वितरण दिखाई देगा; यह निश्चित रूप से, सी कोड के लिए सी कोड को कॉल करना संभव है, और ऐसे मामलों में मूल परिभाषा दिखाई देगी।)
मैं अस्पष्ट रूप से C कोड को पैच करने पर विचार कर रहा हूं और उचित संदेश दमन कार्यक्षमता प्रदान करने के लिए Emacs को फिर से जमा कर रहा हूं; मुझे वास्तव में उस कार्यक्षमता की आवश्यकता नहीं है, लेकिन यह एक दिलचस्प अभ्यास साबित हो सकता है, खासकर जब से मैं सी हैकर नहीं हूं। इस बीच, मैं यहाँ कुछ मार पड़ी है, जब एक फ़ाइल में गिरा दिया, अपनी एक init फ़ाइलों में शामिल है, और अपने स्वाद के लिए अनुकूलित, लिस्प कोड से होने वाले संदेशों को दबा देगा जो वास्तव में दमन के लिए आपके द्वारा सूचीबद्ध तार से मेल खाते हैं। जब तक दमन सक्षम होता है, तब तक ये संदेश मिनीबफ़र में दिखाई नहीं देंगे; आपके पास विकल्प है कि उन्हें *Messages*
बफर से भी दबाएं।
;; message-suppression.el
;; a quick hack by Aaron (me@aaron-miller.me), 2013-11-12
;; half a solution for http://superuser.com/questions/669701/emacs-disable-some-minibuffer-messages
;; NB this does nothing until you
;; M-x customize-group RET message-suppression RET
;; and adjust to taste
(defgroup message-suppression nil
"Customization options for selective message suppression."
:prefix "message-suppression")
(defcustom message-suppression-enabled nil
"Whether or not to suppress messages listed in
`message-suppress-these'."
:group 'message-suppression
:tag "Suppress some messages?"
:type '(choice (const :tag "No" nil)
(const :tag "Yes" t)))
(defcustom message-suppression-to-messages-buffer t
"Whether or not to insert messages suppressed from the
minibuffer into the *Messages* buffer."
:group 'message-suppression
:tag "Insert suppressed messages into *Messages* buffer?"
:type '(choice (const :tag "No" nil)
(const :tag "Yes" t)))
(defcustom message-suppression-these nil
"A list of messages which the `message-except-these' advice
should suppress from being echoed in the minibuffer. Messages
are matched by `member', i.e., only exact strings match.
NB! Per the Emacs manual, calls from C code to primitives (such
as `message') ignore advice entirely, which means some messages
cannot be suppressed by this mechanism. ('Advising
Functions' in the Emacs Lisp Reference Manual, q.v.)"
:group 'message-suppression
:tag "Messages to suppress"
:type '(repeat (string))
:link '(info-link "(elisp)Advising Functions"))
(defadvice message (around message-suppress-advice)
"Suppress messages listed in `message-suppress-these' from being
echoed in the minibuffer."
(let ((message-string nil)
(current-buffer nil))
(if (and message-suppression-enabled
(length (ad-get-args 0))
(stringp (car (ad-get-args 0)))
;; message-string doesn't get set until here because `format'
;; will complain if its first argument isn't a string
(setq message-string (apply 'format (ad-get-args 0)))
(member message-string
message-suppression-these))
;; we won't call `message', but we might echo to *Messages*
(and message-suppression-to-messages-buffer
(progn
(setq current-buffer (current-buffer))
(switch-to-buffer (get-buffer-create "*Messages*"))
(goto-char (point-max))
(insert (make-string 1 10))
(insert message-string)
(switch-to-buffer current-buffer)))
ad-do-it)))
(ad-activate 'message)
मैंने इसे उन संदेशों के साथ काम करने के लिए परीक्षण किया है, जो वास्तव में लिस्प कोड से उत्पन्न होते हैं, उदाहरण के लिए "आप एक फ़ंक्शन निर्दिष्ट नहीं करते" शिकायत DESCRIBE-FUNCTION द्वारा गूँजती है जब आप इसे एक खाली स्ट्रिंग तर्क देते हैं। दुर्भाग्य से, आप जिन संदेशों को दबाने की इच्छा रखते हैं, जैसे "बफर की शुरुआत", "बफर का अंत", और "टेक्स्ट रीड-ओनली", सी कोड से उत्पन्न होने के लिए सभी प्रकट होते हैं, जिसका अर्थ है कि आप सक्षम नहीं होंगे इस विधि से उन्हें दबाएं।
अगर मैं कभी भी स्रोत पैच के आसपास पहुँचता हूँ, तो यह (शायद) Emacs 24.3 के विरुद्ध होगा, और मैं इस उत्तर को जानकारी के साथ अपडेट करूँगा कि इसका उपयोग कैसे किया जाए।