Emacs:静音消息(“回显区域”)

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)缺点是它回显了太多消息。

现在,在这种情况下,你真的会建议一个完全重写该功能(以及许多其他功能)的功能,使用完全不同的命令,可能存在也可能不存在的命令,作为减少消息的可能方法,我们甚至不知道会发生这种情况?

编辑:一个例子(有效),在我得到帮助之后德鲁

(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.") ))

答案1

绑定到会在(动态)绑定期间抑制消息message-log-maxnil

绑定echo-keystrokes0抑制击键回声。

从 Emacs 25.1 开始,您还可以将变量绑定(或设置)inhibit-message为 non- nil,以阻止大多数回显区域消息(但不阻止这些消息记录在 buffer 中*Messages*)。

答案2

我在 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 代码时,最好使用原语而不是交互式命令,这也应该减少您关心的消息流。

编辑:

更重要的是,这将使您的功能更加强大 - 它们将更少地依赖于各种设置,并且当您决定尝试新的用户选项时它们不太可能突然中断。

我知道这不是你要问的,我立即说,在我看来,没有办法压制这些信息。

相关内容