Bạn có thể sắp xếp làm điều này từ mã Lisp. Tại sao "sắp xếp"? Bởi vì MESSAGE là một nguyên thủy, được định nghĩa trong C, thay vì hàm Lisp và, theo hướng dẫn tham khảo Emacs Lisp , gọi đến các nguyên thủy từ mã C bỏ qua lời khuyên.
Do đó, để thực sự thực hiện đúng công việc thực hiện chức năng mà bạn mong muốn, bạn cần xác định lại nguyên hàm MESSAGE dưới dạng hàm Lisp; Sau khi thực hiện xong, bạn có thể tư vấn cho nó bằng mã nhận được chuỗi MESSAGE sẽ lặp lại với bộ thu nhỏ, so sánh nó với một danh sách các tin nhắn bạn không muốn xem, sau đó gọi hoặc không gọi MESSAGE tùy thuộc về kết quả. Về lý thuyết, điều này có thể được thực hiện bằng ví dụ (defvar *message-prim* (symbol-function 'message))
, và sau đó (defun message (format &rest args) ... (funcall *message-prim* format args))
- nhưng SYMBOL-FUNCTION đưa ra một đối số nguyên thủy trả về một cái gì đó không thực sự có thể gọi được, do đó FUNCALL báo hiệu điều kiện VOID-FUNCTION.
Tuy nhiên, ngay cả khi điều đó có hiệu quả, nó vẫn không thực sự tạo ra mánh khóe, bởi vì việc xác định lại một nguyên thủy chỉ đảm bảo rằng định nghĩa lại sẽ được sử dụng khi hàm được gọi từ mã Lisp; các cuộc gọi trong mã C vẫn có thể sử dụng định nghĩa nguyên thủy . (Mã C có thể gọi vào Emacs Lisp và các trường hợp như vậy sẽ thấy định nghĩa lại, tất nhiên, mã C cũng có thể gọi mã C và các trường hợp như vậy sẽ thấy định nghĩa ban đầu.)
Tôi đang mơ hồ vá lỗi mã C và biên dịch lại Emacs để cung cấp chức năng triệt tiêu thông điệp phù hợp; Tôi không thực sự cần chức năng đó, nhưng nó có thể chứng minh một bài tập thú vị, đặc biệt vì tôi không phải là hacker C. Trong khi đó, đây là thứ tôi đã đánh cắp, khi được thả vào một tệp, được bao gồm từ một trong các tệp init của bạn và được tùy chỉnh theo sở thích của bạn, sẽ loại bỏ các tin nhắn có nguồn gốc từ mã Lisp khớp chính xác với chuỗi bạn liệt kê để loại bỏ. Chừng nào việc kích hoạt được kích hoạt, những thông báo này sẽ không bao giờ xuất hiện trong xe buýt nhỏ; bạn có tùy chọn xem có nên loại bỏ chúng khỏi *Messages*
bộ đệm hay không.
;; 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)
Tôi đã thử nghiệm tính năng này để hoạt động với các thông báo thực sự được tạo từ mã Lisp, ví dụ: "Bạn không chỉ định hàm" được lặp lại bởi MÔ TẢ CHỨC NĂNG khi bạn đưa ra một đối số chuỗi trống. Thật không may, các thông báo bạn đề cập muốn loại bỏ, chẳng hạn như "Bắt đầu bộ đệm", "Kết thúc bộ đệm" và "Văn bản chỉ đọc", xuất hiện tất cả để bắt nguồn từ mã C, có nghĩa là bạn sẽ không thể triệt tiêu chúng bằng phương pháp này.
Nếu tôi từng tìm hiểu về bản vá nguồn, nó sẽ (có thể) chống lại Emacs 24.3 và tôi sẽ cập nhật câu trả lời này với thông tin về cách sử dụng nó.