diff options
author | Luc Teirlinck <teirllm@auburn.edu> | 2004-04-05 01:09:37 +0000 |
---|---|---|
committer | Luc Teirlinck <teirllm@auburn.edu> | 2004-04-05 01:09:37 +0000 |
commit | 1f41bcba72b31a2d629896dad4cd82b1a234451c (patch) | |
tree | da723756a3eef0090e6be6f8d09fef0762f929ae /lisp/autorevert.el | |
parent | 8c5fe07fa2dbf6c520728fe39a83f3a5516d786b (diff) | |
download | emacs-1f41bcba72b31a2d629896dad4cd82b1a234451c.tar.gz |
(auto-revert-handler): If point (or a window point) is at the end of
the buffer, keep it there after reverting. This allows to tail a file.
Mention this in the `Commentary'.
Diffstat (limited to 'lisp/autorevert.el')
-rw-r--r-- | lisp/autorevert.el | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/lisp/autorevert.el b/lisp/autorevert.el index 6e74a96eff5..58bb6d29705 100644 --- a/lisp/autorevert.el +++ b/lisp/autorevert.el @@ -44,6 +44,17 @@ ;; 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,10 +309,10 @@ will use an up-to-date value of `auto-revert-interval'" "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))) + (let ((buffer (current-buffer)) revert eob eoblist) + (or (and buffer-file-name + (file-readable-p buffer-file-name) + (not (verify-visited-file-modtime buffer)) (setq revert t)) (and (or auto-revert-mode global-auto-revert-non-file-buffers) revert-buffer-function @@ -312,7 +323,22 @@ This is an internal function used by Auto-Revert Mode." (when (and auto-revert-verbose (not (eq revert 'fast))) (message "Reverting buffer `%s'." (buffer-name))) - (revert-buffer 'ignore-auto 'dont-ask 'preserve-modes)) + ;; If point (or a window point) is at the end of the buffer, + ;; we want to keep it at the end after reverting. This allows + ;; to tail a file. + (when buffer-file-name + (setq eob (eobp)) + (walk-windows + #'(lambda (window) + (and (eq (window-buffer window) buffer) + (= (window-point window) (point-max)) + (push window eoblist))) + 'no-mini t)) + (revert-buffer 'ignore-auto 'dont-ask 'preserve-modes) + (when buffer-file-name + (when eob (goto-char (point-max))) + (dolist (window eoblist) + (set-window-point window (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) |