Emacs:靜音消息(“迴聲區”)
我在 Emacs 中做了很多自動化操作,方法是堆疊我從手動使用中知道的命令。這是我推薦的一種方法,因為它不需要太多努力:你像往常一樣使用 Emacs,但有時它會突然出現在你的腦海中,“嘿,我總是連續使用這些命令,為什麼不”我只是合併它們?” 由於您通過名稱或快捷方式知道命令,因此更加簡單。
但是,一個問題是,當您堆疊命令時,您會在“回顯區域”(與迷你緩衝區相同的位置)中獲得大量消息。這些消息沒有任何意義,因為下面發生的一切(呼叫的函式)對使用者來說(應該)是透明的。
那麼,您可以先靜音,然後再取消靜音嗎?看看下面:
(defun invisible-pretty-mail () "Automatize `pretty-mail'." (interactive) ; (mute-echo-area) (rmail-edit-current-message) (pretty-mail) ; lots of replace-string, replace-regexp, etc. here ; that will flood messages (rmail-cease-edit) ; (unmute-echo-area) )
編輯以響應 sds 的回答:
我非常了解您提到的那些註釋,因為它們在 Emacs 幫助系統中非常常見。
雖然您的建議一般來說並沒有錯,但讓我們更詳細地研究一下這種特殊情況:1). 中有一個 Elisp 函式
.emacs
。2)它使用了設置該功能的人非常熟悉的命令,因此可讀性和可維護性非常好。3) 該功能完全按預期工作,4)一個缺點是它回顯了太多消息。現在,在這種情況下,您是否真的建議完全重寫該功能(以及許多其他功能),使用完全不同的命令,可能存在或可能不存在的命令,作為減少消息的可能方式,我們甚至不知道會發生嗎?
編輯:一個例子(有效),在我從Drew得到幫助之後。
(defun test-suppress-msgs () (interactive) (let ((log-size message-log-max)) (setq message-log-max nil) (message "This message is suppressed.") (setq message-log-max log-size) (message "This is echoed, and logged.") ))
綁定
message-log-max
到nil
在(動態)綁定期間抑制消息。綁定
echo-keystrokes
到0
抑制擊鍵的迴聲。從 Emacs 25.1 開始,您還可以將變數綁定(或設置)
inhibit-message
為 non-nil
,以防止大多數 echo-area 消息(但不阻止這些消息被記錄到 buffer*Messages*
)。
我在 Emacs 原始碼中看不到任何可以做你想做的事。
請注意,您的方法“我手動使用的堆疊命令”不一定是 TRT。相當多的 Emacs 命令作為 lisp 程式碼的一部分已被棄用,例如,
C-x b runs the command switch-to-buffer ... WARNING: This is NOT the way to work on another buffer temporarily within a Lisp program!
和
previous-line is an interactive compiled Lisp function in `simple.el'. ... It is bound to C-p, <up>. ... If you are thinking of using this in a Lisp program, consider using `forward-line' with a negative argument instead. It is usually easier to use and more reliable (no dependence on goal column, etc.).
即,在編寫 Lisp 程式碼時,最好使用原語而不是互動式命令,這也應該減少您關心的消息流。
編輯:
更重要的是,這將使您的功能更加健壯——它們將更少地依賴於各種設置,並且當您決定嘗試新的使用者選項時,它們不太可能突然中斷。
我知道這不是你要問的,我馬上說,IMO,沒有辦法壓制這些消息。