web-dev-qa-db-ja.com

Emacs:ミュートメッセージ(「エコーエリア」)

私はEmacsで、手動を使用して知っているコマンドをスタックすることにより、多くの自動化を行っています。これは私がお勧めする方法です。通常のようにEmacsを使用すると、「ねえ、私はいつもこれらのコマンドを連続して使用しているのに、なぜそうしないのか」と頭に浮かぶことがあります。マージするだけですか?」名前またはショートカットでコマンドを知っているので、さらに簡単です。

ただし、1つの問題は、コマンドをスタックすると、「エコー領域」(ミニバッファーと同じ場所)で大量のメッセージが点滅することです。以下で行われているすべて(呼び出された関数)はユーザーに対して透過的である(すべきである)ため、これらのメッセージは意味がありません。

では、ミュートしてから、ミュート解除できますか?以下をご覧ください。

(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 ' answer に応答して編集

Emacsのヘルプシステムでは非常に一般的であるため、あなたが参照しているメモをよく知っています。

あなたのアドバイスは一般的に間違っていませんが、この特定の状況をより詳細に調べてみましょう:1).emacsにElisp関数があります。 2)関数を設定する人がよく知っているコマンドを使用するため、非常に読みやすく、保守しやすいです。 3)関数は意図したとおりに機能しますが、4)oneの欠点として、エコーが多すぎるという欠点があります。

さて、この状況では、まったく異なるコマンド、可能性のあるコマンド、または可能性のあるコマンドを使用して、その関数(および他の多くの関数)の完全な書き直しを本当に提案しますか?メッセージを減らすための可能な方法として存在しませんが、それが起こるかどうかさえわかりませんか?

Edit:例(動作します)、 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.") ))
5
Emanuel Berg

message-log-maxnilにバインドすると、(動的)バインドの間メッセージが抑制されます。

echo-keystrokes0にバインドすると、キーストロークのエコーが抑制されます。

Emacs 25.1以降、変数inhibit-messageを非nilにバインド(または設定)して、ほとんどのエコー領域メッセージを防ぐこともできます(ただし、これらのメッセージがバッファー*Messages*に記録されるのを防ぐことはできません)。

5
Drew

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、メッセージを抑制する方法はないとすぐに言います。

2
sds