diff lisp/jit-lock.el @ 29799:baa52c9029f6

(with-buffer-prepared-for-jit-lock): Renamed from with-buffer-prepared-for-font-lock and use inhibit-modification-hooks rather than setting *-change-functions. Update all functions to use the new name. (jit-lock-first-unfontify-pos): New semantics (and doc). (jit-lock-mode): Make non-interactive. Don't automatically turn on font-lock. Set jit-lock-first-unfontify-pos to indicate deferred-contextual mode. Always use jit-lock-after-change. Remove and restore font-lock-after-change-function. (turn-on-jit-lock, jit-lock-after-fontify-buffer) (jit-lock-after-unfontify-buffer): Remove. (jit-lock-stealth-fontify): Reset jit-lock-first-unfontify-pos to point-max rather than to nil. (jit-lock-after-change): Set the `fontified' text-prop to nil.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 20 Jun 2000 16:24:04 +0000
parents f37b857741b1
children dd9436a06050
line wrap: on
line diff
--- a/lisp/jit-lock.el	Tue Jun 20 15:24:16 2000 +0000
+++ b/lisp/jit-lock.el	Tue Jun 20 16:24:04 2000 +0000
@@ -41,15 +41,14 @@
 	 (unless ,modified
 	   (restore-buffer-modified-p nil)))))
   
-  (defmacro with-buffer-prepared-for-font-lock (&rest body)
+  (defmacro with-buffer-prepared-for-jit-lock (&rest body)
     "Execute BODY in current buffer, overriding several variables.
 Preserves the `buffer-modified-p' state of the current buffer."
     `(with-buffer-unmodified
       (let ((buffer-undo-list t)
 	    (inhibit-read-only t)
 	    (inhibit-point-motion-hooks t)
-	    before-change-functions
-	    after-change-functions
+	    (inhibit-modification-hooks t)
 	    deactivate-mark
 	    buffer-file-name
 	    buffer-file-truename)
@@ -60,7 +59,7 @@
 ;;; Customization.
 
 (defcustom jit-lock-chunk-size 500
-  "*Font-lock chunks of this many characters, or smaller."
+  "*Jit-lock chunks of this many characters, or smaller."
   :type 'integer
   :group 'jit-lock)
 
@@ -140,7 +139,8 @@
 
 
 (defvar jit-lock-first-unfontify-pos nil
-  "Consider text after this position as unfontified.")
+  "Consider text after this position as unfontified.
+If nil, contextual fontification is disabled.")
 (make-variable-buffer-local 'jit-lock-first-unfontify-pos)
 
 
@@ -156,7 +156,7 @@
 ;;;###autoload
 (defun jit-lock-mode (arg)
   "Toggle Just-in-time Lock mode.
-With arg, turn Just-in-time Lock mode on if and only if arg is positive.
+Turn Just-in-time Lock mode on if and only if ARG is non-nil.
 Enable it automatically by customizing group `font-lock'.
 
 When Just-in-time Lock mode is enabled, fontification is different in the
@@ -185,20 +185,10 @@
 If the system load rises above `jit-lock-stealth-load' percent, stealth
 fontification is suspended.  Stealth fontification intensity is controlled via
 the variable `jit-lock-stealth-nice'."
-  (interactive "P")
-  (setq jit-lock-mode (if arg
-			  (> (prefix-numeric-value arg) 0)
-			(not jit-lock-mode)))
-  (cond ((and jit-lock-mode
-	      (or (not (boundp 'font-lock-mode))
-		  (not font-lock-mode)))
-	 ;; If font-lock is not on, turn it on, with Just-in-time
-	 ;; Lock mode as support mode; font-lock will call us again.
-	 (let ((font-lock-support-mode 'jit-lock-mode))
-	   (font-lock-mode t)))
+  (setq jit-lock-mode arg)
+  (cond (;; Turn Just-in-time Lock mode on.
+	 jit-lock-mode
 
-	;; Turn Just-in-time Lock mode on.
-	(jit-lock-mode
 	 ;; Mark the buffer for refontification
 	 ;; (in case spurious `fontified' text-props were left around).
 	 (jit-lock-fontify-buffer)
@@ -215,8 +205,6 @@
 	   (set (make-local-variable 'font-lock-fontify-buffer-function)
 		'jit-lock-fontify-buffer))
 
-	 (setq jit-lock-first-unfontify-pos nil)
-	 
 	 ;; Install an idle timer for stealth fontification.
 	 (when (and jit-lock-stealth-time
 		    (null jit-lock-stealth-timer))
@@ -225,11 +213,16 @@
 				      jit-lock-stealth-time
 				      'jit-lock-stealth-fontify)))
 
-	 ;; Add a hook for deferred contectual fontification.
+	 ;; Initialize deferred contextual fontification if requested.
 	 (when (or (eq jit-lock-defer-contextually 'always)
 		   (and (not (eq jit-lock-defer-contextually 'never))
 			(null font-lock-keywords-only)))
-	   (add-hook 'after-change-functions 'jit-lock-after-change nil t))
+	   (setq jit-lock-first-unfontify-pos (point-max)))
+
+	 ;; Setup our after-change-function
+	 ;; and remove font-lock's (if any).
+	 (remove-hook 'after-change-functions 'font-lock-after-change-function t)
+	 (add-hook 'after-change-functions 'jit-lock-after-change nil t)
 	 
 	 ;; Install the fontification hook.
 	 (add-hook 'fontification-functions 'jit-lock-function))
@@ -247,22 +240,20 @@
 		jit-lock-saved-fontify-buffer-function)
 	   (setq jit-lock-saved-fontify-buffer-function nil))
 
-	 ;; Remove hooks.
+	 ;; Remove hooks (and restore font-lock's if necessary).
 	 (remove-hook 'after-change-functions 'jit-lock-after-change t)
+	 (when font-lock-mode
+	   (add-hook 'after-change-functions
+		     'font-lock-after-change-function nil t))
 	 (remove-hook 'fontification-functions 'jit-lock-function))))
 
 
-;;;###autoload
-(defun turn-on-jit-lock ()
-  "Unconditionally turn on Just-in-time Lock mode."
-  (jit-lock-mode 1))
-
 ;; This function is used to prevent font-lock-fontify-buffer from
 ;; fontifying eagerly the whole buffer.  This is important for
 ;; things like CWarn mode which adds/removes a few keywords and
 ;; does a refontify (which takes ages on large files).
 (defun jit-lock-fontify-buffer ()
-  (with-buffer-prepared-for-font-lock
+  (with-buffer-prepared-for-jit-lock
    (save-restriction
      (widen)
      (add-text-properties (point-min) (point-max) '(fontified nil)))))
@@ -280,7 +271,7 @@
   
 (defun jit-lock-function-1 (start)
   "Fontify current buffer starting at position START."
-  (with-buffer-prepared-for-font-lock
+  (with-buffer-prepared-for-jit-lock
    (save-excursion
      (save-restriction
        (widen)
@@ -325,21 +316,6 @@
 	 ;; Restore previous buffer settings.
 	 (set-syntax-table old-syntax-table))))))
 
-
-(defun jit-lock-after-fontify-buffer ()
-  "Mark the current buffer as fontified.
-Called from `font-lock-after-fontify-buffer."
-  (with-buffer-prepared-for-font-lock
-   (add-text-properties (point-min) (point-max) '(fontified t))))
-
-
-(defun jit-lock-after-unfontify-buffer ()
-  "Mark the current buffer as unfontified.
-Called from `font-lock-after-fontify-buffer."
-  (with-buffer-prepared-for-font-lock
-   (remove-text-properties (point-min) (point-max) '(fontified nil))))
-
-
 
 ;;; Stealth fontification.
 
@@ -366,7 +342,7 @@
 			     (- around (/ jit-lock-chunk-size 2)))))
 		     (prop
 		      ;; PREV is the start of a region of fontified
-		      ;; text containing AROUND.  Start fontfifying a
+		      ;; text containing AROUND.  Start fontifying a
 		      ;; chunk size before the end of the unfontified
 		      ;; region in front of that.
 		      (max (or (previous-single-property-change prev 'fontified)
@@ -424,10 +400,10 @@
 		    (widen)
 		    (when (and (>= jit-lock-first-unfontify-pos (point-min))
 			       (< jit-lock-first-unfontify-pos (point-max)))
-		      (with-buffer-prepared-for-font-lock
+		      (with-buffer-prepared-for-jit-lock
 		       (put-text-property jit-lock-first-unfontify-pos
 					  (point-max) 'fontified nil))
-		      (setq jit-lock-first-unfontify-pos nil))))
+		      (setq jit-lock-first-unfontify-pos (point-max)))))
 
 		;; In the following code, the `sit-for' calls cause a
 		;; redisplay, so it's required that the
@@ -462,16 +438,22 @@
 This function ensures that lines following the change will be refontified
 in case the syntax of those lines has changed.  Refontification
 will take place when text is fontified stealthily."
-  ;; Don't do much here---removing text properties is too slow for
-  ;; fast typers, giving them the impression of Emacs not being
-  ;; very responsive.
   (when jit-lock-mode
-    (setq jit-lock-first-unfontify-pos
-	  (if jit-lock-first-unfontify-pos
-	      (min jit-lock-first-unfontify-pos start)
-	    start))))
+    ;; It's important that the `fontified' property be set from the
+    ;; beginning of the line, else font-lock will properly change the
+    ;; text's face, but the display will have been done already and will
+    ;; be inconsistent with the buffer's content.
+    (setq start (line-beginning-position))
+    ;; Make sure we change at least one char (in case of deletions).
+    (setq end (min (max end (1+ start)) (point-max)))
+    ;; Request refontification.
+    (with-buffer-prepared-for-jit-lock
+     (put-text-property start end 'fontified nil))
+    ;; Mark the change for deferred contextual refontification.
+    (when jit-lock-first-unfontify-pos
+      (setq jit-lock-first-unfontify-pos
+	    (min jit-lock-first-unfontify-pos start)))))
   
-
 (provide 'jit-lock)
 
 ;; jit-lock.el ends here