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: Sun, 29 May 2005 20:43:39 -0500 (CDT)

Here is still another patch to easy-mmode.  It gets rid of the new
MODE-stored-mode variable, replacing it with the condition that dis-
and re-enabling MODE should adapt MODE reliably to the current major
mode.  That means that one way or the other, we have to take care of
Font Lock, which currently does not satisfy this condition.  Either we
make it satisfy the condition, or we still need a
font-lock-mode-stored-hook and an associated error message.

Note that even after this patch, there is one potentially troublesome
case left.  It concerns the case of a major mode that gets enabled by
a timer or process for a non-file visiting buffer.  (Even in this case
it is only likely to occur for major modes that do not follow the new
conventions.)  It is easy to get rid of this remaining problem.
However, it would require that not only the final check by
find-file-hook or after-command-hook, but also the check by
after-change-major-mode-hook, disables the mode if it already is
enabled and then re-enables it.  The patch below will sometimes, but
only in a _very_ small minority of the cases, _unnecessarily_ disable
and re-enable the mode.  To get rid of the remaining problem, we would
have to do such an unnecessary procedure nearly every time and
occasionally we would disable and re-enable unnecessarily more than
once.  In practice, the remaining case probably only affects
autoreverting of non-file buffers, so it means that each time we
autorevert an additional non-file type, we would need to check that
its usual major mode and its parent modes adhere to the new major mode
conventions and do not cause trouble in some other freakish way.  Again,
if we are willing to pay a price in efficiency, getting rid of the
remaining (rare) problem is easy.

===File ~/easy-mmode-diff===================================
*** easy-mmode.el       22 May 2005 16:50:33 -0500      1.63
--- easy-mmode.el       29 May 2005 17:52:33 -0500      
***************
*** 271,283 ****
  TURN-ON is a function that will be called with no args in every buffer
    and that should try to turn MODE on if applicable for that buffer.
  KEYS is a list of CL-style keyword arguments:
! :group to specify the custom group."
    (let* ((global-mode-name (symbol-name global-mode))
         (pretty-name (easy-mmode-pretty-mode-name mode))
         (pretty-global-name (easy-mmode-pretty-mode-name global-mode))
         (group nil)
         (extra-args nil)
         (buffers (intern (concat global-mode-name "-buffers")))
         (cmmh (intern (concat global-mode-name "-cmmh"))))
  
      ;; Check keys.
--- 271,291 ----
  TURN-ON is a function that will be called with no args in every buffer
    and that should try to turn MODE on if applicable for that buffer.
  KEYS is a list of CL-style keyword arguments:
! :group to specify the custom group.
! 
! 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."
! 
    (let* ((global-mode-name (symbol-name global-mode))
         (pretty-name (easy-mmode-pretty-mode-name mode))
         (pretty-global-name (easy-mmode-pretty-mode-name global-mode))
         (group nil)
         (extra-args nil)
         (buffers (intern (concat global-mode-name "-buffers")))
+        (buffers-check (intern (concat global-mode-name "-check-buffers")))
         (cmmh (intern (concat global-mode-name "-cmmh"))))
  
      ;; Check keys.
***************
*** 307,314 ****
--- 315,324 ----
         (if ,global-mode
             (progn
               (add-hook 'after-change-major-mode-hook ',buffers)
+              (add-hook 'find-file-hook ',buffers-check)
               (add-hook 'change-major-mode-hook ',cmmh))
           (remove-hook 'after-change-major-mode-hook ',buffers)
+          (remove-hook 'find-file-hook ',buffers-check)
           (remove-hook 'change-major-mode-hook ',cmmh))
  
         ;; Go through existing buffers.
***************
*** 325,341 ****
  
         ;; The function that calls TURN-ON in each buffer.
         (defun ,buffers ()
!        (remove-hook 'post-command-hook ',buffers)
         (while ,buffers
           (let ((buf (pop ,buffers)))
             (when (buffer-live-p buf)
!              (with-current-buffer buf (,turn-on))))))
!        (put ',buffers 'definition-name ',global-mode)
  
         ;; The function that catches kill-all-local-variables.
         (defun ,cmmh ()
         (add-to-list ',buffers (current-buffer))
!        (add-hook 'post-command-hook ',buffers))
         (put ',cmmh 'definition-name ',global-mode))))
  
  ;;;
--- 335,361 ----
  
         ;; The function that calls TURN-ON in each buffer.
         (defun ,buffers ()
!        (dolist (buf ,buffers)
!          (when (buffer-live-p buf)
!            (with-current-buffer buf
!              (unless ,mode
!                (,turn-on))))))
!        (put ',buffers 'definition-name ',global-mode)
! 
!        (defun ,buffers-check ()
!        (remove-hook 'post-command-hook ',buffers-check)
         (while ,buffers
           (let ((buf (pop ,buffers)))
             (when (buffer-live-p buf)
!              (with-current-buffer buf
!                (when ,mode (,mode -1))
!                (,turn-on))))))
!        (put ',buffers-check 'definition-name ',global-mode)
  
         ;; The function that catches kill-all-local-variables.
         (defun ,cmmh ()
         (add-to-list ',buffers (current-buffer))
!        (add-hook 'post-command-hook ',buffers-check))
         (put ',cmmh 'definition-name ',global-mode))))
  
  ;;;
============================================================




reply via email to

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