emacs-devel
[Top][All Lists]
Advanced

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

Re: address@hidden: Re: jit lock sit-for provokes redisplay provokes ime


From: Chong Yidong
Subject: Re: address@hidden: Re: jit lock sit-for provokes redisplay provokes imenu]
Date: Tue, 29 Aug 2006 22:43:13 -0400
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux)

Richard Stallman <address@hidden> writes:

>     > +       (when jit-lock-mode
>     > +         ;; Avoid updating the menubar after each stealth 
> fontification.
>     > +         (jit-lock-register 'imenu-save-tick-before-jit-lock nil nil)
>     > +         (jit-lock-register 'imenu-update-tick-after-jit-lock nil t))
>
>     Won't work if font-lock-mode is enabled after imenu is used.
>
> Could that be solved by making jit-lock-mode also enable these hooks?

How about this?  It adds jit-lock-pre-stealth-fontify-hook and
jit-lock-post-stealth-fontify-hook, which are normal hooks run before
and after each chunk of stealth fontification.  Then imenu can use
this to avoid menu bar updates resulting from stealth fontification.

The only disadvantage is adding two `run-hook' called to the
jit-lock-stealth-fontify timer function, but hopefully the performance
impact isn't too bad.

*** emacs/lisp/imenu.el.~1.118.~        2006-08-29 18:14:09.000000000 -0400
--- emacs/lisp/imenu.el 2006-08-29 22:38:21.000000000 -0400
***************
*** 953,958 ****
--- 953,962 ----
        (define-key newmap [menu-bar index]
          `(menu-item ,name ,(make-sparse-keymap "Imenu")))
        (use-local-map newmap)
+       (add-hook 'jit-lock-pre-stealth-fontify-hook
+                 'imenu-pre-stealth-fontify-fn nil t)
+       (add-hook 'jit-lock-post-stealth-fontify-hook
+                 'imenu-post-stealth-fontify-fn nil t)
        (add-hook 'menu-bar-update-hook 'imenu-update-menubar))
      (error "The mode `%s' does not support Imenu" mode-name)))
  
***************
*** 970,980 ****
--- 974,1000 ----
    "The value of (buffer-modified-tick) as of last call to 
`imenu-update-menubar'.")
  (make-variable-buffer-local 'imenu-menubar-modified-tick)
  
+ (defvar imenu-unmodified-before-stealth-fontify nil)
+ (make-variable-buffer-local 'imenu-unmodified-before-stealth-fontify)
+ 
+ (defun imenu-pre-stealth-fontify-fn ()
+   (setq imenu-unmodified-before-stealth-fontify
+       (eq (buffer-modified-tick) imenu-menubar-modified-tick)))
+ 
+ (defun imenu-post-stealth-fontify-fn ()
+   (if imenu-unmodified-before-stealth-fontify
+       (setq imenu-menubar-modified-tick (buffer-modified-tick)
+           imenu-unmodified-before-stealth-fontify nil)))
+ 
+ (setq foo 0)
+ 
  (defun imenu-update-menubar ()
    (when (and (current-local-map)
             (keymapp (lookup-key (current-local-map) [menu-bar index]))
             (not (eq (buffer-modified-tick)
                      imenu-menubar-modified-tick)))
+     (setq foo (% (1+ foo) 10))
+     (message (format "Foo %d" foo))
      (setq imenu-menubar-modified-tick (buffer-modified-tick))
      (let ((index-alist (imenu--make-index-alist t)))
        ;; Don't bother updating if the index-alist has not changed
*** emacs/lisp/jit-lock.el.~1.55.~      2006-08-29 18:14:09.000000000 -0400
--- emacs/lisp/jit-lock.el      2006-08-29 22:33:28.000000000 -0400
***************
*** 182,187 ****
--- 182,192 ----
    "List of buffers with pending deferred fontification.")
  (defvar jit-lock-stealth-buffers nil
    "List of buffers that are being fontified stealthily.")
+ 
+ (defvar jit-lock-pre-stealth-fontify-hook nil
+   "Normal hook run before performing each chunk of stealth fontification.")
+ (defvar jit-lock-post-stealth-fontify-hook nil
+   "Normal hook run after performing each chunk of stealth fontification.")
  
  ;;; JIT lock mode
  
***************
*** 488,495 ****
--- 493,502 ----
                  (with-temp-message (if jit-lock-stealth-verbose
                                         (concat "JIT stealth lock "
                                                 (buffer-name)))
+                   (run-hooks 'jit-lock-pre-stealth-fontify-hook)
                    (jit-lock-fontify-now start
                                          (+ start jit-lock-chunk-size))
+                   (run-hooks 'jit-lock-post-stealth-fontify-hook)
                    ;; Run again after `jit-lock-stealth-nice' seconds.
                    (setq delay (or jit-lock-stealth-nice 0)))
                ;; Nothing to fontify here.  Remove this buffer from
***************
*** 503,509 ****
        (timer-set-idle-time jit-lock-stealth-repeat-timer (current-idle-time))
        (timer-inc-time jit-lock-stealth-repeat-timer delay)
        (timer-activate-when-idle jit-lock-stealth-repeat-timer t)))))
- 
  
  ;;; Deferred fontification.
  
--- 510,515 ----




reply via email to

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