emacs-lisp/easy-mmode.el (define-globalized-minor-mode): When a global

minor mode has been enabled, call the minor mode function for a new
buffer once only, after the major mode hook, whilst allowing that hook
explicitly to disable the minor mode.
(MODE-disable-in-buffer): new (generated) function.
(disable-MODE): new (generated) buffer local variable.
This commit is contained in:
Alan Mackenzie 2013-02-15 20:01:51 +00:00
parent 8d9f189f40
commit f852f6d8c0
2 changed files with 40 additions and 12 deletions

View file

@ -341,9 +341,14 @@ If MODE's set-up depends on the major mode in effect when it was
enabled, then disabling and reenabling MODE should make MODE work
correctly with the current major mode. This is important to
prevent problems with derived modes, that is, major modes that
call another major mode in their body."
call another major mode in their body.
When a major mode is initialized, MODE is actually turned on just
after running the major mode's hook. However, MODE is not turned
on if the hook has explicitly disabled it."
(declare (doc-string 2))
(let* ((global-mode-name (symbol-name global-mode))
(mode-name (symbol-name mode))
(pretty-name (easy-mmode-pretty-mode-name mode))
(pretty-global-name (easy-mmode-pretty-mode-name global-mode))
(group nil)
@ -354,6 +359,10 @@ call another major mode in their body."
(MODE-check-buffers
(intern (concat global-mode-name "-check-buffers")))
(MODE-cmhh (intern (concat global-mode-name "-cmhh")))
(MODE-disable-in-buffer
(intern (concat global-mode-name "-disable-in-buffer")))
(minor-MODE-hook (intern (concat mode-name "-hook")))
(disable-MODE (intern (concat "disable-" mode-name)))
(MODE-major-mode (intern (concat (symbol-name mode) "-major-mode")))
keyw)
@ -397,8 +406,6 @@ See `%s' for more information on %s."
(progn
(add-hook 'after-change-major-mode-hook
',MODE-enable-in-buffers)
(add-hook 'change-major-mode-after-body-hook
',MODE-enable-in-buffers)
(add-hook 'find-file-hook ',MODE-check-buffers)
(add-hook 'change-major-mode-hook ',MODE-cmhh))
(remove-hook 'after-change-major-mode-hook ',MODE-enable-in-buffers)
@ -416,6 +423,10 @@ See `%s' for more information on %s."
;; up-to-here.
:autoload-end
;; A function which checks whether MODE has been disabled in the major
;; mode hook which has just been run.
(add-hook ',minor-MODE-hook ',MODE-disable-in-buffer)
;; List of buffers left to process.
(defvar ,MODE-buffers nil)
@ -424,14 +435,15 @@ See `%s' for more information on %s."
(dolist (buf ,MODE-buffers)
(when (buffer-live-p buf)
(with-current-buffer buf
(unless (eq ,MODE-major-mode major-mode)
(if ,mode
(progn
(,mode -1)
(,turn-on)
(setq ,MODE-major-mode major-mode))
(,turn-on)
(setq ,MODE-major-mode major-mode)))))))
(if ,disable-MODE
(if ,mode (,mode -1))
(unless (eq ,MODE-major-mode major-mode)
(if ,mode
(progn
(,mode -1)
(,turn-on))
(,turn-on))))
(setq ,MODE-major-mode major-mode)))))
(put ',MODE-enable-in-buffers 'definition-name ',global-mode)
(defun ,MODE-check-buffers ()
@ -444,7 +456,14 @@ See `%s' for more information on %s."
(defun ,MODE-cmhh ()
(add-to-list ',MODE-buffers (current-buffer))
(add-hook 'post-command-hook ',MODE-check-buffers))
(put ',MODE-cmhh 'definition-name ',global-mode))))
(put ',MODE-cmhh 'definition-name ',global-mode)
;; disable-MODE is set in MODE-disable-in-buffer and cleared by
;; kill-all-local-variables.
(defvar-local ,disable-MODE nil)
(defun ,MODE-disable-in-buffer ()
(unless ,mode
(setq ,disable-MODE t)))
(put ',MODE-disable-in-buffer 'definition-name ',global-mode))))
;;;
;;; easy-mmode-defmap