(dired-diff, dired-backup-diff)
[bpt/emacs.git] / lisp / lazy-lock.el
index 6cd27ca..3547674 100644 (file)
@@ -1,12 +1,14 @@
-;;; lazy-lock.el --- Lazy demand-driven fontification for fast Font Lock mode.
+;;; lazy-lock.el --- lazy demand-driven fontification for fast Font Lock mode
 
-;; Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 2001
+;;   Free Software Foundation, Inc.
 
 ;; Author: Simon Marshall <simon@gnu.org>
+;; Maintainer: FSF
 ;; Keywords: faces files
 ;; Version: 2.11
 
-;;; This file is part of GNU Emacs.
+;; This file is part of GNU Emacs.
 
 ;; GNU Emacs is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
@@ -36,7 +38,7 @@
 ;; See also the fast-lock package.  (But don't use them at the same time!)
 
 ;; Installation:
-;; 
+;;
 ;; Put in your ~/.emacs:
 ;;
 ;; (setq font-lock-support-mode 'lazy-lock-mode)
 
 (require 'font-lock)
 
-;; Make sure lazy-lock.el is supported.
-(if (if (save-match-data (string-match "Lucid\\|XEmacs" (emacs-version)))
-       t
-      (and (= emacs-major-version 19) (< emacs-minor-version 30)))
-    (error "`lazy-lock' was written for Emacs 19.30 or later"))
-
 (eval-when-compile
-  ;;
-  ;; We don't do this at the top-level as idle timers are not necessarily used.
-  (require 'timer)
-  ;; We don't do this at the top-level as we only use non-autoloaded macros.
-  (require 'cl)
-  ;;
-  ;; We use this to preserve or protect things when modifying text properties.
-  (defmacro save-buffer-state (varlist &rest body)
-    "Bind variables according to VARLIST and eval BODY restoring buffer state."
-    (` (let* ((,@ (append varlist
-                  '((modified (buffer-modified-p)) (buffer-undo-list t)
-                    (inhibit-read-only t) (inhibit-point-motion-hooks t)
-                    before-change-functions after-change-functions
-                    deactivate-mark buffer-file-name buffer-file-truename))))
-        (,@ body)
-        (when (and (not modified) (buffer-modified-p))
-          (set-buffer-modified-p nil)))))
-  (put 'save-buffer-state 'lisp-indent-function 1)
-  ;;
-  ;; We use this for clarity and speed.  Naughty but nice.
-  (defmacro do-while (test &rest body)
-    "(do-while TEST BODY...): eval BODY... and repeat if TEST yields non-nil.
+ ;; We don't do this at the top-level as we only use non-autoloaded macros.
+ (require 'cl)
+ ;;
+ ;; We use this to preserve or protect things when modifying text properties.
+ (defmacro save-buffer-state (varlist &rest body)
+   "Bind variables according to VARLIST and eval BODY restoring buffer state."
+   `(let* (,@(append varlist
+                  '((modified (buffer-modified-p))
+                    (buffer-undo-list t)
+                    (inhibit-read-only t)
+                    (inhibit-point-motion-hooks t)
+                    (inhibit-modification-hooks t)
+                    deactivate-mark
+                    buffer-file-name
+                    buffer-file-truename)))
+     ,@body
+     (when (and (not modified) (buffer-modified-p))
+       (restore-buffer-modified-p nil))))
+ (put 'save-buffer-state 'lisp-indent-function 1)
+ ;;
+ ;; We use this for clarity and speed.  Naughty but nice.
+ (defmacro do-while (test &rest body)
+   "(do-while TEST BODY...): eval BODY... and repeat if TEST yields non-nil.
 The order of execution is thus BODY, TEST, BODY, TEST and so on
 until TEST returns nil."
-    (` (while (progn (,@ body) (, test)))))
-  (put 'do-while 'lisp-indent-function (get 'while 'lisp-indent-function))
-  ;;
-  ;; We use this for clarity and speed.  Borrowed from a future Emacs.
-  (or (fboundp 'with-current-buffer)
-      (defmacro with-current-buffer (buffer &rest body)
-       "Execute the forms in BODY with BUFFER as the current buffer.
-The value returned is the value of the last form in BODY."
-       (` (save-excursion (set-buffer (, buffer)) (,@ body)))))
-  (put 'with-current-buffer 'lisp-indent-function 1)
-  ;;
-  ;; We use this for compatibility with a future Emacs.
-  (or (fboundp 'with-temp-message)
-      (defmacro with-temp-message (message &rest body)
-       (` (let ((temp-message (, message)) current-message)
-            (unwind-protect
-                (progn
-                  (when temp-message
-                    (setq current-message (current-message))
-                    (message temp-message))
-                  (,@ body))
-              (when temp-message
-                (message current-message)))))))
-  ;;
-  ;; We use this for compatibility with a future Emacs.
-  (or (fboundp 'defcustom)
-      (defmacro defcustom (symbol value doc &rest args) 
-       (` (defvar (, symbol) (, value) (, doc))))))
-
-;(defun lazy-lock-submit-bug-report ()
-;  "Submit via mail a bug report on lazy-lock.el."
-;  (interactive)
-;  (let ((reporter-prompt-for-summary-p t))
-;    (reporter-submit-bug-report "simon@gnu.ai.mit.edu" "lazy-lock 2.11"
-;     '(lazy-lock-minimum-size lazy-lock-defer-on-the-fly
-;       lazy-lock-defer-on-scrolling lazy-lock-defer-contextually
-;       lazy-lock-defer-time lazy-lock-stealth-time
-;       lazy-lock-stealth-load lazy-lock-stealth-nice lazy-lock-stealth-lines
-;       lazy-lock-stealth-verbose)
-;     nil nil
-;     (concat "Hi Si.,
-;
-;I want to report a bug.  I've read the `Bugs' section of `Info' on Emacs, so I
-;know how to make a clear and unambiguous report.  To reproduce the bug:
-;
-;Start a fresh editor via `" invocation-name " -no-init-file -no-site-file'.
-;In the `*scratch*' buffer, evaluate:"))))
+   `(while (progn ,@body ,test)))
+ (put 'do-while 'lisp-indent-function (get 'while 'lisp-indent-function)))
 
 (defvar lazy-lock-mode nil)                    ; Whether we are turned on.
 (defvar lazy-lock-buffers nil)                 ; For deferral.
@@ -497,7 +449,7 @@ To reduce machine load during stealth fontification, at the cost of stealth
 taking longer to fontify, you could increase the value of this variable.
 See also `lazy-lock-stealth-load'."
   :type '(choice (const :tag "never" nil)
-                (number :tag "seconds"))         
+                (number :tag "seconds"))
   :group 'lazy-lock)
 
 (defcustom lazy-lock-stealth-verbose
@@ -517,6 +469,10 @@ automatically in your `~/.emacs' by:
 
  (setq font-lock-support-mode 'lazy-lock-mode)
 
+For a newer font-lock support mode with similar functionality, see
+`jit-lock-mode'.  Eventually, Lazy Lock mode will be deprecated in
+JIT Lock's favor.
+
 When Lazy Lock mode is enabled, fontification can be lazy in a number of ways:
 
 - Demand-driven buffer fontification if `lazy-lock-minimum-size' is non-nil.
@@ -626,7 +582,6 @@ verbosity is controlled via the variable `lazy-lock-stealth-verbose'."
   ;;
   ;; Add hook if lazy-lock.el is fontifying on scrolling or is deferring.
   (when (or fontifying defer-change defer-scroll defer-context)
-    (make-local-hook 'window-scroll-functions)
     (add-hook 'window-scroll-functions (if defer-scroll
                                           'lazy-lock-defer-after-scroll
                                         'lazy-lock-fontify-after-scroll)
@@ -634,7 +589,6 @@ verbosity is controlled via the variable `lazy-lock-stealth-verbose'."
   ;;
   ;; Add hook if lazy-lock.el is fontifying and is not deferring changes.
   (when (and fontifying (not defer-change) (not defer-context))
-    (make-local-hook 'before-change-functions)
     (add-hook 'before-change-functions 'lazy-lock-arrange-before-change nil t))
   ;;
   ;; Replace Font Lock mode hook.
@@ -651,9 +605,7 @@ verbosity is controlled via the variable `lazy-lock-stealth-verbose'."
            nil t)
   ;;
   ;; Add package-specific hook.
-  (make-local-hook 'outline-view-change-hook)
   (add-hook 'outline-view-change-hook 'lazy-lock-fontify-after-visage nil t)
-  (make-local-hook 'hs-hide-hook)
   (add-hook 'hs-hide-hook 'lazy-lock-fontify-after-visage nil t))
 
 (defun lazy-lock-install-timers (dtime stime)
@@ -897,6 +849,8 @@ verbosity is controlled via the variable `lazy-lock-stealth-verbose'."
                                 (lazy-lock-percent-fontified) (buffer-name))
                      (message "Fontifying stealthily...")
                      (setq message t)))
+                 ;; Current buffer may have changed during `sit-for'.
+                 (set-buffer (car buffers))
                  (lazy-lock-fontify-chunk)
                  (setq continue (sit-for (or lazy-lock-stealth-nice 0)))))))
          (setq buffers (cdr buffers)))))))
@@ -933,30 +887,32 @@ verbosity is controlled via the variable `lazy-lock-stealth-verbose'."
 ;; should use this function.  For an example, see ps-print.el.
 (defun lazy-lock-fontify-region (beg end)
   ;; Fontify between BEG and END, where necessary, in the current buffer.
-  (when (setq beg (text-property-any beg end 'lazy-lock nil))
-    (save-excursion
-      (save-match-data
-       (save-buffer-state
-           ;; Ensure syntactic fontification is always correct.
-           (font-lock-beginning-of-syntax-function next)
-         ;; Find successive unfontified regions between BEG and END.
-         (condition-case data
-             (do-while beg
-               (setq next (or (text-property-any beg end 'lazy-lock t) end))
-               ;; Make sure the region end points are at beginning of line.
-               (goto-char beg)
-               (unless (bolp)
-                 (beginning-of-line)
-                 (setq beg (point)))
-               (goto-char next)
-               (unless (bolp)
-                 (forward-line)
-                 (setq next (point)))
-               ;; Fontify the region, then flag it as fontified.
-               (font-lock-fontify-region beg next)
-               (add-text-properties beg next '(lazy-lock t))
-               (setq beg (text-property-any next end 'lazy-lock nil)))
-           ((error quit) (message "Fontifying region...%s" data))))))))
+  (save-restriction
+    (widen)
+    (when (setq beg (text-property-any beg end 'lazy-lock nil))
+      (save-excursion
+       (save-match-data
+         (save-buffer-state
+          ;; Ensure syntactic fontification is always correct.
+          (font-lock-beginning-of-syntax-function next)
+          ;; Find successive unfontified regions between BEG and END.
+          (condition-case data
+              (do-while beg
+                        (setq next (or (text-property-any beg end 'lazy-lock t) end))
+         ;; Make sure the region end points are at beginning of line.
+                        (goto-char beg)
+                        (unless (bolp)
+                          (beginning-of-line)
+                          (setq beg (point)))
+                        (goto-char next)
+                        (unless (bolp)
+                          (forward-line)
+                          (setq next (point)))
+                    ;; Fontify the region, then flag it as fontified.
+                        (font-lock-fontify-region beg next)
+                        (add-text-properties beg next '(lazy-lock t))
+                        (setq beg (text-property-any next end 'lazy-lock nil)))
+            ((error quit) (message "Fontifying region...%s" data)))))))))
 
 (defun lazy-lock-fontify-chunk ()
   ;; Fontify the nearest chunk, for stealth, in the current buffer.
@@ -1030,65 +986,6 @@ verbosity is controlled via the variable `lazy-lock-stealth-verbose'."
 \f
 ;; Version dependent workarounds and fixes.
 
-(when (if (save-match-data (string-match "Lucid\\|XEmacs" (emacs-version)))
-         nil
-       (and (= emacs-major-version 19) (= emacs-minor-version 30)))
-  ;;
-  ;; We use `post-command-idle-hook' for deferral and stealth.  Oh Lordy.
-  (defun lazy-lock-install-timers (foo bar)
-    (add-hook 'post-command-idle-hook 'lazy-lock-fontify-post-command t)
-    (add-hook 'post-command-idle-hook 'lazy-lock-fontify-post-idle t)
-    (add-to-list 'lazy-lock-install (current-buffer))
-    (add-hook 'post-command-hook 'lazy-lock-fontify-after-install))
-  (defun lazy-lock-fontify-post-command ()
-    (and lazy-lock-buffers (not executing-kbd-macro)
-        (progn
-          (and deactivate-mark (deactivate-mark))
-          (sit-for
-           (or (cdr-safe lazy-lock-defer-time) lazy-lock-defer-time 0)))
-        (lazy-lock-fontify-after-defer)))
-  (defun lazy-lock-fontify-post-idle ()
-    (and lazy-lock-stealth-time (not executing-kbd-macro)
-        (not (window-minibuffer-p (selected-window)))
-        (progn
-          (and deactivate-mark (deactivate-mark))
-          (sit-for lazy-lock-stealth-time))
-        (lazy-lock-fontify-after-idle)))
-  ;;
-  ;; Simulate running of `window-scroll-functions' in `set-window-buffer'.
-  (defvar lazy-lock-install nil)
-  (defun lazy-lock-fontify-after-install ()
-    (remove-hook 'post-command-hook 'lazy-lock-fontify-after-install)
-    (while lazy-lock-install
-      (mapcar 'lazy-lock-fontify-conservatively
-             (get-buffer-window-list (pop lazy-lock-install) 'nomini t)))))
-
-(when (if (save-match-data (string-match "Lucid\\|XEmacs" (emacs-version)))
-         nil
-       (or (and (= emacs-major-version 20) (< emacs-minor-version 4))
-           (= emacs-major-version 19)))
-  ;;
-  ;; We use `vertical-motion' rather than `window-end' UPDATE arg.
-  (defun lazy-lock-fontify-after-scroll (window window-start)
-    ;; Called from `window-scroll-functions'.
-    ;; Fontify WINDOW from WINDOW-START following the scroll.  We cannot use
-    ;; `window-end' so we work out what it would be via `vertical-motion'.
-    (let ((inhibit-point-motion-hooks t))
-      (save-excursion
-       (goto-char window-start)
-       (vertical-motion (window-height window) window)
-       (lazy-lock-fontify-region window-start (point))))
-    (set-window-redisplay-end-trigger window nil))
-  (defun lazy-lock-fontify-after-trigger (window trigger-point)
-    ;; Called from `redisplay-end-trigger-functions'.
-    ;; Fontify WINDOW from TRIGGER-POINT following the redisplay.  We cannot
-    ;; use `window-end' so we work out what it would be via `vertical-motion'.
-    (let ((inhibit-point-motion-hooks t))
-      (save-excursion
-       (goto-char (window-start window))
-       (vertical-motion (window-height window) window)
-       (lazy-lock-fontify-region trigger-point (point))))))
-
 (when (consp lazy-lock-defer-time)
   ;;
   ;; In 2.06.04 and below, `lazy-lock-defer-time' could specify modes and time.
@@ -1141,41 +1038,6 @@ verbosity is controlled via the variable `lazy-lock-stealth-verbose'."
     (princ " or change your ~/.emacs now."))
   (setq lazy-lock-defer-on-scrolling lazy-lock-defer-driven))
 \f
-;; Possibly absent.
-
-(unless (boundp 'font-lock-inhibit-thing-lock)
-  ;; Font Lock mode uses this to direct Lazy and Fast Lock modes to stay off.
-  (defvar font-lock-inhibit-thing-lock nil
-    "List of Font Lock mode related modes that should not be turned on."))
-
-(unless (fboundp 'font-lock-value-in-major-mode)
-  (defun font-lock-value-in-major-mode (alist)
-    ;; Return value in ALIST for `major-mode'.
-    (if (consp alist)
-       (cdr (or (assq major-mode alist) (assq t alist)))
-      alist)))
-
-(unless (fboundp 'buffer-live-p)
-  ;; We use this to check that a buffer we have to fontify still exists.
-  (defun buffer-live-p (object)
-    "Return non-nil if OBJECT is an editor buffer that has not been deleted."
-    (and (bufferp object) (buffer-name object))))
-
-(unless (fboundp 'get-buffer-window-list)
-  ;; We use this to get all windows showing a buffer we have to fontify.
-  (defun get-buffer-window-list (buffer &optional minibuf frame)
-    "Return windows currently displaying BUFFER, or nil if none."
-    (let ((buffer (if (bufferp buffer) buffer (get-buffer buffer))) windows)
-      (walk-windows (function (lambda (window)
-                               (when (eq (window-buffer window) buffer)
-                                 (push window windows))))
-                   minibuf frame)
-      windows)))
-
-(unless (fboundp 'current-message)
-  (defun current-message ()
-    ""))
-\f
 ;; Install ourselves:
 
 (add-hook 'window-size-change-functions 'lazy-lock-fontify-after-resize)
@@ -1188,4 +1050,5 @@ verbosity is controlled via the variable `lazy-lock-stealth-verbose'."
 
 (provide 'lazy-lock)
 
+;;; arch-tag: c1776846-f046-4a45-9684-54b951b12fc9
 ;;; lazy-lock.el ends here