[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: How to follow the end of *Messages* buffer in Emacs?

From: Yves Baumes
Subject: Re: How to follow the end of *Messages* buffer in Emacs?
Date: Sat, 10 Nov 2012 16:55:37 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.2 (darwin)

martin rudalics <> writes:

>> I am playing with Elisp, and I find convenient to have the *Messages*
>> buffer always open in a window in my frame.
>> I discovered recently that sometimes the buffer stops following the last
>> lines. If I want to see the last appended lines in this buffer, I need
>> to go in the buffer and jump to the end manually, with M->. Which is
>> quite annoying and disruptive.
> Can you please tell us when and how this happens.  Here, when I display
> *Messages* in a window, I always see the last line but maybe something
> about my setup is peculiar.

I've tried and I think I've been able to reproduce. Let's split the
frame in two windows only, one for the *scratch* and the other for
*Messages*. From here you have a few lines only in the *Messages*
buffer. And untill now, every new lines introduced because of a command
output is followed. Moreover, I can see the "ghost" cursor at the end of
the buffer and it follows every *Messages* buffer updates.

Then, from the *scratch* buffer, I call the describe-variable key
sequence ( C-h v xxx ). The current buffer being *scratch*, the
*Messages* buffer will be replaced with the *help* buffer.

After finishing to read the description I want to quit it, because I
want the *Messages* buffer to come back. For that, I do: C-x o, thus
switching to the focus to the *Help* buffer, and I just type in 'q' to
quit it and instantly focus back to the *scratch* buffer.

But: When I look into the *Messages* buffer, the "ghost" cursor is no
longer at the same place. It has moved in the middle of the buffer. From
there, the window position relative to the buffer remains the same.

(Hum.. I am being over-descriptive here, but I am trying to compensate
my low level in english)

>> I am trying to reproduce the "tail -f" command line, in a buffer. Of
>> course 'auto-revert-tail-mode complains that the *Messages* is not a
>> visited file... As a consequence, this mode does not want to work.
>> But it gave me the idea to add a function hook when the buffer is
>> modified. That function would jump to (point-max) each time that
>> buffer is modified.
>> Here is my own attempt, invoked from *Messages* buffer, with M-:
>> (add-hook
>>  'after-change-functions
>>  (lambda (s e l) (goto-char (point-max)))
>>  nil t)
>> But it does not work. The (point) remains in the same place while I see
>> the buffer is growing... The lambda function does not produce any error,
>> otherwise it would have been removed from the 'after-change-functions
>> hook and C-h k 'after-change-functions shows it is present.
> The (goto-char (point-max)) just sets `point' in that buffer.  It does
> not care whether the buffer is currently displayed in a window.  You
> have to use something like
>   (walk-windows
>    (lambda (w)
>      (when (eq (window-buffer w) (current-buffer))
>        (set-window-point w (point-max))))))

Ok, I suppose that, indeed, set-window-point is more appropriate.

I've been able to make the whole stuff work, thanks to the various
remarks. Since I was trying to automate the whole stuff I decided not to
go in the macro direction. Here is the code:

(defun tail-f-msgs ()
  "Go to the enf 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)

Of course with that the *Messages* buffer is no longer editable, or you
can browse it to see older lines. Next fix: make a variable to the
follow mode.

> within that function.
> martin

reply via email to

[Prev in Thread] Current Thread [Next in Thread]