可能重复:
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
表明它存在。
有更好的建议吗?
答案 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)