0

重複の可能性:
emacsで、*メッセージ*バッファを調整できるように設定できますか?

私はElispで遊んでいますが、フレーム内のウィンドウで*メッセージ*バッファーを常に開いておくと便利です。

最近、ファイルの最後の行の後にバッファが停止することがあることを発見しました。このバッファの最後に追加された行を表示したい場合は、バッファに移動し、を使用して手動で最後にジャンプする必要がありM->ます。これは非常に迷惑で破壊的です。

「tail-f」コマンドラインをバッファに再現しようとしています。もちろん、 *メッセージ*'auto-revert-tail-modeはアクセスされたファイルではないと文句を言います...結果として、このモードは機能したくありません。しかし、バッファが変更されたときに関数フックを追加するというアイデアが得られました。その関数は、そのバッファーが変更されるたびにジャンプします。(point-max)

これは、 *メッセージ*バッファから呼び出された私自身の試みM-:です。
(add-hook 'after-change-functions (lambda (s e l) (goto-char (point-max)) nil) nil t)

しかし、それは機能しません。バッファが大きくなっているの(point)を確認している間、同じ場所に残ります...ラムダ関数はエラーを生成しません。そうでない場合は、'after-change-functionsフックから削除され、C-h k 'after-change-functions存在することを示します。

より良い提案はありますか?

4

2 に答える 2

3

とにかくポイント位置を変更するafter-change-functionsことは、バッファへの編集のいくつかのタイプを壊す可能性があるため、非常に危険です(たとえば、Emacsは同じコンテンツを持つ複数の連続したメッセージを圧縮します)。ただし、目的にpost-command-hookはこれで十分であり、はるかに安全であるため、次のように使用できます。

(add-hook 'post-command-hook
          (lambda ()
            (let ((messages (get-buffer "*Messages*")))
              (unless (eq (current-buffer) messages)
                (with-current-buffer messages
                  (goto-char (point-max)))))))

現在バッファ自体を編集している場合を除き、フックは*Messages*すべてのコマンドの後にポイントインがバッファの最後にあることを確認します。*Messages

于 2012-11-10T08:32:48.720 に答える
2

さて、私はで自分のものを作りましたset-window-point

(defun tail-f-msgs ()
  "Go to the end of Messages buffer."
  (let ((msg-window (get-buffer-window "*Messages*")))
    (if msg-window
        (with-current-buffer (window-buffer msg-window)
          (set-window-point msg-window (point-max))))))

;; Make the Messages buffer stick to the end.
(add-hook 'post-command-hook 'tail-f-msgs)
于 2012-11-10T16:15:58.060 に答える