ใน Emacs 25 และอาจเป็นรุ่นก่อนหน้าบางวิธีที่สะอาดที่สุดในการทำเช่นนี้คือ:
ก่อนกำหนด:
(defun suppress-messages (old-fun &rest args)
(cl-flet ((silence (&rest args1) (ignore)))
(advice-add 'message :around #'silence)
(unwind-protect
(apply old-fun args)
(advice-remove 'message #'silence))))
ถ้าคุณต้องการระงับข้อความทั้งหมดที่some-function
คุณทำ:
(advice-add 'some-function :around #'suppress-messages)
ตัวอย่างเช่นฉันระงับข้อความ "กระบวนการ Ispell ฆ่า" ผลิตโดยฟังก์ชั่นispell-kill-ispell
(ในispell.el.gz
) โดยการเขียน:
(advice-add 'ispell-kill-ispell :around #'suppress-messages)
หากคุณต้องการเปิดใช้งานข้อความอีกครั้งให้เรียกใช้:
(advice-remove 'some-function #'suppress-messages)
บางสิ่งที่ควรทราบ:
1) ข้อความทั้งหมดที่ผลิตโดยsome-function
จะถูกระงับเช่นเดียวกับข้อความทั้งหมดที่ผลิตโดยฟังก์ชั่นเสียงกระเพื่อมใด ๆ ที่ฟังก์ชั่นการโทร
2) ข้อความที่ผลิตโดยรหัส C จะไม่ถูกบีบอัด แต่นั่นอาจเป็นสิ่งที่ดีที่สุด
3) คุณต้องตรวจสอบให้แน่ใจว่า-*- lexical-binding: t -*-
มีอยู่ในบรรทัดแรกของ.el
ไฟล์ของคุณ
แต่คุณจะทราบได้message
อย่างไรว่าฟังก์ชันใดที่เรียกว่า คุณสามารถพิมพ์รหัสได้ตามที่คนอื่นแนะนำ แต่การปล่อยให้ Emac ทำงานให้คุณได้ง่ายขึ้น
หากคุณกำหนด:
(defun who-called-me? (old-fun format &rest args)
(let ((trace nil) (n 1) (frame nil))
(while (setf frame (backtrace-frame n))
(setf n (1+ n)
trace (cons (cadr frame) trace)) )
(apply old-fun (concat "<<%S>>\n" format) (cons trace args))))
แล้วทำ:
(advice-add 'message :around #'who-called-me?)
คุณจะได้รับ backtrace เพิ่มในข้อความ จากนี้คุณสามารถดูว่าข้อความถูกสร้างขึ้นที่ใด
คุณสามารถย้อนกลับได้ด้วย:
(advice-remove 'message #'who-called-me?)
อีกวิธีหนึ่งที่จะแนะนำmessage
ฟังก์ชั่นและทดสอบเพื่อดูว่าคุณต้องการพิมพ์ข้อความหรือไม่ นี่เป็นเรื่องง่ายถ้าข้อความที่เป็นปัญหานั้นเป็นสตริงคงที่ เช่นในการระงับ "กระบวนการ Ispell ถูกฆ่า" คุณสามารถกำหนด:
(defun suppress-ispell-message (old-fun format &rest args)
(if (string= format "Ispell process killed")
(ignore)
(apply old-fun format args)))
แล้วทำ:
(advice-add 'message :around #'suppress-ispell-message)
ในไม่ช้าแนวทางนี้จะยุ่งมากหากข้อความมีความซับซ้อน