aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Mackenzie2013-02-15 20:01:51 +0000
committerAlan Mackenzie2013-02-15 20:01:51 +0000
commitf852f6d8c0db494ccb21b6020a5ebbeaa685a948 (patch)
tree1bdab6d0b27be22c0732adbb8119b6f872fdde70
parent8d9f189f40bc121dc95968df1170a1967f3f676d (diff)
downloademacs-f852f6d8c0db494ccb21b6020a5ebbeaa685a948.tar.gz
emacs-f852f6d8c0db494ccb21b6020a5ebbeaa685a948.zip
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.
-rw-r--r--lisp/ChangeLog9
-rw-r--r--lisp/emacs-lisp/easy-mmode.el43
2 files changed, 40 insertions, 12 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 920c953abce..99704a0b532 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,12 @@
12013-02-15 Alan Mackenzie <acm@muc.de>
2
3 * emacs-lisp/easy-mmode.el (define-globalized-minor-mode): When a
4 global minor mode has been enabled, call the minor mode function
5 for a new buffer once only, after the major mode hook, whilst
6 allowing that hook explicitly to disable the minor mode.
7 (MODE-disable-in-buffer): new (generated) function.
8 (disable-MODE): new (generated) buffer local variable.
9
12013-02-15 Jambunathan K <kjambunathan@gmail.com> 102013-02-15 Jambunathan K <kjambunathan@gmail.com>
2 11
3 * iswitchb.el (iswitchb-read-buffer): Bind `C-.' and `C-,' to 12 * iswitchb.el (iswitchb-read-buffer): Bind `C-.' and `C-,' to
diff --git a/lisp/emacs-lisp/easy-mmode.el b/lisp/emacs-lisp/easy-mmode.el
index 166c093f37b..2088e690228 100644
--- a/lisp/emacs-lisp/easy-mmode.el
+++ b/lisp/emacs-lisp/easy-mmode.el
@@ -341,9 +341,14 @@ If MODE's set-up depends on the major mode in effect when it was
341enabled, then disabling and reenabling MODE should make MODE work 341enabled, then disabling and reenabling MODE should make MODE work
342correctly with the current major mode. This is important to 342correctly with the current major mode. This is important to
343prevent problems with derived modes, that is, major modes that 343prevent problems with derived modes, that is, major modes that
344call another major mode in their body." 344call another major mode in their body.
345
346When a major mode is initialized, MODE is actually turned on just
347after running the major mode's hook. However, MODE is not turned
348on if the hook has explicitly disabled it."
345 (declare (doc-string 2)) 349 (declare (doc-string 2))
346 (let* ((global-mode-name (symbol-name global-mode)) 350 (let* ((global-mode-name (symbol-name global-mode))
351 (mode-name (symbol-name mode))
347 (pretty-name (easy-mmode-pretty-mode-name mode)) 352 (pretty-name (easy-mmode-pretty-mode-name mode))
348 (pretty-global-name (easy-mmode-pretty-mode-name global-mode)) 353 (pretty-global-name (easy-mmode-pretty-mode-name global-mode))
349 (group nil) 354 (group nil)
@@ -354,6 +359,10 @@ call another major mode in their body."
354 (MODE-check-buffers 359 (MODE-check-buffers
355 (intern (concat global-mode-name "-check-buffers"))) 360 (intern (concat global-mode-name "-check-buffers")))
356 (MODE-cmhh (intern (concat global-mode-name "-cmhh"))) 361 (MODE-cmhh (intern (concat global-mode-name "-cmhh")))
362 (MODE-disable-in-buffer
363 (intern (concat global-mode-name "-disable-in-buffer")))
364 (minor-MODE-hook (intern (concat mode-name "-hook")))
365 (disable-MODE (intern (concat "disable-" mode-name)))
357 (MODE-major-mode (intern (concat (symbol-name mode) "-major-mode"))) 366 (MODE-major-mode (intern (concat (symbol-name mode) "-major-mode")))
358 keyw) 367 keyw)
359 368
@@ -397,8 +406,6 @@ See `%s' for more information on %s."
397 (progn 406 (progn
398 (add-hook 'after-change-major-mode-hook 407 (add-hook 'after-change-major-mode-hook
399 ',MODE-enable-in-buffers) 408 ',MODE-enable-in-buffers)
400 (add-hook 'change-major-mode-after-body-hook
401 ',MODE-enable-in-buffers)
402 (add-hook 'find-file-hook ',MODE-check-buffers) 409 (add-hook 'find-file-hook ',MODE-check-buffers)
403 (add-hook 'change-major-mode-hook ',MODE-cmhh)) 410 (add-hook 'change-major-mode-hook ',MODE-cmhh))
404 (remove-hook 'after-change-major-mode-hook ',MODE-enable-in-buffers) 411 (remove-hook 'after-change-major-mode-hook ',MODE-enable-in-buffers)
@@ -416,6 +423,10 @@ See `%s' for more information on %s."
416 ;; up-to-here. 423 ;; up-to-here.
417 :autoload-end 424 :autoload-end
418 425
426 ;; A function which checks whether MODE has been disabled in the major
427 ;; mode hook which has just been run.
428 (add-hook ',minor-MODE-hook ',MODE-disable-in-buffer)
429
419 ;; List of buffers left to process. 430 ;; List of buffers left to process.
420 (defvar ,MODE-buffers nil) 431 (defvar ,MODE-buffers nil)
421 432
@@ -424,14 +435,15 @@ See `%s' for more information on %s."
424 (dolist (buf ,MODE-buffers) 435 (dolist (buf ,MODE-buffers)
425 (when (buffer-live-p buf) 436 (when (buffer-live-p buf)
426 (with-current-buffer buf 437 (with-current-buffer buf
427 (unless (eq ,MODE-major-mode major-mode) 438 (if ,disable-MODE
428 (if ,mode 439 (if ,mode (,mode -1))
429 (progn 440 (unless (eq ,MODE-major-mode major-mode)
430 (,mode -1) 441 (if ,mode
431 (,turn-on) 442 (progn
432 (setq ,MODE-major-mode major-mode)) 443 (,mode -1)
433 (,turn-on) 444 (,turn-on))
434 (setq ,MODE-major-mode major-mode))))))) 445 (,turn-on))))
446 (setq ,MODE-major-mode major-mode)))))
435 (put ',MODE-enable-in-buffers 'definition-name ',global-mode) 447 (put ',MODE-enable-in-buffers 'definition-name ',global-mode)
436 448
437 (defun ,MODE-check-buffers () 449 (defun ,MODE-check-buffers ()
@@ -444,7 +456,14 @@ See `%s' for more information on %s."
444 (defun ,MODE-cmhh () 456 (defun ,MODE-cmhh ()
445 (add-to-list ',MODE-buffers (current-buffer)) 457 (add-to-list ',MODE-buffers (current-buffer))
446 (add-hook 'post-command-hook ',MODE-check-buffers)) 458 (add-hook 'post-command-hook ',MODE-check-buffers))
447 (put ',MODE-cmhh 'definition-name ',global-mode)))) 459 (put ',MODE-cmhh 'definition-name ',global-mode)
460 ;; disable-MODE is set in MODE-disable-in-buffer and cleared by
461 ;; kill-all-local-variables.
462 (defvar-local ,disable-MODE nil)
463 (defun ,MODE-disable-in-buffer ()
464 (unless ,mode
465 (setq ,disable-MODE t)))
466 (put ',MODE-disable-in-buffer 'definition-name ',global-mode))))
448 467
449;;; 468;;;
450;;; easy-mmode-defmap 469;;; easy-mmode-defmap