comparison lisp/emacs-lisp/easy-mmode.el @ 90188:01137c1fdbe9

Revision: miles@gnu.org--gnu-2005/emacs--unicode--0--patch-57 Merge from emacs--cvs-trunk--0 Patches applied: * emacs--cvs-trunk--0 (patch 324-352) - Merge from gnus--rel--5.10 - Update from CVS - etc/emacs-buffer.gdb: Remove RCS keywords * gnus--rel--5.10 (patch 70-79) - Update from CVS - Merge from emacs--cvs-trunk--0
author Miles Bader <miles@gnu.org>
date Mon, 06 Jun 2005 02:39:45 +0000
parents 5b029ff3b08d cc9dd228e2e6
children 173dee4e2611
comparison
equal deleted inserted replaced
90187:587ea1490d70 90188:01137c1fdbe9
269 (defmacro define-global-minor-mode (global-mode mode turn-on &rest keys) 269 (defmacro define-global-minor-mode (global-mode mode turn-on &rest keys)
270 "Make GLOBAL-MODE out of the buffer-local minor MODE. 270 "Make GLOBAL-MODE out of the buffer-local minor MODE.
271 TURN-ON is a function that will be called with no args in every buffer 271 TURN-ON is a function that will be called with no args in every buffer
272 and that should try to turn MODE on if applicable for that buffer. 272 and that should try to turn MODE on if applicable for that buffer.
273 KEYS is a list of CL-style keyword arguments: 273 KEYS is a list of CL-style keyword arguments:
274 :group to specify the custom group." 274 :group to specify the custom group.
275
276 If MODE's set-up depends on the major mode in effect when it was
277 enabled, then disabling and reenabling MODE should make MODE work
278 correctly with the current major mode. This is important to
279 prevent problems with derived modes, that is, major modes that
280 call another major mode in their body."
281
275 (let* ((global-mode-name (symbol-name global-mode)) 282 (let* ((global-mode-name (symbol-name global-mode))
276 (pretty-name (easy-mmode-pretty-mode-name mode)) 283 (pretty-name (easy-mmode-pretty-mode-name mode))
277 (pretty-global-name (easy-mmode-pretty-mode-name global-mode)) 284 (pretty-global-name (easy-mmode-pretty-mode-name global-mode))
278 (group nil) 285 (group nil)
279 (extra-args nil) 286 (extra-args nil)
280 (buffers (intern (concat global-mode-name "-buffers"))) 287 (MODE-buffers (intern (concat global-mode-name "-buffers")))
281 (cmmh (intern (concat global-mode-name "-cmmh")))) 288 (MODE-enable-in-buffers
289 (intern (concat global-mode-name "-enable-in-buffers")))
290 (MODE-check-buffers
291 (intern (concat global-mode-name "-check-buffers")))
292 (MODE-cmhh (intern (concat global-mode-name "-cmhh")))
293 (MODE-major-mode (intern (concat (symbol-name mode) "-major-mode"))))
282 294
283 ;; Check keys. 295 ;; Check keys.
284 (while (keywordp (car keys)) 296 (while (keywordp (car keys))
285 (case (pop keys) 297 (case (pop keys)
286 (:extra-args (setq extra-args (pop keys))) 298 (:extra-args (setq extra-args (pop keys)))
292 (setq group 304 (setq group
293 `(:group ',(intern (replace-regexp-in-string 305 `(:group ',(intern (replace-regexp-in-string
294 "-mode\\'" "" (symbol-name mode)))))) 306 "-mode\\'" "" (symbol-name mode))))))
295 307
296 `(progn 308 `(progn
309 (defvar ,MODE-major-mode nil)
310 (make-variable-buffer-local ',MODE-major-mode)
297 ;; The actual global minor-mode 311 ;; The actual global minor-mode
298 (define-minor-mode ,global-mode 312 (define-minor-mode ,global-mode
299 ,(format "Toggle %s in every buffer. 313 ,(format "Toggle %s in every buffer.
300 With prefix ARG, turn %s on if and only if ARG is positive. 314 With prefix ARG, turn %s on if and only if ARG is positive.
301 %s is actually not turned on in every buffer but only in those 315 %s is actually not turned on in every buffer but only in those
304 :global t :extra-args ,extra-args ,@group 318 :global t :extra-args ,extra-args ,@group
305 319
306 ;; Setup hook to handle future mode changes and new buffers. 320 ;; Setup hook to handle future mode changes and new buffers.
307 (if ,global-mode 321 (if ,global-mode
308 (progn 322 (progn
309 (add-hook 'after-change-major-mode-hook ',buffers) 323 (add-hook 'after-change-major-mode-hook
310 (add-hook 'change-major-mode-hook ',cmmh)) 324 ',MODE-enable-in-buffers)
311 (remove-hook 'after-change-major-mode-hook ',buffers) 325 (add-hook 'find-file-hook ',MODE-check-buffers)
312 (remove-hook 'change-major-mode-hook ',cmmh)) 326 (add-hook 'change-major-mode-hook ',MODE-cmhh))
327 (remove-hook 'after-change-major-mode-hook ',MODE-enable-in-buffers)
328 (remove-hook 'find-file-hook ',MODE-check-buffers)
329 (remove-hook 'change-major-mode-hook ',MODE-cmhh))
313 330
314 ;; Go through existing buffers. 331 ;; Go through existing buffers.
315 (dolist (buf (buffer-list)) 332 (dolist (buf (buffer-list))
316 (with-current-buffer buf 333 (with-current-buffer buf
317 (if ,global-mode (,turn-on) (when ,mode (,mode -1)))))) 334 (if ,global-mode (,turn-on) (when ,mode (,mode -1))))))
319 ;; Autoloading define-global-minor-mode autoloads everything 336 ;; Autoloading define-global-minor-mode autoloads everything
320 ;; up-to-here. 337 ;; up-to-here.
321 :autoload-end 338 :autoload-end
322 339
323 ;; List of buffers left to process. 340 ;; List of buffers left to process.
324 (defvar ,buffers nil) 341 (defvar ,MODE-buffers nil)
325 342
326 ;; The function that calls TURN-ON in each buffer. 343 ;; The function that calls TURN-ON in each buffer.
327 (defun ,buffers () 344 (defun ,MODE-enable-in-buffers ()
328 (remove-hook 'post-command-hook ',buffers) 345 (dolist (buf ,MODE-buffers)
329 (while ,buffers 346 (when (buffer-live-p buf)
330 (let ((buf (pop ,buffers))) 347 (with-current-buffer buf
331 (when (buffer-live-p buf) 348 (if ,mode
332 (with-current-buffer buf (,turn-on)))))) 349 (unless (eq ,MODE-major-mode major-mode)
333 (put ',buffers 'definition-name ',global-mode) 350 (,mode -1)
351 (,turn-on)
352 (setq ,MODE-major-mode major-mode))
353 (,turn-on)
354 (setq ,MODE-major-mode major-mode))))))
355 (put ',MODE-enable-in-buffers 'definition-name ',global-mode)
356
357 (defun ,MODE-check-buffers ()
358 (,MODE-enable-in-buffers)
359 (setq ,MODE-buffers nil)
360 (remove-hook 'post-command-hook ',MODE-check-buffers))
361 (put ',MODE-check-buffers 'definition-name ',global-mode)
334 362
335 ;; The function that catches kill-all-local-variables. 363 ;; The function that catches kill-all-local-variables.
336 (defun ,cmmh () 364 (defun ,MODE-cmhh ()
337 (add-to-list ',buffers (current-buffer)) 365 (add-to-list ',MODE-buffers (current-buffer))
338 (add-hook 'post-command-hook ',buffers)) 366 (add-hook 'post-command-hook ',MODE-check-buffers))
339 (put ',cmmh 'definition-name ',global-mode)))) 367 (put ',MODE-cmhh 'definition-name ',global-mode))))
340 368
341 ;;; 369 ;;;
342 ;;; easy-mmode-defmap 370 ;;; easy-mmode-defmap
343 ;;; 371 ;;;
344 372