如何在Emacs中跟踪* Messages *缓冲区的结尾?

时间:2012-11-09 21:47:24

标签: emacs elisp

  

可能重复:
  In emacs, can I set up the *Messages* buffer so that it tails?

我正在玩Elisp,我觉得在我框架的窗口中总是打开 * Messages * 缓冲区很方便。

我最近发现有时缓冲区会停在文件的最后一行之后。如果我想查看此缓冲区中的最后一行,我需要进入缓冲区并使用 M-> 手动跳转到结尾。这非常令人讨厌和破坏性。

我正在尝试重现" tail -f"命令行,在缓冲区中。当然'auto-revert-tail-mode抱怨 * Messages * 不是访问过的文件...因此,此模式不希望工作。但是它让我想到在修改缓冲区时添加一个函数钩子。每次修改缓冲区时,该函数都会跳转到(point-max)

这是我自己的尝试,从 * Messages * 缓冲区调用, M - :
(add-hook 'after-change-functions (lambda (s e l) (goto-char (point-max)) nil) nil t)

但它不起作用。当我看到缓冲区正在增长时,(point)仍然在同一个地方...... lambda函数不会产生任何错误,否则它将从'after-change-functions钩子和 Ch k中删除 'after-change-functions表明它存在。

有更好的建议吗?

2 个答案:

答案 0 :(得分: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中的点位于缓冲区的末尾。

答案 1 :(得分: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)