0

可能重复:
在 emacs 中,我可以设置 *Messages* 缓冲区以使其拖尾吗?

我正在玩 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钩子中删除并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 回答