エコーエリアに表示されるほぼすべてのメッセージは、ユーザーが後で参照できるよう、*Messages*
バッファにも記録されます。これには message
で出力されるすべてのメッセージが含まれます。デフォルトでは、このバッファは読み取り専用であり、メジャーモード messages-buffer-mode が使用されます。ユーザーが *Messages*
バッファを破棄することを妨げるものは何もありませんが、次にメッセージが表示される際に再作成されます。*Messages* バッファに直接アクセスする必要があり、かつその存在を確実にしたい Lisp コードは、関数
messages-buffer を使用する必要があります。
この関数は*Messages*バッファを返します。存在しない場合はバッファを作成し、messages-buffer-modeに切り替えます。
この変数は、*Messages* バッファに保持する行数を指定します。値 t は、保持する行数に制限がないことを意味します。値 nil
は、メッセージのログ記録を完全に無効にします。メッセージを表示しつつ、ログに記録されないようにする方法は以下の通りです。
(let (message-log-max) (message ...))
この変数は、メッセージをログ出力するバッファの名前を指定するもので、デフォルトは *Messages*
です。パッケージによっては、出力を一時的に別のバッファにリダイレクトすること(後でバッファの内容をログファイルに書き出すためなど)が有用な場合があり、その場合はこの変数を別のバッファ名にバインドできます。(なお、このバッファは(まだ存在しない場合は)作成され、messages-buffer-mode に格納されます。)
*Messages* をユーザーにとってより使いやすくするため、ロギング機能では連続する同一メッセージを統合します。また、「質問に続く回答」および「一連の進捗メッセージ」という2つのケースにおいて、関連する連続メッセージも統合します。
質問とそれに続く回答は、y-or-n-p
によって生成されるものと同様に、2つのメッセージを持ちます。1つ目は ‘question’、2つ目は ‘question...answer’
です。1つ目のメッセージは、2つ目のメッセージに含まれる内容以上の追加情報を伝えないため、2つ目のメッセージをログに記録すると、1つ目のメッセージはログから除外されます。
一連の進捗メッセージには、make-progress-reporter
によって生成されるようなメッセージが連続して含まれます。これらは ‘base...how-far’
という形式をとり、base は毎回同一で、how-far
は変動します。一連の各メッセージをログに記録すると、それらが連続している限り、直前のメッセージは破棄されます。
メッセージログの組み合わせ機能を有効にするために、関数 make-progress-reporter
と y-or-n-p が特別な処理を行う必要はありません。‘...’
で終わる共通のプレフィックスを持つ2つの連続したメッセージがログに記録されるたびに、この機能が動作します。