emacs-devel
[Top][All Lists]
Advanced

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

Re: Suggestion for autorevert.el


From: Luc Teirlinck
Subject: Re: Suggestion for autorevert.el
Date: Thu, 1 Apr 2004 22:09:31 -0600 (CST)

Adapting auto-revert for tailing turned out to be somewhat more
complex than may have seemed at first.  Indeed, when tailing a file in
a window, I definitely do not want to keep that window permanently
selected for tailing to work correctly.  But then just worrying about
the buffer value of point is not good enough, we have to worry about
the _window_ values of point.

The added code, which calls the non-primitive and non-optimized
`get-buffer-window-list' and does some consing, only gets called when
one needs to revert a _file buffer_.  In my usage, this happens very
infrequently.  If a huge amount of files are continuously reverting,
then maybe there could be a problem.

One could leave the patch as is, or make it dependent on a user option
`auto-revert-tail', as Eric originally suggested.  If the latter, one
could make the default value `t', since I believe that a huge amount
of continuously reverting files would be an extremely rare occurrence.
But the option would allow people to (maybe temporarily) disable the
feature if excessive CPU usage or consing became a problem.

As a side remark: is there ever any reason to use (buffer-file-name)
instead of just buffer-file-name?  I used the latter, which produces
stylistic inconsistency with prior code in autorevert.el.  If there
are no objections, I would change the prior code.  (The patch below
does not yet do that.)

===File ~/autorevert-tail-diff==============================
*** autorevert.el       31 Mar 2004 10:03:44 -0600      1.28
--- autorevert.el       01 Apr 2004 21:27:48 -0600      
***************
*** 44,49 ****
--- 44,60 ----
  ;; seconds.  The check is aborted whenever the user actually uses
  ;; Emacs.  You should never even notice that this package is active
  ;; (except that your buffers will be reverted, of course).
+ ;;
+ ;; After reverting a file buffer, Auto Revert Mode normally puts point
+ ;; at the same position that a regular manual revert would.  However,
+ ;; there is one exception to this rule.  If point is at the end of the
+ ;; buffer before reverting, it stays at the end.  Similarly if point
+ ;; is displayed at the end of a file buffer in any window, it will stay
+ ;; at the end of the buffer in that window, even if the window is not
+ ;; selected.  This way, you can use Auto Revert Mode to `tail' a file.
+ ;; Just put point at the end of the buffer and it will stay there.
+ ;; These rules apply to file buffers. For non-file buffers, the
+ ;; behavior may be mode dependent.
  
  ;; Usage:
  ;;
***************
*** 298,306 ****
    "Revert current buffer, if appropriate.
  This is an internal function used by Auto-Revert Mode."
    (unless (buffer-modified-p)
!     (let (revert)
!       (or (and (buffer-file-name)
!              (file-readable-p (buffer-file-name))
               (not (verify-visited-file-modtime (current-buffer)))
               (setq revert t))
          (and (or auto-revert-mode global-auto-revert-non-file-buffers)
--- 309,317 ----
    "Revert current buffer, if appropriate.
  This is an internal function used by Auto-Revert Mode."
    (unless (buffer-modified-p)
!     (let (revert eob winlist eoblist)
!       (or (and buffer-file-name
!              (file-readable-p buffer-file-name)
               (not (verify-visited-file-modtime (current-buffer)))
               (setq revert t))
          (and (or auto-revert-mode global-auto-revert-non-file-buffers)
***************
*** 312,318 ****
        (when (and auto-revert-verbose
                   (not (eq revert 'fast)))
          (message "Reverting buffer `%s'." (buffer-name)))
!       (revert-buffer 'ignore-auto 'dont-ask 'preserve-modes))
        ;; `preserve-modes' avoids changing the (minor) modes.  But we
        ;; do want to reset the mode for VC, so we do it manually.
        (when (or revert auto-revert-check-vc-info)
--- 323,340 ----
        (when (and auto-revert-verbose
                   (not (eq revert 'fast)))
          (message "Reverting buffer `%s'." (buffer-name)))
!       (when buffer-file-name
!         (setq eob (eobp))
!         (setq winlist (get-buffer-window-list (current-buffer) 'no-mini t))
!         (setq eoblist ())
!         (dolist (window winlist)
!           (push (cons (= (window-point window) (point-max)) window)
!                 eoblist)))
!       (revert-buffer 'ignore-auto 'dont-ask 'preserve-modes)
!       (when buffer-file-name
!         (when eob (goto-char (point-max)))
!         (dolist (pair eoblist)
!           (when (car pair) (set-window-point (cdr pair) (point-max))))))
        ;; `preserve-modes' avoids changing the (minor) modes.  But we
        ;; do want to reset the mode for VC, so we do it manually.
        (when (or revert auto-revert-check-vc-info)
============================================================




reply via email to

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