Mercurial > hg > xemacs-beta
comparison lisp/packages/fast-lock.el @ 2:ac2d302a0011 r19-15b2
Import from CVS: tag r19-15b2
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:46:35 +0200 |
parents | 376386a54a3c |
children | 8fc7fe29b841 |
comparison
equal
deleted
inserted
replaced
1:c0c6a60d29db | 2:ac2d302a0011 |
---|---|
1 ;;; fast-lock.el --- Automagic text properties caching for fast Font Lock mode. | 1 ;;; fast-lock.el --- Automagic text properties caching for fast Font Lock mode. |
2 | 2 |
3 ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc. | 3 ;; Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc. |
4 | 4 |
5 ;; Author: Simon Marshall <simon@gnu.ai.mit.edu> | 5 ;; Author: Simon Marshall <simon@gnu.ai.mit.edu> |
6 ;; Keywords: faces files | 6 ;; Keywords: faces files |
7 ;; Version: 3.08 | 7 ;; Version: 3.10.01 |
8 | 8 |
9 ;; This file is part of XEmacs. | 9 ;; This file is part of XEmacs. |
10 ;; | 10 ;; |
11 ;; XEmacs is free software; you can redistribute it and/or modify | 11 ;; XEmacs is free software; you can redistribute it and/or modify |
12 ;; it under the terms of the GNU General Public License as published by | 12 ;; it under the terms of the GNU General Public License as published by |
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | 17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
19 ;; GNU General Public License for more details. | 19 ;; GNU General Public License for more details. |
20 ;; | 20 ;; |
21 ;; You should have received a copy of the GNU General Public License | 21 ;; You should have received a copy of the GNU General Public License |
22 ;; along with XEmacs; if not, write to the Free Software | 22 ;; along with XEmacs; see the file COPYING. If not, write to the |
23 ;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
24 | 24 ;; Boston, MA 02111-1307, USA. |
25 ;;; Synched up with: FSF 19.30. | 25 |
26 ;;; Synched up with: FSF 19.34. | |
26 | 27 |
27 ;;; Commentary: | 28 ;;; Commentary: |
28 | 29 |
29 ;; Purpose: | 30 ;; Purpose: |
30 ;; | 31 ;; |
36 | 37 |
37 ;; Installation: | 38 ;; Installation: |
38 ;; | 39 ;; |
39 ;; Put in your ~/.emacs: | 40 ;; Put in your ~/.emacs: |
40 ;; | 41 ;; |
41 ;; (add-hook 'font-lock-mode-hook 'turn-on-fast-lock) | 42 ;; (setq font-lock-support-mode 'fast-lock-mode) |
42 ;; | 43 ;; |
43 ;; Start up a new Emacs and use font-lock as usual (except that you can use the | 44 ;; Start up a new Emacs and use font-lock as usual (except that you can use the |
44 ;; so-called "gaudier" fontification regexps on big files without frustration). | 45 ;; so-called "gaudier" fontification regexps on big files without frustration). |
45 ;; | 46 ;; |
46 ;; When you visit a file (which has `font-lock-mode' enabled) that has a | 47 ;; When you visit a file (which has `font-lock-mode' enabled) that has a |
63 ;; M-x fast-lock-submit-bug-report RET | 64 ;; M-x fast-lock-submit-bug-report RET |
64 | 65 |
65 ;; History: | 66 ;; History: |
66 ;; | 67 ;; |
67 ;; 0.02--1.00: | 68 ;; 0.02--1.00: |
68 ;; - Changed name from turbo-prop to fast-lock. Automagic for font-lock only. | 69 ;; - Changed name from turbo-prop to fast-lock. Automagic for font-lock only |
69 ;; - Made `fast-lock-mode' a minor mode, like G. Dinesh Dutt's fss-mode. | 70 ;; - Made `fast-lock-mode' a minor mode, like G. Dinesh Dutt's fss-mode |
70 ;; 1.00--1.01: | 71 ;; 1.00--1.01: |
71 ;; - Turn on `fast-lock-mode' only if `buffer-file-name' or `interactive-p'. | 72 ;; - Turn on `fast-lock-mode' only if `buffer-file-name' or `interactive-p' |
72 ;; - Made `fast-lock-file-name' use `buffer-name' if `buffer-file-name' is nil. | 73 ;; - Made `fast-lock-file-name' use `buffer-name' if `buffer-file-name' is nil |
73 ;; - Moved save-all conditions to `fast-lock-save-cache'. | 74 ;; - Moved save-all conditions to `fast-lock-save-cache' |
74 ;; - Added `fast-lock-save-text-properties' to `kill-buffer-hook'. | 75 ;; - Added `fast-lock-save-text-properties' to `kill-buffer-hook' |
75 ;; 1.01--2.00: complete rewrite---not worth the space to document. | 76 ;; 1.01--2.00: complete rewrite---not worth the space to document |
76 ;; - Changed structure of text properties cache and threw out file mod checks. | 77 ;; - Changed structure of text properties cache and threw out file mod checks |
77 ;; 2.00--2.01: | 78 ;; 2.00--2.01: |
78 ;; - Made `condition-case' forms understand `quit'. | 79 ;; - Made `condition-case' forms understand `quit'. |
79 ;; - Made `fast-lock' require `font-lock'. | 80 ;; - Made `fast-lock' require `font-lock' |
80 ;; - Made `fast-lock-cache-name' chase links (from Ben Liblit). | 81 ;; - Made `fast-lock-cache-name' chase links (from Ben Liblit) |
81 ;; 2.01--3.00: | 82 ;; 2.01--3.00: |
82 ;; - Changed structure of cache to include `font-lock-keywords' (from rms). | 83 ;; - Changed structure of cache to include `font-lock-keywords' (from rms) |
83 ;; - Changed `fast-lock-cache-mechanisms' to `fast-lock-cache-directories'. | 84 ;; - Changed `fast-lock-cache-mechanisms' to `fast-lock-cache-directories' |
84 ;; - Removed `fast-lock-read-others'. | 85 ;; - Removed `fast-lock-read-others' |
85 ;; - Made `fast-lock-read-cache' ignore cache owner. | 86 ;; - Made `fast-lock-read-cache' ignore cache owner |
86 ;; - Made `fast-lock-save-cache-external' create cache directory. | 87 ;; - Made `fast-lock-save-cache-external' create cache directory |
87 ;; - Made `fast-lock-save-cache-external' save `font-lock-keywords'. | 88 ;; - Made `fast-lock-save-cache-external' save `font-lock-keywords' |
88 ;; - Made `fast-lock-cache-data' check `font-lock-keywords'. | 89 ;; - Made `fast-lock-cache-data' check `font-lock-keywords' |
89 ;; 3.00--3.01: incorporated port of 2.00 to Lucid, made by Barry Warsaw. | 90 ;; 3.00--3.01: incorporated port of 2.00 to Lucid, made by Barry Warsaw |
90 ;; - Package now provides itself. | 91 ;; - Package now provides itself |
91 ;; - Lucid: Use `font-lock-any-extents-p' for `font-lock-any-properties-p'. | 92 ;; - Lucid: Use `font-lock-any-extents-p' for `font-lock-any-properties-p' |
92 ;; - Lucid: Use `list-faces' for `face-list'. | 93 ;; - Lucid: Use `list-faces' for `face-list' |
93 ;; - Lucid: Added `set-text-properties'. | 94 ;; - Lucid: Added `set-text-properties' |
94 ;; - Lucid: Made `turn-on-fast-lock' pass 1 not t to `fast-lock-mode'. | 95 ;; - Lucid: Made `turn-on-fast-lock' pass 1 not t to `fast-lock-mode' |
95 ;; - Removed test for `fast-lock-mode' from `fast-lock-read-cache'. | 96 ;; - Removed test for `fast-lock-mode' from `fast-lock-read-cache' |
96 ;; - Lucid: Added Lucid-specific `fast-lock-get-face-properties'. | 97 ;; - Lucid: Added Lucid-specific `fast-lock-get-face-properties' |
97 ;; 3.01--3.02: now works with Lucid Emacs, thanks to Barry Warsaw. | 98 ;; 3.01--3.02: now works with Lucid Emacs, thanks to Barry Warsaw |
98 ;; - Made `fast-lock-cache-name' map ":" to ";" for OS/2 (from Serganova Vera). | 99 ;; - Made `fast-lock-cache-name' map ":" to ";" for OS/2 (from Serganova Vera) |
99 ;; - Made `fast-lock-cache-name' use abbreviated file name (from Barry Warsaw). | 100 ;; - Made `fast-lock-cache-name' use abbreviated file name (from Barry Warsaw) |
100 ;; - Lucid: Separated handlers for `error' and `quit' for `condition-case'. | 101 ;; - Lucid: Separated handlers for `error' and `quit' for `condition-case' |
101 ;; 3.02--3.03: | 102 ;; 3.02--3.03: |
102 ;; - Changed `fast-lock-save-cache-external' to `fast-lock-save-cache-data'. | 103 ;; - Changed `fast-lock-save-cache-external' to `fast-lock-save-cache-data' |
103 ;; - Lucid: Added Lucid-specific `fast-lock-set-face-properties'. | 104 ;; - Lucid: Added Lucid-specific `fast-lock-set-face-properties' |
104 ;; 3.03--3.04: | 105 ;; 3.03--3.04: |
105 ;; - Corrected `subrp' test of Lucid code. | 106 ;; - Corrected `subrp' test of Lucid code |
106 ;; - Replaced `font-lock-any-properties-p' with `text-property-not-all'. | 107 ;; - Replaced `font-lock-any-properties-p' with `text-property-not-all' |
107 ;; - Lucid: Made `fast-lock-set-face-properties' put `text-prop' on extents. | 108 ;; - Lucid: Made `fast-lock-set-face-properties' put `text-prop' on extents |
108 ;; - Made `fast-lock-cache-directories' a regexp alist (from Colin Rafferty). | 109 ;; - Made `fast-lock-cache-directories' a regexp alist (from Colin Rafferty) |
109 ;; - Made `fast-lock-cache-directory' to return a usable cache file directory. | 110 ;; - Made `fast-lock-cache-directory' to return a usable cache file directory |
110 ;; 3.04--3.05: | 111 ;; 3.04--3.05: |
111 ;; - Lucid: Fix for XEmacs 19.11 `text-property-not-all'. | 112 ;; - Lucid: Fix for XEmacs 19.11 `text-property-not-all' |
112 ;; - Replaced `subrp' test of Lucid code with `emacs-version' `string-match'. | 113 ;; - Replaced `subrp' test of Lucid code with `emacs-version' `string-match' |
113 ;; - Made `byte-compile-warnings' omit `unresolved' on compilation. | 114 ;; - Made `byte-compile-warnings' omit `unresolved' on compilation |
114 ;; - Made `fast-lock-save-cache-data' use a buffer (from Rick Sladkey). | 115 ;; - Made `fast-lock-save-cache-data' use a buffer (from Rick Sladkey) |
115 ;; - Reverted to old `fast-lock-get-face-properties' (from Rick Sladkey). | 116 ;; - Reverted to old `fast-lock-get-face-properties' (from Rick Sladkey) |
116 ;; 3.05--3.06: incorporated hack of 3.03, made by Jonathan Stigelman (Stig). | 117 ;; 3.05--3.06: incorporated hack of 3.03, made by Jonathan Stigelman (Stig) |
117 ;; - Reverted to 3.04 version of `fast-lock-get-face-properties'. | 118 ;; - Reverted to 3.04 version of `fast-lock-get-face-properties' |
118 ;; - XEmacs: Removed `list-faces' `defalias'. | 119 ;; - XEmacs: Removed `list-faces' `defalias' |
119 ;; - Made `fast-lock-mode' and `turn-on-fast-lock' succeed `autoload' cookies. | 120 ;; - Made `fast-lock-mode' and `turn-on-fast-lock' succeed `autoload' cookies |
120 ;; - Added `lazy-lock-submit-bug-report'. | 121 ;; - Added `fast-lock-submit-bug-report' |
121 ;; - Renamed `fast-lock-save-size' to `fast-lock-minimum-size'. | 122 ;; - Renamed `fast-lock-save-size' to `fast-lock-minimum-size' |
122 ;; - Made `fast-lock-save-cache' output a message if no save ever attempted. | 123 ;; - Made `fast-lock-save-cache' output a message if no save ever attempted |
123 ;; - Made `fast-lock-save-cache-data' output a message if save attempted. | 124 ;; - Made `fast-lock-save-cache-data' output a message if save attempted |
124 ;; - Made `fast-lock-cache-data' output a message if load attempted. | 125 ;; - Made `fast-lock-cache-data' output a message if load attempted |
125 ;; - Made `fast-lock-save-cache-data' do `condition-case' not `unwind-protect'. | 126 ;; - Made `fast-lock-save-cache-data' do `condition-case' not `unwind-protect' |
126 ;; - Made `fast-lock-save-cache' and `fast-lock-read-cache' return nothing. | 127 ;; - Made `fast-lock-save-cache' and `fast-lock-read-cache' return nothing |
127 ;; - Made `fast-lock-save-cache' check `buffer-modified-p' (Stig). | 128 ;; - Made `fast-lock-save-cache' check `buffer-modified-p' (Stig) |
128 ;; - Added `fast-lock-save-events'. | 129 ;; - Added `fast-lock-save-events' |
129 ;; - Added `fast-lock-after-save-hook' to `after-save-hook' (Stig). | 130 ;; - Added `fast-lock-after-save-hook' to `after-save-hook' (Stig) |
130 ;; - Added `fast-lock-kill-buffer-hook' to `kill-buffer-hook'. | 131 ;; - Added `fast-lock-kill-buffer-hook' to `kill-buffer-hook' |
131 ;; - Changed `fast-lock-save-caches' to `fast-lock-kill-emacs-hook'. | 132 ;; - Changed `fast-lock-save-caches' to `fast-lock-kill-emacs-hook' |
132 ;; - Added `fast-lock-kill-emacs-hook' to `kill-emacs-hook'. | 133 ;; - Added `fast-lock-kill-emacs-hook' to `kill-emacs-hook' |
133 ;; - Made `fast-lock-save-cache' check `verify-visited-file-modtime' (Stig). | 134 ;; - Made `fast-lock-save-cache' check `verify-visited-file-modtime' (Stig) |
134 ;; - Made `visited-file-modtime' be the basis of the timestamp (Stig). | 135 ;; - Made `visited-file-modtime' be the basis of the timestamp (Stig) |
135 ;; - Made `fast-lock-save-cache-1' and `fast-lock-cache-data' use/reformat it. | 136 ;; - Made `fast-lock-save-cache-1' and `fast-lock-cache-data' use/reformat it |
136 ;; - Added `fast-lock-cache-filename' to keep track of the cache file name. | 137 ;; - Added `fast-lock-cache-filename' to keep track of the cache file name |
137 ;; - Added `fast-lock-after-fontify-buffer'. | 138 ;; - Added `fast-lock-after-fontify-buffer' |
138 ;; - Added `fast-lock-save-faces' list of faces to save (idea from Stig/Tibor). | 139 ;; - Added `fast-lock-save-faces' list of faces to save (idea from Stig/Tibor) |
139 ;; - Made `fast-lock-get-face-properties' functions use it. | 140 ;; - Made `fast-lock-get-face-properties' functions use it |
140 ;; - XEmacs: Made `fast-lock-set-face-properties' do extents the Font Lock way. | 141 ;; - XEmacs: Made `fast-lock-set-face-properties' do extents the Font Lock way |
141 ;; - XEmacs: Removed fix for `text-property-not-all' (19.11 support dropped). | 142 ;; - XEmacs: Removed fix for `text-property-not-all' (19.11 support dropped) |
142 ;; - Made `fast-lock-mode' ensure `font-lock-mode' is on. | 143 ;; - Made `fast-lock-mode' ensure `font-lock-mode' is on |
143 ;; - Made `fast-lock-save-cache' do `cdr-safe' not `cdr' (from Dave Foster). | 144 ;; - Made `fast-lock-save-cache' do `cdr-safe' not `cdr' (from Dave Foster) |
144 ;; - Made `fast-lock-save-cache' do `set-buffer' first (from Dave Foster). | 145 ;; - Made `fast-lock-save-cache' do `set-buffer' first (from Dave Foster) |
145 ;; - Made `fast-lock-save-cache' loop until saved or quit (from Georg Nikodym). | 146 ;; - Made `fast-lock-save-cache' loop until saved or quit (from Georg Nikodym) |
146 ;; - Made `fast-lock-cache-data' check `buffer-modified-p'. | 147 ;; - Made `fast-lock-cache-data' check `buffer-modified-p' |
147 ;; - Made `fast-lock-cache-data' do `font-lock-compile-keywords' if necessary. | 148 ;; - Made `fast-lock-cache-data' do `font-lock-compile-keywords' if necessary |
148 ;; - XEmacs: Made `font-lock-compile-keywords' `defalias'. | 149 ;; - XEmacs: Made `font-lock-compile-keywords' `defalias' |
149 ;; 3.06--3.07: | 150 ;; 3.06--3.07: |
150 ;; - XEmacs: Add `fast-lock-after-fontify-buffer' to the Font Lock hook. | 151 ;; - XEmacs: Add `fast-lock-after-fontify-buffer' to the Font Lock hook |
151 ;; - Made `fast-lock-cache-name' explain the use of `directory-abbrev-alist'. | 152 ;; - Made `fast-lock-cache-name' explain the use of `directory-abbrev-alist' |
152 ;; - Made `fast-lock-mode' use `buffer-file-truename' not `buffer-file-name'. | 153 ;; - Made `fast-lock-mode' use `buffer-file-truename' not `buffer-file-name' |
153 ;; 3.07--3.08: | 154 ;; 3.07--3.08: |
154 ;; - Made `fast-lock-read-cache' set `fast-lock-cache-filename'. | 155 ;; - Made `fast-lock-read-cache' set `fast-lock-cache-filename' |
156 ;; 3.08--3.09: | |
157 ;; - Made `fast-lock-save-cache' cope if `fast-lock-minimum-size' is an a list | |
158 ;; - Made `fast-lock-mode' respect the value of `font-lock-inhibit-thing-lock' | |
159 ;; - Added `fast-lock-after-unfontify-buffer' | |
160 ;; 3.09--3.10: | |
161 ;; - Rewrite for Common Lisp macros | |
162 ;; - Made fast-lock.el barf on a crap 8+3 pseudo-OS (Eli Zaretskii help) | |
163 ;; - XEmacs: Made `add-minor-mode' succeed `autoload' cookie | |
164 ;; - XEmacs: Made `fast-lock-save-faces' default to `font-lock-face-list' | |
165 ;; - Made `fast-lock-save-cache' use `font-lock-value-in-major-mode' | |
166 ;; - Wrap with `save-buffer-state' (Ray Van Tassle report) | |
167 ;; - Made `fast-lock-mode' wrap `font-lock-support-mode' | |
168 ;; 3.10--3.11: | |
155 | 169 |
156 (require 'font-lock) | 170 (require 'font-lock) |
157 | 171 |
172 ;; Make sure fast-lock.el is supported. | |
173 (if (and (eq system-type 'ms-dos) (not (msdos-long-file-names))) | |
174 (error "`fast-lock' was written for long file name systems")) | |
175 | |
158 (eval-when-compile | 176 (eval-when-compile |
159 ;; Shut Emacs' byte-compiler up (cf. stop me getting mail from users). | 177 ;; |
160 (setq byte-compile-warnings '(free-vars callargs redefine))) | 178 ;; We don't do this at the top-level as we only use non-autoloaded macros. |
179 (require 'cl) | |
180 ;; | |
181 ;; I prefer lazy code---and lazy mode. | |
182 (setq byte-compile-dynamic t byte-compile-dynamic-docstrings t) | |
183 ;; But, we make sure that the code is as zippy as can be. | |
184 (setq byte-optimize t) | |
185 ;; | |
186 ;; We use this to preserve or protect things when modifying text properties. | |
187 (defmacro save-buffer-state (varlist &rest body) | |
188 "Bind variables according to VARLIST and eval BODY restoring buffer state." | |
189 (` (let* ((,@ (append varlist | |
190 '((modified (buffer-modified-p)) | |
191 (inhibit-read-only t) (buffer-undo-list t) | |
192 before-change-functions after-change-functions | |
193 deactivate-mark buffer-file-name buffer-file-truename)))) | |
194 (,@ body) | |
195 (when (and (not modified) (buffer-modified-p)) | |
196 (set-buffer-modified-p nil))))) | |
197 (put 'save-buffer-state 'lisp-indent-function 1)) | |
161 | 198 |
162 (defun fast-lock-submit-bug-report () | 199 (defun fast-lock-submit-bug-report () |
163 "Submit via mail a bug report on fast-lock.el." | 200 "Submit via mail a bug report on fast-lock.el." |
164 (interactive) | 201 (interactive) |
165 (let ((reporter-prompt-for-summary-p t)) | 202 (let ((reporter-prompt-for-summary-p t)) |
166 (reporter-submit-bug-report "simon@gnu.ai.mit.edu" "fast-lock 3.08" | 203 (reporter-submit-bug-report "simon@gnu.ai.mit.edu" "fast-lock 3.10.01" |
167 '(fast-lock-cache-directories fast-lock-minimum-size | 204 '(fast-lock-cache-directories fast-lock-minimum-size |
168 fast-lock-save-others fast-lock-save-events fast-lock-save-faces) | 205 fast-lock-save-others fast-lock-save-events fast-lock-save-faces) |
169 nil nil | 206 nil nil |
170 (concat "Hi Si., | 207 (concat "Hi Si., |
171 | 208 |
172 I want to report a bug. I've read the `Bugs' section of `Info' on Emacs, so I | 209 I want to report a bug. I've read the `Bugs' section of `Info' on Emacs, so I |
173 know how to make a clear and unambiguous report. To reproduce the bug: | 210 know how to make a clear and unambiguous report. To reproduce the bug: |
174 | 211 |
175 Start a fresh Emacs via `" invocation-name " -no-init-file -no-site-file'. | 212 Start a fresh editor via `" invocation-name " -no-init-file -no-site-file'. |
176 In the `*scratch*' buffer, evaluate:")))) | 213 In the `*scratch*' buffer, evaluate:")))) |
177 | 214 |
178 ;;;###autoload | 215 ;;;###autoload |
179 (defvar fast-lock-mode nil) ; for modeline | 216 (defvar fast-lock-mode nil) |
180 (defvar fast-lock-cache-timestamp nil) ; for saving/reading | 217 (defvar fast-lock-cache-timestamp nil) ; for saving/reading |
181 (defvar fast-lock-cache-filename nil) ; for deleting | 218 (defvar fast-lock-cache-filename nil) ; for deleting |
182 | 219 |
183 ;; User Variables: | 220 ;; User Variables: |
184 | 221 |
185 (defvar fast-lock-cache-directories '("." "~/.emacs-flc") | 222 (defvar fast-lock-cache-directories '("." "~/.emacs-flc") |
186 ; - `internal', keep each file's Font Lock cache file in the same file. | 223 ; - `internal', keep each file's Font Lock cache file in the same file. |
187 ; - `external', keep each file's Font Lock cache file in the same directory. | 224 ; - `external', keep each file's Font Lock cache file in the same directory. |
188 "Directories in which Font Lock cache files are saved and read. | 225 "*Directories in which Font Lock cache files are saved and read. |
189 Each item should be either DIR or a cons pair of the form (REGEXP . DIR) where | 226 Each item should be either DIR or a cons pair of the form (REGEXP . DIR) where |
190 DIR is a directory name (relative or absolute) and REGEXP is a regexp. | 227 DIR is a directory name (relative or absolute) and REGEXP is a regexp. |
191 | 228 |
192 An attempt will be made to save or read Font Lock cache files using these items | 229 An attempt will be made to save or read Font Lock cache files using these items |
193 until one succeeds (i.e., until a readable or writable one is found). If an | 230 until one succeeds (i.e., until a readable or writable one is found). If an |
201 | 238 |
202 would cause a file's current directory to be used if the file is under your | 239 would cause a file's current directory to be used if the file is under your |
203 home directory hierarchy, or otherwise the absolute directory `~/.emacs-flc'.") | 240 home directory hierarchy, or otherwise the absolute directory `~/.emacs-flc'.") |
204 | 241 |
205 (defvar fast-lock-minimum-size (* 25 1024) | 242 (defvar fast-lock-minimum-size (* 25 1024) |
206 "If non-nil, the minimum size for buffers. | 243 "*Minimum size of a buffer for cached fontification. |
207 Only buffers more than this can have associated Font Lock cache files saved. | 244 Only buffers more than this can have associated Font Lock cache files saved. |
208 If nil, means size is irrelevant.") | 245 If nil, means cache files are never created. |
246 If a list, each element should be a cons pair of the form (MAJOR-MODE . SIZE), | |
247 where MAJOR-MODE is a symbol or t (meaning the default). For example: | |
248 ((c-mode . 25600) (c++-mode . 25600) (rmail-mode . 1048576)) | |
249 means that the minimum size is 25K for buffers in C or C++ modes, one megabyte | |
250 for buffers in Rmail mode, and size is irrelevant otherwise.") | |
209 | 251 |
210 (defvar fast-lock-save-events '(kill-buffer kill-emacs) | 252 (defvar fast-lock-save-events '(kill-buffer kill-emacs) |
211 "A list of events under which caches will be saved. | 253 "*Events under which caches will be saved. |
212 Valid events are `save-buffer', `kill-buffer' and `kill-emacs'. | 254 Valid events are `save-buffer', `kill-buffer' and `kill-emacs'. |
213 If concurrent editing sessions use the same associated cache file for a file's | 255 If concurrent editing sessions use the same associated cache file for a file's |
214 buffer, then you should add `save-buffer' to this list.") | 256 buffer, then you should add `save-buffer' to this list.") |
215 | 257 |
216 (defvar fast-lock-save-others t | 258 (defvar fast-lock-save-others t |
217 "If non-nil, save Font Lock cache files irrespective of file owner. | 259 "*If non-nil, save Font Lock cache files irrespective of file owner. |
218 If nil, means only buffer files known to be owned by you can have associated | 260 If nil, means only buffer files known to be owned by you can have associated |
219 Font Lock cache files saved. Ownership may be unknown for networked files.") | 261 Font Lock cache files saved. Ownership may be unknown for networked files.") |
220 | 262 |
221 (defvar fast-lock-save-faces | 263 (defvar fast-lock-save-faces |
222 ;; Since XEmacs uses extents for everything, we have to pick the right ones. | 264 (when (save-match-data (string-match "XEmacs" (emacs-version))) |
223 ;; In XEmacs 19.13 we can't identify which text properties are Font Lock's. | 265 ;; XEmacs uses extents for everything, so we have to pick the right ones. |
224 (if (save-match-data (string-match "XEmacs" (emacs-version))) | 266 font-lock-face-list) |
225 '(font-lock-string-face font-lock-doc-string-face font-lock-type-face | 267 "Faces that will be saved in a Font Lock cache file. |
226 font-lock-function-name-face font-lock-comment-face | |
227 font-lock-keyword-face font-lock-preprocessor-face) | |
228 ;; For Emacs 19.30 I don't think this is generally necessary. | |
229 nil) | |
230 "A list of faces that will be saved in a Font Lock cache file. | |
231 If nil, means information for all faces will be saved.") | 268 If nil, means information for all faces will be saved.") |
232 | 269 |
233 ;; User Functions: | 270 ;; User Functions: |
234 | 271 |
235 ;;;###autoload | 272 ;;;###autoload |
236 (defun fast-lock-mode (&optional arg) | 273 (defun fast-lock-mode (&optional arg) |
237 "Toggle Fast Lock mode. | 274 "Toggle Fast Lock mode. |
238 With arg, turn Fast Lock mode on if and only if arg is positive and the buffer | 275 With arg, turn Fast Lock mode on if and only if arg is positive and the buffer |
239 is associated with a file. Enable it automatically in your `~/.emacs' by: | 276 is associated with a file. Enable it automatically in your `~/.emacs' by: |
240 | 277 |
241 (add-hook 'font-lock-mode-hook 'turn-on-fast-lock) | 278 (setq font-lock-support-mode 'fast-lock-mode) |
242 | 279 |
243 If Fast Lock mode is enabled, and the current buffer does not contain any text | 280 If Fast Lock mode is enabled, and the current buffer does not contain any text |
244 properties, any associated Font Lock cache is used if its timestamp matches the | 281 properties, any associated Font Lock cache is used if its timestamp matches the |
245 buffer's file, and its `font-lock-keywords' match those that you are using. | 282 buffer's file, and its `font-lock-keywords' match those that you are using. |
246 | 283 |
262 (interactive "P") | 299 (interactive "P") |
263 ;; Only turn on if we are visiting a file. We could use `buffer-file-name', | 300 ;; Only turn on if we are visiting a file. We could use `buffer-file-name', |
264 ;; but many packages temporarily wrap that to nil when doing their own thing. | 301 ;; but many packages temporarily wrap that to nil when doing their own thing. |
265 (set (make-local-variable 'fast-lock-mode) | 302 (set (make-local-variable 'fast-lock-mode) |
266 (and buffer-file-truename | 303 (and buffer-file-truename |
304 (not (memq 'fast-lock-mode font-lock-inhibit-thing-lock)) | |
267 (if arg (> (prefix-numeric-value arg) 0) (not fast-lock-mode)))) | 305 (if arg (> (prefix-numeric-value arg) 0) (not fast-lock-mode)))) |
268 (if (and fast-lock-mode (not font-lock-mode)) | 306 (if (and fast-lock-mode (not font-lock-mode)) |
269 ;; Turned on `fast-lock-mode' rather than using `font-lock-mode-hook'. | 307 ;; Turned on `fast-lock-mode' rather than `font-lock-mode'. |
270 (progn | 308 (let ((font-lock-support-mode 'fast-lock-mode)) |
271 (add-hook 'font-lock-mode-hook 'turn-on-fast-lock) | |
272 (font-lock-mode t)) | 309 (font-lock-mode t)) |
273 ;; Let's get down to business. | 310 ;; Let's get down to business. |
274 (set (make-local-variable 'fast-lock-cache-timestamp) nil) | 311 (set (make-local-variable 'fast-lock-cache-timestamp) nil) |
275 (set (make-local-variable 'fast-lock-cache-filename) nil) | 312 (set (make-local-variable 'fast-lock-cache-filename) nil) |
276 (if (and fast-lock-mode (not font-lock-fontified)) | 313 (when (and fast-lock-mode (not font-lock-fontified)) |
277 (fast-lock-read-cache)))) | 314 (fast-lock-read-cache)))) |
278 | 315 |
279 (defun fast-lock-read-cache () | 316 (defun fast-lock-read-cache () |
280 "Read the Font Lock cache for the current buffer. | 317 "Read the Font Lock cache for the current buffer. |
281 | 318 |
282 The following criteria must be met for a Font Lock cache file to be read: | 319 The following criteria must be met for a Font Lock cache file to be read: |
293 (fontified font-lock-fontified)) | 330 (fontified font-lock-fontified)) |
294 (set (make-local-variable 'font-lock-fontified) nil) | 331 (set (make-local-variable 'font-lock-fontified) nil) |
295 ;; Keep trying directories until fontification is turned off. | 332 ;; Keep trying directories until fontification is turned off. |
296 (while (and directories (not font-lock-fontified)) | 333 (while (and directories (not font-lock-fontified)) |
297 (let ((directory (fast-lock-cache-directory (car directories) nil))) | 334 (let ((directory (fast-lock-cache-directory (car directories) nil))) |
298 (if (not directory) | 335 (condition-case nil |
299 nil | 336 (when directory |
300 (setq fast-lock-cache-filename (fast-lock-cache-name directory)) | 337 (setq fast-lock-cache-filename (fast-lock-cache-name directory)) |
301 (condition-case nil | 338 (when (file-readable-p fast-lock-cache-filename) |
302 (if (file-readable-p fast-lock-cache-filename) | 339 (load fast-lock-cache-filename t t t))) |
303 (load fast-lock-cache-filename t t t)) | 340 (error nil) (quit nil)) |
304 (error nil) (quit nil))) | |
305 (setq directories (cdr directories)))) | 341 (setq directories (cdr directories)))) |
306 ;; Unset `fast-lock-cache-filename', and restore `font-lock-fontified', if | 342 ;; Unset `fast-lock-cache-filename', and restore `font-lock-fontified', if |
307 ;; we don't use a cache. (Note that `fast-lock-cache-data' sets the value | 343 ;; we don't use a cache. (Note that `fast-lock-cache-data' sets the value |
308 ;; of `fast-lock-cache-timestamp'.) | 344 ;; of `fast-lock-cache-timestamp'.) |
309 (set-buffer-modified-p modified) | 345 (set-buffer-modified-p modified) |
310 (if (not font-lock-fontified) | 346 (unless font-lock-fontified |
311 (setq fast-lock-cache-filename nil font-lock-fontified fontified)))) | 347 (setq fast-lock-cache-filename nil font-lock-fontified fontified)))) |
312 | 348 |
313 (defun fast-lock-save-cache (&optional buffer) | 349 (defun fast-lock-save-cache (&optional buffer) |
314 "Save the Font Lock cache of BUFFER or the current buffer. | 350 "Save the Font Lock cache of BUFFER or the current buffer. |
315 | 351 |
316 The following criteria must be met for a Font Lock cache file to be saved: | 352 The following criteria must be met for a Font Lock cache file to be saved: |
325 - Criteria imposed by `fast-lock-cache-directories'. | 361 - Criteria imposed by `fast-lock-cache-directories'. |
326 | 362 |
327 See `fast-lock-mode'." | 363 See `fast-lock-mode'." |
328 (interactive) | 364 (interactive) |
329 (save-excursion | 365 (save-excursion |
330 (and buffer (set-buffer buffer)) | 366 (when buffer |
331 (let ((file-timestamp (visited-file-modtime)) (saved nil)) | 367 (set-buffer buffer)) |
332 (if (and fast-lock-mode | 368 (let ((min-size (font-lock-value-in-major-mode fast-lock-minimum-size)) |
333 ;; | 369 (file-timestamp (visited-file-modtime)) (saved nil)) |
334 ;; "Only save if the buffer matches the file, the file has | 370 (when (and fast-lock-mode |
335 ;; changed, and it was changed by the current emacs session." | 371 ;; |
336 ;; | 372 ;; "Only save if the buffer matches the file, the file has |
337 ;; Only save if the buffer is not modified, | 373 ;; changed, and it was changed by the current emacs session." |
338 ;; (i.e., so we don't save for something not on disk) | 374 ;; |
339 (not (buffer-modified-p)) | 375 ;; Only save if the buffer is not modified, |
340 ;; and the file's timestamp is the same as the buffer's, | 376 ;; (i.e., so we don't save for something not on disk) |
341 ;; (i.e., someone else hasn't written the file in the meantime) | 377 (not (buffer-modified-p)) |
342 (verify-visited-file-modtime (current-buffer)) | 378 ;; and the file's timestamp is the same as the buffer's, |
343 ;; and the file's timestamp is different from the cache's. | 379 ;; (i.e., someone else hasn't written the file in the meantime) |
344 ;; (i.e., a save has occurred since the cache was read) | 380 (verify-visited-file-modtime (current-buffer)) |
345 (not (equal fast-lock-cache-timestamp file-timestamp)) | 381 ;; and the file's timestamp is different from the cache's. |
346 ;; | 382 ;; (i.e., a save has occurred since the cache was read) |
347 ;; Only save if user's restrictions are satisfied. | 383 (not (equal fast-lock-cache-timestamp file-timestamp)) |
348 (or (not fast-lock-minimum-size) | 384 ;; |
349 (<= fast-lock-minimum-size (buffer-size))) | 385 ;; Only save if user's restrictions are satisfied. |
350 (or fast-lock-save-others | 386 (and min-size (>= (buffer-size) min-size)) |
351 (eq (user-uid) (nth 2 (file-attributes buffer-file-name)))) | 387 (or fast-lock-save-others |
352 ;; | 388 (eq (user-uid) (nth 2 (file-attributes buffer-file-name)))) |
353 ;; Only save if there are `face' properties to save. | 389 ;; |
354 (text-property-not-all (point-min) (point-max) 'face nil)) | 390 ;; Only save if there are `face' properties to save. |
355 ;; Try each directory until we manage to save or the user quits. | 391 (text-property-not-all (point-min) (point-max) 'face nil)) |
356 (let ((directories fast-lock-cache-directories)) | 392 ;; |
357 (while (and directories (memq saved '(nil error))) | 393 ;; Try each directory until we manage to save or the user quits. |
358 (let* ((dir (fast-lock-cache-directory (car directories) t)) | 394 (let ((directories fast-lock-cache-directories)) |
359 (file (and dir (fast-lock-cache-name dir)))) | 395 (while (and directories (memq saved '(nil error))) |
360 (if (and file (file-writable-p file)) | 396 (let* ((dir (fast-lock-cache-directory (car directories) t)) |
361 (setq saved (fast-lock-save-cache-1 file file-timestamp))) | 397 (file (and dir (fast-lock-cache-name dir)))) |
362 (setq directories (cdr directories))))))))) | 398 (when (and file (file-writable-p file)) |
399 (setq saved (fast-lock-save-cache-1 file file-timestamp))) | |
400 (setq directories (cdr directories))))))))) | |
363 | 401 |
364 ;;;###autoload | 402 ;;;###autoload |
365 (defun turn-on-fast-lock () | 403 (defun turn-on-fast-lock () |
366 "Unconditionally turn on Fast Lock mode." | 404 "Unconditionally turn on Fast Lock mode." |
367 (fast-lock-mode t)) | 405 (fast-lock-mode t)) |
368 | 406 |
369 ;;; API Functions: | 407 ;;; API Functions: |
370 | 408 |
371 (defun fast-lock-after-fontify-buffer () | 409 (defun fast-lock-after-fontify-buffer () |
372 ;; Delete the Font Lock cache file used to restore fontification, if any. | 410 ;; Delete the Font Lock cache file used to restore fontification, if any. |
373 (if fast-lock-cache-filename | 411 (when fast-lock-cache-filename |
374 (if (file-writable-p fast-lock-cache-filename) | 412 (if (file-writable-p fast-lock-cache-filename) |
375 (delete-file fast-lock-cache-filename) | 413 (delete-file fast-lock-cache-filename) |
376 (message "File %s font lock cache cannot be deleted" (buffer-name)))) | 414 (message "File %s font lock cache cannot be deleted" (buffer-name)))) |
377 ;; Flag so that a cache will be saved later even if the file is never saved. | 415 ;; Flag so that a cache will be saved later even if the file is never saved. |
378 (setq fast-lock-cache-timestamp nil)) | 416 (setq fast-lock-cache-timestamp nil)) |
417 | |
418 (defalias 'fast-lock-after-unfontify-buffer | |
419 'ignore) | |
379 | 420 |
380 ;; Miscellaneous Functions: | 421 ;; Miscellaneous Functions: |
381 | 422 |
382 (defun fast-lock-after-save-hook () | 423 (defun fast-lock-save-cache-after-save-file () |
383 ;; Do `fast-lock-save-cache' if `save-buffer' is on `fast-lock-save-events'. | 424 ;; Do `fast-lock-save-cache' if `save-buffer' is on `fast-lock-save-events'. |
384 (if (memq 'save-buffer fast-lock-save-events) | 425 (when (memq 'save-buffer fast-lock-save-events) |
385 (fast-lock-save-cache))) | 426 (fast-lock-save-cache))) |
386 | 427 |
387 (defun fast-lock-kill-buffer-hook () | 428 (defun fast-lock-save-cache-before-kill-buffer () |
388 ;; Do `fast-lock-save-cache' if `kill-buffer' is on `fast-lock-save-events'. | 429 ;; Do `fast-lock-save-cache' if `kill-buffer' is on `fast-lock-save-events'. |
389 (if (memq 'kill-buffer fast-lock-save-events) | 430 (when (memq 'kill-buffer fast-lock-save-events) |
390 (fast-lock-save-cache))) | 431 (fast-lock-save-cache))) |
391 | 432 |
392 (defun fast-lock-kill-emacs-hook () | 433 (defun fast-lock-save-caches-before-kill-emacs () |
393 ;; Do `fast-lock-save-cache's if `kill-emacs' is on `fast-lock-save-events'. | 434 ;; Do `fast-lock-save-cache's if `kill-emacs' is on `fast-lock-save-events'. |
394 (if (memq 'kill-emacs fast-lock-save-events) | 435 (when (memq 'kill-emacs fast-lock-save-events) |
395 (mapcar 'fast-lock-save-cache (buffer-list)))) | 436 (mapcar 'fast-lock-save-cache (buffer-list)))) |
396 | 437 |
397 (defun fast-lock-cache-directory (directory create) | 438 (defun fast-lock-cache-directory (directory create) |
398 "Return usable directory based on DIRECTORY. | 439 "Return usable directory based on DIRECTORY. |
399 Returns nil if the directory does not exist, or, if CREATE non-nil, cannot be | 440 Returns nil if the directory does not exist, or, if CREATE non-nil, cannot be |
400 created. DIRECTORY may be a string or a cons pair of the form (REGEXP . DIR). | 441 created. DIRECTORY may be a string or a cons pair of the form (REGEXP . DIR). |
408 directory) | 449 directory) |
409 (t | 450 (t |
410 ;; A directory iff the file name matches the regexp. | 451 ;; A directory iff the file name matches the regexp. |
411 (let ((bufile (expand-file-name buffer-file-truename)) | 452 (let ((bufile (expand-file-name buffer-file-truename)) |
412 (case-fold-search nil)) | 453 (case-fold-search nil)) |
413 (if (save-match-data (string-match (car directory) bufile)) | 454 (when (save-match-data (string-match (car directory) bufile)) |
414 (cdr directory))))))) | 455 (cdr directory))))))) |
415 (cond ((not dir) | 456 (cond ((not dir) |
416 nil) | 457 nil) |
417 ((file-accessible-directory-p dir) | 458 ((file-accessible-directory-p dir) |
418 dir) | 459 dir) |
419 (create | 460 (create |
476 (write-region (point-min) (point-max) file nil 'quietly) | 517 (write-region (point-min) (point-max) file nil 'quietly) |
477 (setq fast-lock-cache-timestamp timestamp | 518 (setq fast-lock-cache-timestamp timestamp |
478 fast-lock-cache-filename file)) | 519 fast-lock-cache-filename file)) |
479 (error (setq saved 'error)) (quit (setq saved 'quit))) | 520 (error (setq saved 'error)) (quit (setq saved 'quit))) |
480 (kill-buffer tpbuf) | 521 (kill-buffer tpbuf) |
481 (message "Saving %s font lock cache... %s." buname | 522 (message "Saving %s font lock cache...%s" buname |
482 (cond ((eq saved 'error) "failed") | 523 (cond ((eq saved 'error) "failed") |
483 ((eq saved 'quit) "aborted") | 524 ((eq saved 'quit) "aborted") |
484 (t "done"))) | 525 (t "done"))) |
485 ;; We return non-nil regardless of whether a failure occurred. | 526 ;; We return non-nil regardless of whether a failure occurred. |
486 saved)) | 527 saved)) |
487 | 528 |
488 (defun fast-lock-cache-data (version timestamp keywords properties | 529 (defun fast-lock-cache-data (version timestamp keywords properties |
489 &rest ignored) | 530 &rest ignored) |
490 ;; Change from (HIGH LOW) for back compatibility. Remove for version 3! | 531 ;; Change from (HIGH LOW) for back compatibility. Remove for version 3! |
491 (if (consp (cdr-safe timestamp)) (setcdr timestamp (nth 1 timestamp))) | 532 (when (consp (cdr-safe timestamp)) |
533 (setcdr timestamp (nth 1 timestamp))) | |
492 ;; Compile KEYWORDS and `font-lock-keywords' in case one is and one isn't. | 534 ;; Compile KEYWORDS and `font-lock-keywords' in case one is and one isn't. |
493 (let ((current font-lock-keywords)) | 535 (let ((current font-lock-keywords)) |
494 (setq keywords (font-lock-compile-keywords keywords) | 536 (setq keywords (font-lock-compile-keywords keywords) |
495 font-lock-keywords (font-lock-compile-keywords current))) | 537 font-lock-keywords (font-lock-compile-keywords current))) |
496 ;; Use the Font Lock cache PROPERTIES if we're using cache VERSION format 2, | 538 ;; Use the Font Lock cache PROPERTIES if we're using cache VERSION format 2, |
505 (setq loaded nil) | 547 (setq loaded nil) |
506 (message "Loading %s font lock cache..." buname) | 548 (message "Loading %s font lock cache..." buname) |
507 (condition-case nil | 549 (condition-case nil |
508 (fast-lock-set-face-properties properties) | 550 (fast-lock-set-face-properties properties) |
509 (error (setq loaded 'error)) (quit (setq loaded 'quit))) | 551 (error (setq loaded 'error)) (quit (setq loaded 'quit))) |
510 (message "Loading %s font lock cache... %s." buname | 552 (message "Loading %s font lock cache...%s" buname |
511 (cond ((eq loaded 'error) "failed") | 553 (cond ((eq loaded 'error) "failed") |
512 ((eq loaded 'quit) "aborted") | 554 ((eq loaded 'quit) "aborted") |
513 (t "done")))) | 555 (t "done")))) |
514 (setq font-lock-fontified (eq loaded t) | 556 (setq font-lock-fontified (eq loaded t) |
515 fast-lock-cache-timestamp (and (eq loaded t) timestamp)))) | 557 fast-lock-cache-timestamp (and (eq loaded t) timestamp)))) |
550 ;; Make a list of start/end regions with `face' property face. | 592 ;; Make a list of start/end regions with `face' property face. |
551 (while (setq start (text-property-any end limit 'face face)) | 593 (while (setq start (text-property-any end limit 'face face)) |
552 (setq end (or (text-property-not-all start limit 'face face) limit) | 594 (setq end (or (text-property-not-all start limit 'face face) limit) |
553 regions (cons start (cons end regions)))) | 595 regions (cons start (cons end regions)))) |
554 ;; Add `face' face's regions, if any, to properties. | 596 ;; Add `face' face's regions, if any, to properties. |
555 (if regions (setq properties (cons (cons face regions) properties)))) | 597 (when regions |
598 (push (cons face regions) properties))) | |
556 properties))) | 599 properties))) |
557 | 600 |
558 (defun fast-lock-set-face-properties (properties) | 601 (defun fast-lock-set-face-properties (properties) |
559 "Set all `face' text properties to PROPERTIES in the current buffer. | 602 "Set all `face' text properties to PROPERTIES in the current buffer. |
560 Any existing `face' text properties are removed first. Leaves buffer modified. | 603 Any existing `face' text properties are removed first. |
561 See `fast-lock-get-face-properties' for the format of PROPERTIES." | 604 See `fast-lock-get-face-properties' for the format of PROPERTIES." |
562 (save-restriction | 605 (save-buffer-state (plist regions) |
563 (widen) | 606 (save-restriction |
564 (font-lock-unfontify-region (point-min) (point-max)) | 607 (widen) |
565 (while properties | 608 (font-lock-unfontify-region (point-min) (point-max)) |
566 (let ((plist (list 'face (car (car properties)))) | 609 (while properties |
567 (regions (cdr (car properties)))) | 610 (setq plist (list 'face (car (car properties))) |
611 regions (cdr (car properties)) | |
612 properties (cdr properties)) | |
568 ;; Set the `face' property for each start/end region. | 613 ;; Set the `face' property for each start/end region. |
569 (while regions | 614 (while regions |
570 (set-text-properties (nth 0 regions) (nth 1 regions) plist) | 615 (set-text-properties (nth 0 regions) (nth 1 regions) plist) |
571 (setq regions (nthcdr 2 regions))) | 616 (setq regions (nthcdr 2 regions))))))) |
572 (setq properties (cdr properties)))))) | |
573 | 617 |
574 ;; Functions for XEmacs: | 618 ;; Functions for XEmacs: |
575 | 619 |
576 (if (save-match-data (string-match "XEmacs" (emacs-version))) | 620 (when (save-match-data (string-match "XEmacs" (emacs-version))) |
577 ;; It would be better to use XEmacs 19.12's `map-extents' over extents with | 621 ;; |
578 ;; `font-lock' property, but `face' properties are on different extents. | 622 ;; It would be better to use XEmacs' `map-extents' over extents with a |
579 (defun fast-lock-get-face-properties () | 623 ;; `font-lock' property, but `face' properties are on different extents. |
580 "Return a list of all `face' text properties in the current buffer. | 624 (defun fast-lock-get-face-properties () |
625 "Return a list of all `face' text properties in the current buffer. | |
581 Each element of the list is of the form (VALUE START1 END1 START2 END2 ...) | 626 Each element of the list is of the form (VALUE START1 END1 START2 END2 ...) |
582 where VALUE is a `face' property value and STARTx and ENDx are positions. | 627 where VALUE is a `face' property value and STARTx and ENDx are positions. |
583 Only those `face' VALUEs in `fast-lock-save-faces' are returned." | 628 Only those `face' VALUEs in `fast-lock-save-faces' are returned." |
584 (save-restriction | 629 (save-restriction |
585 (widen) | 630 (widen) |
586 (let ((properties ()) cell) | 631 (let ((properties ()) cell) |
587 (map-extents | 632 (map-extents |
588 (function | 633 (function (lambda (extent ignore) |
589 (lambda (extent ignore) | 634 (let ((value (extent-face extent))) |
590 (let ((value (extent-face extent))) | 635 ;; We're only interested if it's one of `fast-lock-save-faces'. |
591 ;; We're only interested if it's one of `fast-lock-save-faces'. | 636 (when (and value (or (null fast-lock-save-faces) |
592 (if (and value (or (null fast-lock-save-faces) | |
593 (memq value fast-lock-save-faces))) | 637 (memq value fast-lock-save-faces))) |
594 (let ((start (extent-start-position extent)) | 638 (let ((start (extent-start-position extent)) |
595 (end (extent-end-position extent))) | 639 (end (extent-end-position extent))) |
596 ;; Make or add to existing list of regions with the same | 640 ;; Make or add to existing list of regions with the same |
597 ;; `face' property value. | 641 ;; `face' property value. |
598 (if (setq cell (assq value properties)) | 642 (if (setq cell (assq value properties)) |
599 (setcdr cell (cons start (cons end (cdr cell)))) | 643 (setcdr cell (cons start (cons end (cdr cell)))) |
600 (setq properties (cons (list value start end) | 644 (push (list value start end) properties)))) |
601 properties))))) | 645 ;; Return nil to keep `map-extents' going. |
602 ;; Return nil to keep `map-extents' going. | 646 nil)))) |
603 nil)))) | 647 properties))) |
604 properties)))) | 648 ;; |
605 | 649 ;; Make extents just like XEmacs' font-lock.el does. |
606 (if (save-match-data (string-match "XEmacs" (emacs-version))) | 650 (defun fast-lock-set-face-properties (properties) |
607 ;; Make extents just like XEmacs's font-lock.el does. | 651 "Set all `face' text properties to PROPERTIES in the current buffer. |
608 (defun fast-lock-set-face-properties (properties) | |
609 "Set all `face' text properties to PROPERTIES in the current buffer. | |
610 Any existing `face' text properties are removed first. | 652 Any existing `face' text properties are removed first. |
611 See `fast-lock-get-face-properties' for the format of PROPERTIES." | 653 See `fast-lock-get-face-properties' for the format of PROPERTIES." |
612 (save-restriction | 654 (save-restriction |
613 (widen) | 655 (widen) |
614 (font-lock-unfontify-region (point-min) (point-max)) | 656 (font-lock-unfontify-region (point-min) (point-max)) |
615 (while properties | 657 (while properties |
616 (let ((face (car (car properties))) | 658 (let ((face (car (car properties))) |
617 (regions (cdr (car properties)))) | 659 (regions (cdr (car properties)))) |
618 ;; Set the `face' property, etc., for each start/end region. | 660 ;; Set the `face' property, etc., for each start/end region. |
619 (while regions | 661 (while regions |
620 (font-lock-set-face (nth 0 regions) (nth 1 regions) face) | 662 (font-lock-set-face (nth 0 regions) (nth 1 regions) face) |
621 (setq regions (nthcdr 2 regions))) | 663 (setq regions (nthcdr 2 regions))) |
622 (setq properties (cdr properties))))))) | 664 (setq properties (cdr properties)))))) |
623 | 665 ;; |
624 (if (save-match-data (string-match "XEmacs" (emacs-version))) | 666 ;; XEmacs 19.12 font-lock.el's `font-lock-fontify-buffer' runs a hook. |
625 ;; XEmacs 19.12 font-lock.el's `font-lock-fontify-buffer' runs a hook. | 667 (add-hook 'font-lock-after-fontify-buffer-hook |
626 (add-hook 'font-lock-after-fontify-buffer-hook | 668 'fast-lock-after-fontify-buffer)) |
627 'fast-lock-after-fontify-buffer)) | 669 |
628 | 670 (unless (boundp 'font-lock-inhibit-thing-lock) |
629 (or (fboundp 'font-lock-compile-keywords) | 671 (defvar font-lock-inhibit-thing-lock nil |
630 (defalias 'font-lock-compile-keywords 'identity)) | 672 "List of Font Lock mode related modes that should not be turned on.")) |
673 | |
674 (unless (fboundp 'font-lock-value-in-major-mode) | |
675 (defun font-lock-value-in-major-mode (alist) | |
676 ;; Return value in ALIST for `major-mode'. | |
677 (if (consp alist) | |
678 (cdr (or (assq major-mode alist) (assq t alist))) | |
679 alist))) | |
680 | |
681 (unless (fboundp 'font-lock-compile-keywords) | |
682 (defalias 'font-lock-compile-keywords 'identity)) | |
631 | 683 |
632 ;; Install ourselves: | 684 ;; Install ourselves: |
633 | 685 |
634 ;; We don't install ourselves on `font-lock-mode-hook' as packages with similar | 686 (add-hook 'after-save-hook 'fast-lock-save-cache-after-save-file) |
635 ;; functionality exist, and fast-lock.el should be dumpable without forcing | 687 (add-hook 'kill-buffer-hook 'fast-lock-save-cache-before-kill-buffer) |
636 ;; people to use caches or making it difficult for people to use alternatives. | 688 (add-hook 'kill-emacs-hook 'fast-lock-save-caches-before-kill-emacs) |
637 (add-hook 'after-save-hook 'fast-lock-after-save-hook) | 689 |
638 (add-hook 'kill-buffer-hook 'fast-lock-kill-buffer-hook) | |
639 (add-hook 'kill-emacs-hook 'fast-lock-kill-emacs-hook) | |
640 | |
641 ;; Maybe save on the modeline? | |
642 ;;(setcdr (assq 'font-lock-mode minor-mode-alist) '(" Fast")) | |
643 | |
644 ;(or (assq 'fast-lock-mode minor-mode-alist) | |
645 ; (setq minor-mode-alist (cons '(fast-lock-mode " Fast") minor-mode-alist))) | |
646 | |
647 ;; XEmacs change: do it the right way. This works with modeline mousing. | |
648 ;;;###autoload | 690 ;;;###autoload |
649 (add-minor-mode 'fast-lock-mode " Fast") | 691 (if (fboundp 'add-minor-mode) (add-minor-mode 'fast-lock-mode nil)) |
692 ;;;###dont-autoload | |
693 (unless (assq 'fast-lock-mode minor-mode-alist) | |
694 (setq minor-mode-alist (append minor-mode-alist '((fast-lock-mode nil))))) | |
650 | 695 |
651 ;; Provide ourselves: | 696 ;; Provide ourselves: |
652 | 697 |
653 (provide 'fast-lock) | 698 (provide 'fast-lock) |
654 | 699 |