Anda dapat semacam melakukan ini dari kode Lisp. Kenapa "semacam"? Karena MESSAGE adalah primitif, didefinisikan dalam C, alih-alih fungsi Lisp, dan, sesuai manual referensi Emacs Lisp , panggilan ke primitif dari kode C mengabaikan saran.
Oleh karena itu, untuk benar-benar melakukan pekerjaan yang tepat dalam mengimplementasikan fungsionalitas yang Anda inginkan, Anda perlu mendefinisikan kembali primitif MESSAGE sebagai fungsi Lisp; setelah Anda selesai melakukannya, Anda kemudian dapat menyarankannya dengan kode yang memperoleh string MESSAGE akan bergema ke minibuffer, membandingkannya dengan daftar pesan yang tidak ingin Anda lihat, dan kemudian menelepon atau tidak memanggil MESSAGE tergantung pada hasilnya. Secara teori, ini bisa dicapai dengan misalnya (defvar *message-prim* (symbol-function 'message))
, dan kemudian (defun message (format &rest args) ... (funcall *message-prim* format args))
- tetapi SIMBOL-FUNGSI memberikan argumen primitif mengembalikan sesuatu yang sebenarnya tidak bisa dipanggil, sehingga FUNCALL memberi sinyal kondisi VOID-FUNGSI.
Namun, bahkan jika itu berhasil, itu masih tidak benar-benar melakukan trik, karena mendefinisikan ulang primitif hanya menjamin bahwa redefinisi akan digunakan ketika fungsi dipanggil dari kode Lisp; panggilan dalam kode C masih dapat menggunakan definisi primitif . (Kode C memungkinkan untuk memanggil Emacs Lisp, dan kasus-kasus seperti itu akan melihat redefinisi; tentu saja kode C juga dapat memanggil kode C, dan kasus-kasus seperti itu akan melihat definisi asli.)
Saya agak merenungkan menambal kode C dan mengkompilasi ulang Emacs untuk menyediakan fungsionalitas penindasan pesan yang tepat; Saya tidak benar-benar membutuhkan fungsionalitas itu, tetapi mungkin membuktikan latihan yang menarik, terutama karena saya bukan seorang hacker C. Sementara itu, inilah sesuatu yang saya siapkan, yang ketika dimasukkan ke dalam file, termasuk dari salah satu file init Anda, dan disesuaikan dengan selera Anda, akan menekan pesan yang berasal dari kode Lisp yang persis sama dengan string yang Anda cantumkan untuk penindasan. Selama penindasan diaktifkan, pesan-pesan ini tidak akan pernah muncul di minibuffer; Anda memiliki opsi apakah akan menekan mereka dari *Messages*
buffer juga.
;; 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)
Saya telah menguji ini untuk bekerja dengan pesan yang sebenarnya dihasilkan dari kode Lisp, misalnya keluhan "Anda tidak menentukan fungsi" yang digaungkan oleh DESCRIBE-FUNCTION saat Anda memberikan argumen string kosong. Sayangnya, pesan yang Anda sebut ingin ditekan, seperti "Awal buffer", "End buffer", dan "Teks hanya baca", tampaknya semua berasal dari kode C, yang berarti Anda tidak akan dapat menekan mereka dengan metode ini.
Jika saya pernah berkeliling ke patch sumber, itu (mungkin) akan menentang Emacs 24.3 , dan saya akan memperbarui jawaban ini dengan informasi tentang bagaimana cara menggunakannya.