emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: org-mode and mode hooks.


From: Luc Teirlinck
Subject: Re: org-mode and mode hooks.
Date: Tue, 31 May 2005 22:50:23 -0500 (CDT)

Stefan Monnier wrote:

   The assumption is that those keywords are added via a function placed on the
   major mode's hook, i.e. the keywords tweak the major mode and should thus be
   removed/readded when the major mode changes.
   Of course in other settings it should behave differently.

One solution is making font-lock-set-defaults itself check whether the
major mode is correct (as one of my earlier patches already did, but I
maybe mistakenly changed it later on).  That way, Font Lock gets
updated for the current major mode, _before_ any keywords get added.
So, any keywords added while hooks are being run at the end of the
actual final major mode, or during the body of the final major mode,
are not going to be lost.  Keywords added passing nil for MODE _while
an ancestor mode is running_ are lost.  It is not clear at all to me
whether or not they are supposed to be lost.  The documentation is
super-vague and cryptic.  (The other solution I proposed earlier would
have similar effects, but would be somewhat more complex.)

Concrete problem:

Suppose child-mode is derived from parent-mode.  A program adds a call to
font-lock-add-keywords passing nil for MODE to parent-mode-hook.
Do you want those keywords to apply to child-mode or not?

With the patches below, they would apply to child-mode if parent-mode
followed the major mode conventions (but not otherwise).  Currently it
seems to be nowhere documented whether or not these keywords should
apply to child-mode, so that currently the effects of using
font-lock-add-keywords passing nil for MODE seem to be undefined in as
far as derived modes are concerned.

===File ~/font-core-diff====================================
*** font-core.el        22 May 2005 16:46:07 -0500      1.28
--- font-core.el        31 May 2005 20:32:19 -0500      
***************
*** 88,93 ****
--- 88,95 ----
  It will be passed one argument, which is the current value of
  `font-lock-mode'.")
  
+ ;; The mode for which font-lock was initialized, or nil if none.
+ (defvar font-lock-mode-stored-mode)
  (define-minor-mode font-lock-mode
    "Toggle Font Lock mode.
  With arg, turn Font Lock mode off if and only if arg is a non-positive
***************
*** 156,162 ****
    ;; Arrange to unfontify this buffer if we change major mode later.
    (if font-lock-mode
        (add-hook 'change-major-mode-hook 'font-lock-change-mode nil t)
!     (remove-hook 'change-major-mode-hook 'font-lock-change-mode t)))
  
  ;; Get rid of fontification for the old major mode.
  ;; We do this when changing major modes.
--- 158,166 ----
    ;; Arrange to unfontify this buffer if we change major mode later.
    (if font-lock-mode
        (add-hook 'change-major-mode-hook 'font-lock-change-mode nil t)
!     (remove-hook 'change-major-mode-hook 'font-lock-change-mode t))
!   (when font-lock-mode
!     (setq font-lock-mode-stored-mode major-mode)))
  
  ;; Get rid of fontification for the old major mode.
  ;; We do this when changing major modes.
***************
*** 175,180 ****
--- 179,185 ----
                                      '(font-lock-face)))
      (restore-buffer-modified-p modp)))
  
+ (defvar font-lock-set-defaults)
  (defun font-lock-default-function (mode)
    ;; Turn on Font Lock mode.
    (when mode
***************
*** 201,209 ****
    ;; Only do hard work if the mode has specified stuff in
    ;; `font-lock-defaults'.
    (when (or font-lock-defaults
!           (and (boundp 'font-lock-keywords) font-lock-keywords)
            (with-no-warnings
!            (cdr (assq major-mode font-lock-defaults-alist))))
      (font-lock-mode-internal mode)))
  
  (defun turn-on-font-lock ()
--- 206,219 ----
    ;; Only do hard work if the mode has specified stuff in
    ;; `font-lock-defaults'.
    (when (or font-lock-defaults
!           (if (boundp 'font-lock-keywords) font-lock-keywords)
            (with-no-warnings
!             (cdr (assq major-mode font-lock-defaults-alist)))
!           (and mode
!                (boundp 'font-lock-set-defaults)
!                font-lock-set-defaults
!                font-lock-mode-stored-mode
!                (not (eq font-lock-mode-stored-mode major-mode))))
      (font-lock-mode-internal mode)))
  
  (defun turn-on-font-lock ()
============================================================

===File ~/font-lock-diff====================================
*** font-lock.el        29 May 2005 09:15:38 -0500      1.259
--- font-lock.el        31 May 2005 20:47:50 -0500      
***************
*** 704,710 ****
         (font-lock-update-removed-keyword-alist mode keywords append))
        (t
         ;; Otherwise set or add the keywords now.
!        ;; This is a no-op if it has been done already in this buffer.
         (font-lock-set-defaults)
         (let ((was-compiled (eq (car font-lock-keywords) t)))
           ;; Bring back the user-level (uncompiled) keywords.
--- 704,711 ----
         (font-lock-update-removed-keyword-alist mode keywords append))
        (t
         ;; Otherwise set or add the keywords now.
!        ;; This is a no-op if it has been done already in this buffer
!        ;; for the correct major mode.
         (font-lock-set-defaults)
         (let ((was-compiled (eq (car font-lock-keywords) t)))
           ;; Bring back the user-level (uncompiled) keywords.
***************
*** 1571,1582 ****
  
  (defvar font-lock-set-defaults nil)   ; Whether we have set up defaults.
  
  (defun font-lock-set-defaults ()
    "Set fontification defaults appropriately for this mode.
  Sets various variables using `font-lock-defaults' (or, if nil, using
  `font-lock-defaults-alist') and `font-lock-maximum-decoration'."
!   ;; Set fontification defaults iff not previously set.
!   (unless font-lock-set-defaults
      (set (make-local-variable 'font-lock-set-defaults) t)
      (make-local-variable 'font-lock-fontified)
      (make-local-variable 'font-lock-multiline)
--- 1572,1585 ----
  
  (defvar font-lock-set-defaults nil)   ; Whether we have set up defaults.
  
+ (defvar font-lock-mode-stored-mode)
  (defun font-lock-set-defaults ()
    "Set fontification defaults appropriately for this mode.
  Sets various variables using `font-lock-defaults' (or, if nil, using
  `font-lock-defaults-alist') and `font-lock-maximum-decoration'."
!   ;; Set fontification defaults iff not previously set for correct major mode.
!   (unless (and font-lock-set-defaults
!              (eq font-lock-mode-stored-mode major-mode))
      (set (make-local-variable 'font-lock-set-defaults) t)
      (make-local-variable 'font-lock-fontified)
      (make-local-variable 'font-lock-multiline)
============================================================




reply via email to

[Prev in Thread] Current Thread [Next in Thread]