diff options
| author | Lin Sun | 2024-10-20 10:05:19 +0200 |
|---|---|---|
| committer | Michael Albinus | 2024-10-20 10:05:19 +0200 |
| commit | 545c54aea1ecccf84eaebbe3a3cb7b5fbc5716f8 (patch) | |
| tree | ecdaff2cadf06b380bc329dfd8d000f533c5fe4e | |
| parent | 80627a31c67b383393c53bd87dd21b7f0de3844e (diff) | |
| download | emacs-545c54aea1ecccf84eaebbe3a3cb7b5fbc5716f8.tar.gz emacs-545c54aea1ecccf84eaebbe3a3cb7b5fbc5716f8.zip | |
Enhance the auto-revert to avoid revert a buffer in short time
* lisp/autorevert.el (auto-revert--last-time): New defvar.
(auto-revert-handler, auto-revert-notify-handler): Use it.
* test/lisp/autorevert-tests.el (with-auto-revert-test): Set
`auto-revert--lockout-interval' correctly.
| -rw-r--r-- | lisp/autorevert.el | 16 | ||||
| -rw-r--r-- | test/lisp/autorevert-tests.el | 7 |
2 files changed, 17 insertions, 6 deletions
diff --git a/lisp/autorevert.el b/lisp/autorevert.el index 0fdab6ffc9f..ef758584c0d 100644 --- a/lisp/autorevert.el +++ b/lisp/autorevert.el | |||
| @@ -370,6 +370,9 @@ buffer.") | |||
| 370 | "Non-nil when file has been modified on the file system. | 370 | "Non-nil when file has been modified on the file system. |
| 371 | This has been reported by a file notification event.") | 371 | This has been reported by a file notification event.") |
| 372 | 372 | ||
| 373 | (defvar-local auto-revert--last-time nil | ||
| 374 | "The last time of buffer was reverted.") | ||
| 375 | |||
| 373 | (defvar auto-revert-debug nil | 376 | (defvar auto-revert-debug nil |
| 374 | "Use for debug messages.") | 377 | "Use for debug messages.") |
| 375 | 378 | ||
| @@ -749,13 +752,17 @@ system.") | |||
| 749 | ;; Mark buffer modified. | 752 | ;; Mark buffer modified. |
| 750 | (setq auto-revert-notify-modified-p t) | 753 | (setq auto-revert-notify-modified-p t) |
| 751 | 754 | ||
| 752 | ;; Revert the buffer now if we're not locked out. | 755 | ;; Lock out the buffer |
| 753 | (unless auto-revert--lockout-timer | 756 | (unless auto-revert--lockout-timer |
| 754 | (auto-revert-handler) | ||
| 755 | (setq auto-revert--lockout-timer | 757 | (setq auto-revert--lockout-timer |
| 756 | (run-with-timer | 758 | (run-with-timer |
| 757 | auto-revert--lockout-interval nil | 759 | auto-revert--lockout-interval nil |
| 758 | #'auto-revert--end-lockout buffer)))))))))) | 760 | #'auto-revert--end-lockout buffer)) |
| 761 | ;; Revert it when first entry or it was reverted intervals ago | ||
| 762 | (when (or (null auto-revert--last-time) | ||
| 763 | (> (float-time (time-since auto-revert--last-time)) | ||
| 764 | auto-revert--lockout-interval)) | ||
| 765 | (auto-revert-handler)))))))))) | ||
| 759 | 766 | ||
| 760 | (defun auto-revert--end-lockout (buffer) | 767 | (defun auto-revert--end-lockout (buffer) |
| 761 | "End the lockout period after a notification. | 768 | "End the lockout period after a notification. |
| @@ -801,7 +808,8 @@ This is an internal function used by Auto-Revert Mode." | |||
| 801 | #'buffer-stale--default-function) | 808 | #'buffer-stale--default-function) |
| 802 | t)))) | 809 | t)))) |
| 803 | eob eoblist) | 810 | eob eoblist) |
| 804 | (setq auto-revert-notify-modified-p nil) | 811 | (setq auto-revert-notify-modified-p nil |
| 812 | auto-revert--last-time (current-time)) | ||
| 805 | (when revert | 813 | (when revert |
| 806 | (when (and auto-revert-verbose | 814 | (when (and auto-revert-verbose |
| 807 | (not (eq revert 'fast))) | 815 | (not (eq revert 'fast))) |
diff --git a/test/lisp/autorevert-tests.el b/test/lisp/autorevert-tests.el index 4763994c5d4..7e176df6803 100644 --- a/test/lisp/autorevert-tests.el +++ b/test/lisp/autorevert-tests.el | |||
| @@ -132,12 +132,15 @@ This expects `auto-revert--messages' to be bound by | |||
| 132 | (error (message "%s" err) (signal (car err) (cdr err))))))) | 132 | (error (message "%s" err) (signal (car err) (cdr err))))))) |
| 133 | 133 | ||
| 134 | (defmacro with-auto-revert-test (&rest body) | 134 | (defmacro with-auto-revert-test (&rest body) |
| 135 | `(let ((auto-revert-interval-orig auto-revert-interval)) | 135 | `(let ((auto-revert-interval-orig auto-revert-interval) |
| 136 | (auto-revert--lockout-interval-orig auto-revert--lockout-interval)) | ||
| 136 | (unwind-protect | 137 | (unwind-protect |
| 137 | (progn | 138 | (progn |
| 138 | (customize-set-variable 'auto-revert-interval 0.1) | 139 | (customize-set-variable 'auto-revert-interval 0.1) |
| 140 | (setq auto-revert--lockout-interval 0.05) | ||
| 139 | ,@body) | 141 | ,@body) |
| 140 | (customize-set-variable 'auto-revert-interval auto-revert-interval-orig)))) | 142 | (customize-set-variable 'auto-revert-interval auto-revert-interval-orig) |
| 143 | (setq auto-revert--lockout-interval auto-revert--lockout-interval-orig)))) | ||
| 141 | 144 | ||
| 142 | (defun auto-revert-tests--write-file (text file time-delta &optional append) | 145 | (defun auto-revert-tests--write-file (text file time-delta &optional append) |
| 143 | (write-region text nil file append 'no-message) | 146 | (write-region text nil file append 'no-message) |