Avoid turning on the global-minor-mode recursively

* lisp/emacs-lisp/easy-mmode.el (define-globalized-minor-mode): Clear
the buffer-list inside MODE-enable-in-buffers to avoid enabling the
mode recursively.  (Bug#31793)
This commit is contained in:
John Shahid 2018-06-23 11:12:44 -04:00 committed by Noam Postavsky
parent 51bf4e4650
commit 35e0305dc2

View file

@ -457,22 +457,26 @@ See `%s' for more information on %s."
;; The function that calls TURN-ON in each buffer. ;; The function that calls TURN-ON in each buffer.
(defun ,MODE-enable-in-buffers () (defun ,MODE-enable-in-buffers ()
(dolist (buf ,MODE-buffers) (let ((buffers ,MODE-buffers))
(when (buffer-live-p buf) ;; Clear MODE-buffers to avoid scanning the same list of
(with-current-buffer buf ;; buffers in recursive calls to MODE-enable-in-buffers.
(unless ,MODE-set-explicitly ;; Otherwise it could lead to infinite recursion.
(unless (eq ,MODE-major-mode major-mode) (setq ,MODE-buffers nil)
(if ,mode (dolist (buf buffers)
(progn (when (buffer-live-p buf)
(,mode -1) (with-current-buffer buf
(funcall #',turn-on)) (unless ,MODE-set-explicitly
(funcall #',turn-on)))) (unless (eq ,MODE-major-mode major-mode)
(setq ,MODE-major-mode major-mode))))) (if ,mode
(progn
(,mode -1)
(funcall #',turn-on))
(funcall #',turn-on))))
(setq ,MODE-major-mode major-mode))))))
(put ',MODE-enable-in-buffers 'definition-name ',global-mode) (put ',MODE-enable-in-buffers 'definition-name ',global-mode)
(defun ,MODE-check-buffers () (defun ,MODE-check-buffers ()
(,MODE-enable-in-buffers) (,MODE-enable-in-buffers)
(setq ,MODE-buffers nil)
(remove-hook 'post-command-hook ',MODE-check-buffers)) (remove-hook 'post-command-hook ',MODE-check-buffers))
(put ',MODE-check-buffers 'definition-name ',global-mode) (put ',MODE-check-buffers 'definition-name ',global-mode)