*** /tmp/ediffGTBgTB 2021-01-28 15:18:21.881661122 +0100 --- /home/albinus/src/emacs/lisp/autorevert.el 2021-01-28 15:06:38.034456811 +0100 *************** *** 355,364 **** (add-hook 'after-set-visited-file-name-hook #'auto-revert-set-visited-file-name) ! (defvar auto-revert--buffers-by-watch-descriptor ! (make-hash-table :test 'equal) ! "A hash table mapping notification descriptors to lists of buffers. ! The buffers use that descriptor for auto-revert notifications. The key is equal to `auto-revert-notify-watch-descriptor' in each buffer.") --- 355,363 ---- (add-hook 'after-set-visited-file-name-hook #'auto-revert-set-visited-file-name) ! (defvar auto-revert--buffer-by-watch-descriptor nil ! "An association list mapping notification descriptors to buffers. ! The buffer uses that descriptor for auto-revert notifications. The key is equal to `auto-revert-notify-watch-descriptor' in each buffer.") *************** *** 630,645 **** (defun auto-revert-notify-rm-watch () "Disable file notification for current buffer's associated file." ! (let ((desc auto-revert-notify-watch-descriptor) ! (table auto-revert--buffers-by-watch-descriptor)) ! (when desc ! (let ((buffers (delq (current-buffer) (gethash desc table)))) ! (if buffers ! (puthash desc buffers table) ! (remhash desc table))) ! (ignore-errors ! (file-notify-rm-watch desc)) ! (remove-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch t))) (setq auto-revert-notify-watch-descriptor nil auto-revert-notify-modified-p nil)) --- 629,640 ---- (defun auto-revert-notify-rm-watch () "Disable file notification for current buffer's associated file." ! (when-let ((desc auto-revert-notify-watch-descriptor)) ! (setq auto-revert--buffer-by-watch-descriptor ! (assoc-delete-all desc auto-revert--buffer-by-watch-descriptor)) ! (ignore-errors ! (file-notify-rm-watch desc)) ! (remove-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch t)) (setq auto-revert-notify-watch-descriptor nil auto-revert-notify-modified-p nil)) *************** *** 660,672 **** (if buffer-file-name '(change attribute-change) '(change)) 'auto-revert-notify-handler)))) (when auto-revert-notify-watch-descriptor ! (setq auto-revert-notify-modified-p t) ! (puthash ! auto-revert-notify-watch-descriptor ! (cons (current-buffer) ! (gethash auto-revert-notify-watch-descriptor ! auto-revert--buffers-by-watch-descriptor)) ! auto-revert--buffers-by-watch-descriptor) (add-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch nil t)))) ;; If we have file notifications, we want to update the auto-revert buffers --- 655,664 ---- (if buffer-file-name '(change attribute-change) '(change)) 'auto-revert-notify-handler)))) (when auto-revert-notify-watch-descriptor ! (setq auto-revert-notify-modified-p t ! auto-revert--buffer-by-watch-descriptor ! (cons (cons auto-revert-notify-watch-descriptor (current-buffer)) ! auto-revert--buffer-by-watch-descriptor)) (add-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch nil t)))) ;; If we have file notifications, we want to update the auto-revert buffers *************** *** 696,703 **** (action (nth 1 event)) (file (nth 2 event)) (file1 (nth 3 event)) ;; Target of `renamed'. ! (buffers (gethash descriptor ! auto-revert--buffers-by-watch-descriptor))) ;; Check, that event is meant for us. (cl-assert descriptor) ;; Since we watch a directory, a file name must be returned. --- 688,695 ---- (action (nth 1 event)) (file (nth 2 event)) (file1 (nth 3 event)) ;; Target of `renamed'. ! (buffer (alist-get descriptor auto-revert--buffer-by-watch-descriptor ! nil nil #'equal))) ;; Check, that event is meant for us. (cl-assert descriptor) ;; Since we watch a directory, a file name must be returned. *************** *** 706,714 **** (when auto-revert-debug (message "auto-revert-notify-handler %S" event)) ! (if (eq action 'stopped) ! ;; File notification has stopped. Continue with polling. ! (cl-dolist (buffer buffers) (with-current-buffer buffer (when (or ;; A buffer associated with a file. --- 698,706 ---- (when auto-revert-debug (message "auto-revert-notify-handler %S" event)) ! (when (buffer-live-p buffer) ! (if (eq action 'stopped) ! ;; File notification has stopped. Continue with polling. (with-current-buffer buffer (when (or ;; A buffer associated with a file. *************** *** 721,758 **** (auto-revert-notify-rm-watch) ;; Restart the timer if it wasn't running. (unless auto-revert-timer ! (auto-revert-set-timer))))) ! ;; Loop over all buffers, in order to find the intended one. ! (cl-dolist (buffer buffers) ! (when (buffer-live-p buffer) ! (with-current-buffer buffer ! (when (or ! ;; A buffer associated with a file. ! (and (stringp buffer-file-name) ! (or ! (and (memq ! action '(attribute-changed changed created)) ! (string-equal ! (file-name-nondirectory file) ! (file-name-nondirectory buffer-file-name))) ! (and (eq action 'renamed) ! (string-equal ! (file-name-nondirectory file1) ! (file-name-nondirectory buffer-file-name))))) ! ;; A buffer w/o a file, like dired. ! (and (null buffer-file-name) ! (memq action '(created renamed deleted)))) ! ;; Mark buffer modified. ! (setq auto-revert-notify-modified-p t) ! ! ;; Revert the buffer now if we're not locked out. ! (unless auto-revert--lockout-timer ! (auto-revert-handler) ! (setq auto-revert--lockout-timer ! (run-with-timer ! auto-revert--lockout-interval nil ! #'auto-revert--end-lockout buffer))))))))))) (defun auto-revert--end-lockout (buffer) "End the lockout period after a notification. --- 713,747 ---- (auto-revert-notify-rm-watch) ;; Restart the timer if it wasn't running. (unless auto-revert-timer ! (auto-revert-set-timer)))) ! (with-current-buffer buffer ! (when (or ! ;; A buffer associated with a file. ! (and (stringp buffer-file-name) ! (or ! (and (memq ! action '(attribute-changed changed created)) ! (string-equal ! (file-name-nondirectory file) ! (file-name-nondirectory buffer-file-name))) ! (and (eq action 'renamed) ! (string-equal ! (file-name-nondirectory file1) ! (file-name-nondirectory buffer-file-name))))) ! ;; A buffer w/o a file, like dired. ! (and (null buffer-file-name) ! (memq action '(created renamed deleted)))) ! ;; Mark buffer modified. ! (setq auto-revert-notify-modified-p t) ! ! ;; Revert the buffer now if we're not locked out. ! (unless auto-revert--lockout-timer ! (auto-revert-handler) ! (setq auto-revert--lockout-timer ! (run-with-timer ! auto-revert--lockout-interval nil ! #'auto-revert--end-lockout buffer)))))))))) (defun auto-revert--end-lockout (buffer) "End the lockout period after a notification.