annotate lisp/fast-lock.el @ 16883:d1d4d81f9ece

Change all uses of win95, winnt, and win32 into Windows 95, Windows NT, and W32, respectively. Expand "win" substring in variables referring to Microsoft Windows constructs into "windows". Canonicalize header comments to use same terminology.
author Geoff Voelker <voelker@cs.washington.edu>
date Mon, 20 Jan 1997 00:34:34 +0000
parents aadb4abdeaaa
children de68258fef5f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
1 ;;; fast-lock.el --- Automagic text properties caching for fast Font Lock mode.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13301
diff changeset
3 ;; Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
5 ;; Author: Simon Marshall <simon@gnu.ai.mit.edu>
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6 ;; Keywords: faces files
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
7 ;; Version: 3.11
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8
14374
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
9 ;;; This file is part of GNU Emacs.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 ;; the Free Software Foundation; either version 2, or (at your option)
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 ;; any later version.
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 ;; GNU General Public License for more details.
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13301
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13301
diff changeset
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13301
diff changeset
24 ;; Boston, MA 02111-1307, USA.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26 ;;; Commentary:
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
28 ;; Lazy Lock mode is a Font Lock support mode.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
29 ;; It makes visiting a file in Font Lock mode faster by restoring its face text
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
30 ;; properties from automatically saved associated Font Lock cache files.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31 ;;
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
32 ;; See caveats and feedback below.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33 ;; See also the lazy-lock package. (But don't use the two at the same time!)
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35 ;; Installation:
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 ;;
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
37 ;; Put in your ~/.emacs:
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38 ;;
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
39 ;; (setq font-lock-support-mode 'fast-lock-mode)
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40 ;;
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41 ;; Start up a new Emacs and use font-lock as usual (except that you can use the
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42 ;; so-called "gaudier" fontification regexps on big files without frustration).
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43 ;;
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 ;; When you visit a file (which has `font-lock-mode' enabled) that has a
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
45 ;; corresponding Font Lock cache file associated with it, the Font Lock cache
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
46 ;; will be loaded from that file instead of being generated by Font Lock code.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
47
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
48 ;; Caveats:
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49 ;;
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
50 ;; A cache will be saved when visiting a compressed file using crypt++, but not
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
51 ;; be read. This is a "feature"/"consequence"/"bug" of crypt++.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52 ;;
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
53 ;; Version control packages are likely to stamp all over file modification
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
54 ;; times. Therefore the act of checking out may invalidate a cache.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55
12909
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
56 ;; History:
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
57 ;;
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
58 ;; 0.02--1.00:
14374
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
59 ;; - Changed name from turbo-prop to fast-lock. Automagic for font-lock only
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
60 ;; - Made `fast-lock-mode' a minor mode, like G. Dinesh Dutt's fss-mode
12909
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
61 ;; 1.00--1.01:
14374
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
62 ;; - Turn on `fast-lock-mode' only if `buffer-file-name' or `interactive-p'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
63 ;; - Made `fast-lock-file-name' use `buffer-name' if `buffer-file-name' is nil
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
64 ;; - Moved save-all conditions to `fast-lock-save-cache'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
65 ;; - Added `fast-lock-save-text-properties' to `kill-buffer-hook'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
66 ;; 1.01--2.00: complete rewrite---not worth the space to document
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
67 ;; - Changed structure of text properties cache and threw out file mod checks
12909
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
68 ;; 2.00--2.01:
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
69 ;; - Made `condition-case' forms understand `quit'.
14374
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
70 ;; - Made `fast-lock' require `font-lock'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
71 ;; - Made `fast-lock-cache-name' chase links (from Ben Liblit)
12909
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
72 ;; 2.01--3.00:
14374
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
73 ;; - Changed structure of cache to include `font-lock-keywords' (from rms)
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
74 ;; - Changed `fast-lock-cache-mechanisms' to `fast-lock-cache-directories'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
75 ;; - Removed `fast-lock-read-others'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
76 ;; - Made `fast-lock-read-cache' ignore cache owner
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
77 ;; - Made `fast-lock-save-cache-external' create cache directory
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
78 ;; - Made `fast-lock-save-cache-external' save `font-lock-keywords'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
79 ;; - Made `fast-lock-cache-data' check `font-lock-keywords'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
80 ;; 3.00--3.01: incorporated port of 2.00 to Lucid, made by Barry Warsaw
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
81 ;; - Package now provides itself
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
82 ;; - Lucid: Use `font-lock-any-extents-p' for `font-lock-any-properties-p'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
83 ;; - Lucid: Use `list-faces' for `face-list'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
84 ;; - Lucid: Added `set-text-properties'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
85 ;; - Lucid: Made `turn-on-fast-lock' pass 1 not t to `fast-lock-mode'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
86 ;; - Removed test for `fast-lock-mode' from `fast-lock-read-cache'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
87 ;; - Lucid: Added Lucid-specific `fast-lock-get-face-properties'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
88 ;; 3.01--3.02: now works with Lucid Emacs, thanks to Barry Warsaw
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
89 ;; - Made `fast-lock-cache-name' map ":" to ";" for OS/2 (from Serganova Vera)
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
90 ;; - Made `fast-lock-cache-name' use abbreviated file name (from Barry Warsaw)
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
91 ;; - Lucid: Separated handlers for `error' and `quit' for `condition-case'
12909
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
92 ;; 3.02--3.03:
14374
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
93 ;; - Changed `fast-lock-save-cache-external' to `fast-lock-save-cache-data'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
94 ;; - Lucid: Added Lucid-specific `fast-lock-set-face-properties'
12909
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
95 ;; 3.03--3.04:
14374
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
96 ;; - Corrected `subrp' test of Lucid code
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
97 ;; - Replaced `font-lock-any-properties-p' with `text-property-not-all'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
98 ;; - Lucid: Made `fast-lock-set-face-properties' put `text-prop' on extents
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
99 ;; - Made `fast-lock-cache-directories' a regexp alist (from Colin Rafferty)
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
100 ;; - Made `fast-lock-cache-directory' to return a usable cache file directory
12909
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
101 ;; 3.04--3.05:
14374
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
102 ;; - Lucid: Fix for XEmacs 19.11 `text-property-not-all'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
103 ;; - Replaced `subrp' test of Lucid code with `emacs-version' `string-match'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
104 ;; - Made `byte-compile-warnings' omit `unresolved' on compilation
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
105 ;; - Made `fast-lock-save-cache-data' use a buffer (from Rick Sladkey)
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
106 ;; - Reverted to old `fast-lock-get-face-properties' (from Rick Sladkey)
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
107 ;; 3.05--3.06: incorporated hack of 3.03, made by Jonathan Stigelman (Stig)
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
108 ;; - Reverted to 3.04 version of `fast-lock-get-face-properties'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
109 ;; - XEmacs: Removed `list-faces' `defalias'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
110 ;; - Made `fast-lock-mode' and `turn-on-fast-lock' succeed `autoload' cookies
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
111 ;; - Added `fast-lock-submit-bug-report'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
112 ;; - Renamed `fast-lock-save-size' to `fast-lock-minimum-size'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
113 ;; - Made `fast-lock-save-cache' output a message if no save ever attempted
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
114 ;; - Made `fast-lock-save-cache-data' output a message if save attempted
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
115 ;; - Made `fast-lock-cache-data' output a message if load attempted
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
116 ;; - Made `fast-lock-save-cache-data' do `condition-case' not `unwind-protect'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
117 ;; - Made `fast-lock-save-cache' and `fast-lock-read-cache' return nothing
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
118 ;; - Made `fast-lock-save-cache' check `buffer-modified-p' (Stig)
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
119 ;; - Added `fast-lock-save-events'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
120 ;; - Added `fast-lock-after-save-hook' to `after-save-hook' (Stig)
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
121 ;; - Added `fast-lock-kill-buffer-hook' to `kill-buffer-hook'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
122 ;; - Changed `fast-lock-save-caches' to `fast-lock-kill-emacs-hook'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
123 ;; - Added `fast-lock-kill-emacs-hook' to `kill-emacs-hook'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
124 ;; - Made `fast-lock-save-cache' check `verify-visited-file-modtime' (Stig)
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
125 ;; - Made `visited-file-modtime' be the basis of the timestamp (Stig)
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
126 ;; - Made `fast-lock-save-cache-1' and `fast-lock-cache-data' use/reformat it
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
127 ;; - Added `fast-lock-cache-filename' to keep track of the cache file name
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
128 ;; - Added `fast-lock-after-fontify-buffer'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
129 ;; - Added `fast-lock-save-faces' list of faces to save (idea from Stig/Tibor)
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
130 ;; - Made `fast-lock-get-face-properties' functions use it
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
131 ;; - XEmacs: Made `fast-lock-set-face-properties' do extents the Font Lock way
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
132 ;; - XEmacs: Removed fix for `text-property-not-all' (19.11 support dropped)
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
133 ;; - Made `fast-lock-mode' ensure `font-lock-mode' is on
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
134 ;; - Made `fast-lock-save-cache' do `cdr-safe' not `cdr' (from Dave Foster)
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
135 ;; - Made `fast-lock-save-cache' do `set-buffer' first (from Dave Foster)
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
136 ;; - Made `fast-lock-save-cache' loop until saved or quit (from Georg Nikodym)
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
137 ;; - Made `fast-lock-cache-data' check `buffer-modified-p'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
138 ;; - Made `fast-lock-cache-data' do `font-lock-compile-keywords' if necessary
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
139 ;; - XEmacs: Made `font-lock-compile-keywords' `defalias'
12909
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
140 ;; 3.06--3.07:
14374
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
141 ;; - XEmacs: Add `fast-lock-after-fontify-buffer' to the Font Lock hook
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
142 ;; - Made `fast-lock-cache-name' explain the use of `directory-abbrev-alist'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
143 ;; - Made `fast-lock-mode' use `buffer-file-truename' not `buffer-file-name'
13301
0cbf58edd87f Updated to 3.08; don't use `let' var from caller.
Simon Marshall <simon@gnu.org>
parents: 12909
diff changeset
144 ;; 3.07--3.08:
14374
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
145 ;; - Made `fast-lock-read-cache' set `fast-lock-cache-filename'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
146 ;; 3.08--3.09:
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
147 ;; - Made `fast-lock-save-cache' cope if `fast-lock-minimum-size' is an a list
14374
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
148 ;; - Made `fast-lock-mode' respect the value of `font-lock-inhibit-thing-lock'
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
149 ;; - Added `fast-lock-after-unfontify-buffer'
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
150 ;; 3.09--3.10:
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
151 ;; - Rewrite for Common Lisp macros
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
152 ;; - Made fast-lock.el barf on a crap 8+3 pseudo-OS (Eli Zaretskii help)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
153 ;; - XEmacs: Made `add-minor-mode' succeed `autoload' cookie
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
154 ;; - XEmacs: Made `fast-lock-save-faces' default to `font-lock-face-list'
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
155 ;; - Made `fast-lock-save-cache' use `font-lock-value-in-major-mode'
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
156 ;; - Wrap with `save-buffer-state' (Ray Van Tassle report)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
157 ;; - Made `fast-lock-mode' wrap `font-lock-support-mode'
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
158 ;; 3.10--3.11:
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
159 ;; - Made `fast-lock-get-face-properties' cope with face lists
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
160 ;; - Added `fast-lock-verbose'
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
161 ;; - XEmacs: Add `font-lock-value-in-major-mode' if necessary
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
162 ;; - Removed `fast-lock-submit-bug-report' and bade farewell
12909
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
163
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
164 ;;; Code:
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
165
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166 (require 'font-lock)
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
168 ;; Make sure fast-lock.el is supported.
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
169 (if (and (eq system-type 'ms-dos) (not (msdos-long-file-names)))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
170 (error "`fast-lock' was written for long file name systems"))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
171
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172 (eval-when-compile
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
173 ;;
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
174 ;; We don't do this at the top-level as we only use non-autoloaded macros.
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
175 (require 'cl)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
176 ;;
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
177 ;; I prefer lazy code---and lazy mode.
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
178 (setq byte-compile-dynamic t byte-compile-dynamic-docstrings t)
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
179 ;; But, we make sure that the code is as zippy as can be.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
180 (setq byte-optimize t)
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
181 ;;
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
182 ;; We use this to preserve or protect things when modifying text properties.
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
183 (defmacro save-buffer-state (varlist &rest body)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
184 "Bind variables according to VARLIST and eval BODY restoring buffer state."
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
185 (` (let* ((,@ (append varlist
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
186 '((modified (buffer-modified-p))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
187 (inhibit-read-only t) (buffer-undo-list t)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
188 before-change-functions after-change-functions
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
189 deactivate-mark buffer-file-name buffer-file-truename))))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
190 (,@ body)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
191 (when (and (not modified) (buffer-modified-p))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
192 (set-buffer-modified-p nil)))))
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
193 (put 'save-buffer-state 'lisp-indent-function 1)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
194 ;;
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
195 ;; We use this to verify that a face should be saved.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
196 (defmacro fast-lock-save-facep (face)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
197 "Return non-nil if FACE is one of `fast-lock-save-faces'."
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
198 (` (or (null fast-lock-save-faces)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
199 (if (symbolp (, face))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
200 (memq (, face) fast-lock-save-faces)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
201 (let ((faces (, face)))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
202 (while (unless (memq (car faces) fast-lock-save-faces)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
203 (setq faces (cdr faces))))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
204 faces))))))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
206 ;(defun fast-lock-submit-bug-report ()
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
207 ; "Submit via mail a bug report on fast-lock.el."
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
208 ; (interactive)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
209 ; (let ((reporter-prompt-for-summary-p t))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
210 ; (reporter-submit-bug-report "simon@gnu.ai.mit.edu" "fast-lock 3.11"
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
211 ; '(fast-lock-cache-directories fast-lock-minimum-size
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
212 ; fast-lock-save-others fast-lock-save-events fast-lock-save-faces
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
213 ; fast-lock-verbose)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
214 ; nil nil
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
215 ; (concat "Hi Si.,
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
216 ;
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
217 ;I want to report a bug. I've read the `Bugs' section of `Info' on Emacs, so I
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
218 ;know how to make a clear and unambiguous report. To reproduce the bug:
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
219 ;
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
220 ;Start a fresh editor via `" invocation-name " -no-init-file -no-site-file'.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
221 ;In the `*scratch*' buffer, evaluate:"))))
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
222
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
223 (defvar fast-lock-mode nil)
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
224 (defvar fast-lock-cache-timestamp nil) ; for saving/reading
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
225 (defvar fast-lock-cache-filename nil) ; for deleting
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
226
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
227 ;; User Variables:
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229 (defvar fast-lock-cache-directories '("." "~/.emacs-flc")
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
230 ; - `internal', keep each file's Font Lock cache file in the same file.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
231 ; - `external', keep each file's Font Lock cache file in the same directory.
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
232 "*Directories in which Font Lock cache files are saved and read.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
233 Each item should be either DIR or a cons pair of the form (REGEXP . DIR) where
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
234 DIR is a directory name (relative or absolute) and REGEXP is a regexp.
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
235
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
236 An attempt will be made to save or read Font Lock cache files using these items
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237 until one succeeds (i.e., until a readable or writable one is found). If an
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 item contains REGEXP, DIR is used only if the buffer file name matches REGEXP.
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 For example:
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240
12909
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
241 (let ((home (expand-file-name (abbreviate-file-name (file-truename \"~/\")))))
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
242 (list (cons (concat \"^\" (regexp-quote home)) \".\") \"~/.emacs-flc\"))
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
243 =>
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
244 ((\"^/your/true/home/directory/\" . \".\") \"~/.emacs-flc\")
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246 would cause a file's current directory to be used if the file is under your
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
247 home directory hierarchy, or otherwise the absolute directory `~/.emacs-flc'.")
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
249 (defvar fast-lock-minimum-size (* 25 1024)
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
250 "*Minimum size of a buffer for cached fontification.
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
251 Only buffers more than this can have associated Font Lock cache files saved.
14374
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
252 If nil, means cache files are never created.
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
253 If a list, each element should be a cons pair of the form (MAJOR-MODE . SIZE),
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
254 where MAJOR-MODE is a symbol or t (meaning the default). For example:
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
255 ((c-mode . 25600) (c++-mode . 25600) (rmail-mode . 1048576))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
256 means that the minimum size is 25K for buffers in C or C++ modes, one megabyte
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
257 for buffers in Rmail mode, and size is irrelevant otherwise.")
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
258
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
259 (defvar fast-lock-save-events '(kill-buffer kill-emacs)
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
260 "*Events under which caches will be saved.
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
261 Valid events are `save-buffer', `kill-buffer' and `kill-emacs'.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
262 If concurrent editing sessions use the same associated cache file for a file's
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
263 buffer, then you should add `save-buffer' to this list.")
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265 (defvar fast-lock-save-others t
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
266 "*If non-nil, save Font Lock cache files irrespective of file owner.
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
267 If nil, means only buffer files known to be owned by you can have associated
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
268 Font Lock cache files saved. Ownership may be unknown for networked files.")
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
270 (defvar fast-lock-save-faces
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
271 (when (save-match-data (string-match "XEmacs" (emacs-version)))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
272 ;; XEmacs uses extents for everything, so we have to pick the right ones.
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
273 font-lock-face-list)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
274 "Faces that will be saved in a Font Lock cache file.
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
275 If nil, means information for all faces will be saved.")
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
276
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
277 (defvar fast-lock-verbose font-lock-verbose
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
278 "*If non-nil, means show status messages for cache processing.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
279 If a number, only buffers greater than this size have processing messages.")
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
281 ;; User Functions:
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
283 ;;;###autoload
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 (defun fast-lock-mode (&optional arg)
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 "Toggle Fast Lock mode.
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 With arg, turn Fast Lock mode on if and only if arg is positive and the buffer
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
287 is associated with a file. Enable it automatically in your `~/.emacs' by:
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
288
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
289 (setq font-lock-support-mode 'fast-lock-mode)
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 If Fast Lock mode is enabled, and the current buffer does not contain any text
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
292 properties, any associated Font Lock cache is used if its timestamp matches the
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
293 buffer's file, and its `font-lock-keywords' match those that you are using.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
295 Font Lock caches may be saved:
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
296 - When you save the file's buffer.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
297 - When you kill an unmodified file's buffer.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
298 - When you exit Emacs, for all unmodified or saved buffers.
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
299 Depending on the value of `fast-lock-save-events'.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
300 See also the commands `fast-lock-read-cache' and `fast-lock-save-cache'.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
302 Use \\[font-lock-fontify-buffer] to fontify the buffer if the cache is bad.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
303
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
304 Various methods of control are provided for the Font Lock cache. In general,
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 see variable `fast-lock-cache-directories' and function `fast-lock-cache-name'.
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
306 For saving, see variables `fast-lock-minimum-size', `fast-lock-save-events',
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
307 `fast-lock-save-others' and `fast-lock-save-faces'."
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 (interactive "P")
13301
0cbf58edd87f Updated to 3.08; don't use `let' var from caller.
Simon Marshall <simon@gnu.org>
parents: 12909
diff changeset
309 ;; Only turn on if we are visiting a file. We could use `buffer-file-name',
0cbf58edd87f Updated to 3.08; don't use `let' var from caller.
Simon Marshall <simon@gnu.org>
parents: 12909
diff changeset
310 ;; but many packages temporarily wrap that to nil when doing their own thing.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 (set (make-local-variable 'fast-lock-mode)
12909
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
312 (and buffer-file-truename
14374
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
313 (not (memq 'fast-lock-mode font-lock-inhibit-thing-lock))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 (if arg (> (prefix-numeric-value arg) 0) (not fast-lock-mode))))
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
315 (if (and fast-lock-mode (not font-lock-mode))
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
316 ;; Turned on `fast-lock-mode' rather than `font-lock-mode'.
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
317 (let ((font-lock-support-mode 'fast-lock-mode))
12909
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
318 (font-lock-mode t))
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
319 ;; Let's get down to business.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
320 (set (make-local-variable 'fast-lock-cache-timestamp) nil)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
321 (set (make-local-variable 'fast-lock-cache-filename) nil)
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
322 (when (and fast-lock-mode (not font-lock-fontified))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
323 (fast-lock-read-cache))))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325 (defun fast-lock-read-cache ()
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
326 "Read the Font Lock cache for the current buffer.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
328 The following criteria must be met for a Font Lock cache file to be read:
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
329 - Fast Lock mode must be turned on in the buffer.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
330 - The buffer must not be modified.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
331 - The buffer's `font-lock-keywords' must match the cache's.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
332 - The buffer file's timestamp must match the cache's.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
333 - Criteria imposed by `fast-lock-cache-directories'.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
334
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
335 See `fast-lock-mode'."
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 (interactive)
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
337 (let ((directories fast-lock-cache-directories)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
338 (modified (buffer-modified-p)) (inhibit-read-only t)
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 (fontified font-lock-fontified))
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 (set (make-local-variable 'font-lock-fontified) nil)
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 ;; Keep trying directories until fontification is turned off.
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 (while (and directories (not font-lock-fontified))
13301
0cbf58edd87f Updated to 3.08; don't use `let' var from caller.
Simon Marshall <simon@gnu.org>
parents: 12909
diff changeset
343 (let ((directory (fast-lock-cache-directory (car directories) nil)))
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
344 (condition-case nil
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
345 (when directory
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
346 (setq fast-lock-cache-filename (fast-lock-cache-name directory))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
347 (when (file-readable-p fast-lock-cache-filename)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
348 (load fast-lock-cache-filename t t t)))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
349 (error nil) (quit nil))
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
350 (setq directories (cdr directories))))
13301
0cbf58edd87f Updated to 3.08; don't use `let' var from caller.
Simon Marshall <simon@gnu.org>
parents: 12909
diff changeset
351 ;; Unset `fast-lock-cache-filename', and restore `font-lock-fontified', if
0cbf58edd87f Updated to 3.08; don't use `let' var from caller.
Simon Marshall <simon@gnu.org>
parents: 12909
diff changeset
352 ;; we don't use a cache. (Note that `fast-lock-cache-data' sets the value
0cbf58edd87f Updated to 3.08; don't use `let' var from caller.
Simon Marshall <simon@gnu.org>
parents: 12909
diff changeset
353 ;; of `fast-lock-cache-timestamp'.)
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 (set-buffer-modified-p modified)
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
355 (unless font-lock-fontified
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
356 (setq fast-lock-cache-filename nil font-lock-fontified fontified))))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
358 (defun fast-lock-save-cache (&optional buffer)
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
359 "Save the Font Lock cache of BUFFER or the current buffer.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
361 The following criteria must be met for a Font Lock cache file to be saved:
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
362 - Fast Lock mode must be turned on in the buffer.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
363 - The event must be one of `fast-lock-save-events'.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
364 - The buffer must be at least `fast-lock-minimum-size' bytes long.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
365 - The buffer file must be owned by you, or `fast-lock-save-others' must be t.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
366 - The buffer must contain at least one `face' text property.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
367 - The buffer must not be modified.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
368 - The buffer file's timestamp must be the same as the file's on disk.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
369 - The on disk file's timestamp must be different than the buffer's cache.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
370 - Criteria imposed by `fast-lock-cache-directories'.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
372 See `fast-lock-mode'."
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 (interactive)
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
374 (save-excursion
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
375 (when buffer
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
376 (set-buffer buffer))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
377 (let ((min-size (font-lock-value-in-major-mode fast-lock-minimum-size))
14374
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
378 (file-timestamp (visited-file-modtime)) (saved nil))
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
379 (when (and fast-lock-mode
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
380 ;;
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
381 ;; "Only save if the buffer matches the file, the file has
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
382 ;; changed, and it was changed by the current emacs session."
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
383 ;;
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
384 ;; Only save if the buffer is not modified,
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
385 ;; (i.e., so we don't save for something not on disk)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
386 (not (buffer-modified-p))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
387 ;; and the file's timestamp is the same as the buffer's,
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
388 ;; (i.e., someone else hasn't written the file in the meantime)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
389 (verify-visited-file-modtime (current-buffer))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
390 ;; and the file's timestamp is different from the cache's.
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
391 ;; (i.e., a save has occurred since the cache was read)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
392 (not (equal fast-lock-cache-timestamp file-timestamp))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
393 ;;
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
394 ;; Only save if user's restrictions are satisfied.
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
395 (and min-size (>= (buffer-size) min-size))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
396 (or fast-lock-save-others
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
397 (eq (user-uid) (nth 2 (file-attributes buffer-file-name))))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
398 ;;
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
399 ;; Only save if there are `face' properties to save.
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
400 (text-property-not-all (point-min) (point-max) 'face nil))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
401 ;;
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
402 ;; Try each directory until we manage to save or the user quits.
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
403 (let ((directories fast-lock-cache-directories))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
404 (while (and directories (memq saved '(nil error)))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
405 (let* ((dir (fast-lock-cache-directory (car directories) t))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
406 (file (and dir (fast-lock-cache-name dir))))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
407 (when (and file (file-writable-p file))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
408 (setq saved (fast-lock-save-cache-1 file file-timestamp)))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
409 (setq directories (cdr directories)))))))))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
411 ;;;###autoload
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412 (defun turn-on-fast-lock ()
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 "Unconditionally turn on Fast Lock mode."
12909
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
414 (fast-lock-mode t))
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
415
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
416 ;;; API Functions:
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
418 (defun fast-lock-after-fontify-buffer ()
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
419 ;; Delete the Font Lock cache file used to restore fontification, if any.
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
420 (when fast-lock-cache-filename
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
421 (if (file-writable-p fast-lock-cache-filename)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
422 (delete-file fast-lock-cache-filename)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
423 (message "File %s font lock cache cannot be deleted" (buffer-name))))
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
424 ;; Flag so that a cache will be saved later even if the file is never saved.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
425 (setq fast-lock-cache-timestamp nil))
14374
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
426
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
427 (defalias 'fast-lock-after-unfontify-buffer
e2423983be05 Support for local fontification.
Simon Marshall <simon@gnu.org>
parents: 14169
diff changeset
428 'ignore)
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
429
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
430 ;; Miscellaneous Functions:
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
431
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
432 (defun fast-lock-save-cache-after-save-file ()
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
433 ;; Do `fast-lock-save-cache' if `save-buffer' is on `fast-lock-save-events'.
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
434 (when (memq 'save-buffer fast-lock-save-events)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
435 (fast-lock-save-cache)))
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
436
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
437 (defun fast-lock-save-cache-before-kill-buffer ()
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
438 ;; Do `fast-lock-save-cache' if `kill-buffer' is on `fast-lock-save-events'.
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
439 (when (memq 'kill-buffer fast-lock-save-events)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
440 (fast-lock-save-cache)))
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
441
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
442 (defun fast-lock-save-caches-before-kill-emacs ()
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
443 ;; Do `fast-lock-save-cache's if `kill-emacs' is on `fast-lock-save-events'.
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
444 (when (memq 'kill-emacs fast-lock-save-events)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
445 (mapcar 'fast-lock-save-cache (buffer-list))))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
447 (defun fast-lock-cache-directory (directory create)
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
448 "Return usable directory based on DIRECTORY.
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
449 Returns nil if the directory does not exist, or, if CREATE non-nil, cannot be
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
450 created. DIRECTORY may be a string or a cons pair of the form (REGEXP . DIR).
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451 See `fast-lock-cache-directories'."
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
452 (let ((dir
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
453 (cond ((not buffer-file-name)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
454 ;; Should never be nil, but `crypt++' screws it up.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
455 nil)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
456 ((stringp directory)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
457 ;; Just a directory.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
458 directory)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
459 (t
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
460 ;; A directory iff the file name matches the regexp.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
461 (let ((bufile (expand-file-name buffer-file-truename))
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
462 (case-fold-search nil))
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
463 (when (save-match-data (string-match (car directory) bufile))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
464 (cdr directory)))))))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
465 (cond ((not dir)
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
466 nil)
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
467 ((file-accessible-directory-p dir)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
468 dir)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
469 (create
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
470 (condition-case nil
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
471 (progn (make-directory dir t) dir)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
472 (error nil))))))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473
12909
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
474 ;; If you are wondering why we only hash if the directory is not ".", rather
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
475 ;; than if `file-name-absolute-p', it is because if we just appended ".flc" for
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
476 ;; relative cache directories (that are not ".") then it is possible that more
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
477 ;; than one file would have the same cache name in that directory, if the luser
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
478 ;; made a link from one relative cache directory to another. (Phew!)
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
479 (defun fast-lock-cache-name (directory)
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
480 "Return full cache path name using caching DIRECTORY.
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
481 If DIRECTORY is `.', the path is the buffer file name appended with `.flc'.
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
482 Otherwise, the path name is constructed from DIRECTORY and the buffer's true
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
483 abbreviated file name, with all `/' characters in the name replaced with `#'
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
484 characters, and appended with `.flc'.
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
485
12909
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
486 If the same file has different cache path names when edited on different
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
487 machines, e.g., on one machine the cache file name has the prefix `#home',
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
488 perhaps due to automount, try putting in your `~/.emacs' something like:
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
489
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
490 (setq directory-abbrev-alist (cons '(\"^/home/\" . \"/\") directory-abbrev-alist))
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
491
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
492 Emacs automagically removes the common `/tmp_mnt' automount prefix by default.
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
493
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
494 See `fast-lock-cache-directory'."
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
495 (if (string-equal directory ".")
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
496 (concat buffer-file-name ".flc")
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
497 (let* ((bufile (expand-file-name buffer-file-truename))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
498 (chars-alist
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
499 (if (eq system-type 'emx)
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
500 '((?/ . (?#)) (?# . (?# ?#)) (?: . (?\;)) (?\; . (?\; ?\;)))
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
501 '((?/ . (?#)) (?# . (?# ?#)))))
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
502 (mapchars
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
503 (function (lambda (c) (or (cdr (assq c chars-alist)) (list c))))))
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
504 (concat
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
505 (file-name-as-directory (expand-file-name directory))
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
506 (mapconcat 'char-to-string (apply 'append (mapcar mapchars bufile)) "")
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
507 ".flc"))))
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
508
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
509 ;; Font Lock Cache Processing Functions:
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
510
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
511 (defun fast-lock-save-cache-1 (file timestamp)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
512 ;; Save the FILE with the TIMESTAMP as:
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
513 ;; (fast-lock-cache-data Version=2 TIMESTAMP font-lock-keywords PROPERTIES).
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
514 ;; Returns non-nil if a save was attempted to a writable cache file.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
515 (let ((tpbuf (generate-new-buffer " *fast-lock*"))
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
516 (verbose (if (numberp fast-lock-verbose)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
517 (> (buffer-size) fast-lock-verbose)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
518 fast-lock-verbose))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
519 (saved t))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
520 (if verbose (message "Saving %s font lock cache..." (buffer-name)))
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
521 (condition-case nil
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
522 (save-excursion
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
523 (print (list 'fast-lock-cache-data 2
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
524 (list 'quote timestamp)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
525 (list 'quote font-lock-keywords)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
526 (list 'quote (fast-lock-get-face-properties)))
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
527 tpbuf)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
528 (set-buffer tpbuf)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
529 (write-region (point-min) (point-max) file nil 'quietly)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
530 (setq fast-lock-cache-timestamp timestamp
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
531 fast-lock-cache-filename file))
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
532 (error (setq saved 'error)) (quit (setq saved 'quit)))
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
533 (kill-buffer tpbuf)
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
534 (if verbose (message "Saving %s font lock cache...%s" (buffer-name)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
535 (cond ((eq saved 'error) "failed")
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
536 ((eq saved 'quit) "aborted")
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
537 (t "done"))))
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
538 ;; We return non-nil regardless of whether a failure occurred.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
539 saved))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
540
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
541 (defun fast-lock-cache-data (version timestamp keywords properties
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
542 &rest ignored)
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
543 ;; Change from (HIGH LOW) for back compatibility. Remove for version 3!
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
544 (when (consp (cdr-safe timestamp))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
545 (setcdr timestamp (nth 1 timestamp)))
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
546 ;; Compile KEYWORDS and `font-lock-keywords' in case one is and one isn't.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
547 (let ((current font-lock-keywords))
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
548 (setq keywords (font-lock-compile-keywords keywords)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
549 font-lock-keywords (font-lock-compile-keywords current)))
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
550 ;; Use the Font Lock cache PROPERTIES if we're using cache VERSION format 2,
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
551 ;; the current buffer's file timestamp matches the TIMESTAMP, and the current
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
552 ;; buffer's font-lock-keywords are the same as KEYWORDS.
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
553 (let ((buf-timestamp (visited-file-modtime))
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
554 (verbose (if (numberp fast-lock-verbose)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
555 (> (buffer-size) fast-lock-verbose)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
556 fast-lock-verbose))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
557 (loaded t))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
558 (if (or (/= version 2)
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
559 (buffer-modified-p)
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
560 (not (equal timestamp buf-timestamp))
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
561 (not (equal keywords font-lock-keywords)))
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
562 (setq loaded nil)
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
563 (if verbose (message "Loading %s font lock cache..." (buffer-name)))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
564 (condition-case nil
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
565 (fast-lock-set-face-properties properties)
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
566 (error (setq loaded 'error)) (quit (setq loaded 'quit)))
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
567 (if verbose (message "Loading %s font lock cache...%s" (buffer-name)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
568 (cond ((eq loaded 'error) "failed")
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
569 ((eq loaded 'quit) "aborted")
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
570 (t "done")))))
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
571 (setq font-lock-fontified (eq loaded t)
13301
0cbf58edd87f Updated to 3.08; don't use `let' var from caller.
Simon Marshall <simon@gnu.org>
parents: 12909
diff changeset
572 fast-lock-cache-timestamp (and (eq loaded t) timestamp))))
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
573
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
574 ;; Text Properties Processing Functions:
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
575
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
576 ;; This is fast, but fails if adjacent characters have different `face' text
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
577 ;; properties. Maybe that's why I dropped it in the first place?
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
578 ;(defun fast-lock-get-face-properties ()
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
579 ; "Return a list of all `face' text properties in the current buffer.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
580 ;Each element of the list is of the form (VALUE START1 END1 START2 END2 ...)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
581 ;where VALUE is a `face' property value and STARTx and ENDx are positions."
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
582 ; (save-restriction
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
583 ; (widen)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
584 ; (let ((start (text-property-not-all (point-min) (point-max) 'face nil))
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
585 ; (limit (point-max)) end properties value cell)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
586 ; (while start
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
587 ; (setq end (next-single-property-change start 'face nil limit)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
588 ; value (get-text-property start 'face))
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
589 ; ;; Make, or add to existing, list of regions with same `face'.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
590 ; (if (setq cell (assq value properties))
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
591 ; (setcdr cell (cons start (cons end (cdr cell))))
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
592 ; (setq properties (cons (list value start end) properties)))
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
593 ; (setq start (next-single-property-change end 'face)))
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
594 ; properties)))
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
595
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
596 ;; This is slow, but copes if adjacent characters have different `face' text
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
597 ;; properties, but fails if they are lists.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
598 ;(defun fast-lock-get-face-properties ()
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
599 ; "Return a list of all `face' text properties in the current buffer.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
600 ;Each element of the list is of the form (VALUE START1 END1 START2 END2 ...)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
601 ;where VALUE is a `face' property value and STARTx and ENDx are positions.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
602 ;Only those `face' VALUEs in `fast-lock-save-faces' are returned."
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
603 ; (save-restriction
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
604 ; (widen)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
605 ; (let ((faces (or fast-lock-save-faces (face-list))) (limit (point-max))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
606 ; properties regions face start end)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
607 ; (while faces
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
608 ; (setq face (car faces) faces (cdr faces) regions () end (point-min))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
609 ; ;; Make a list of start/end regions with `face' property face.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
610 ; (while (setq start (text-property-any end limit 'face face))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
611 ; (setq end (or (text-property-not-all start limit 'face face) limit)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
612 ; regions (cons start (cons end regions))))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
613 ; ;; Add `face' face's regions, if any, to properties.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
614 ; (when regions
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
615 ; (push (cons face regions) properties)))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
616 ; properties)))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
617
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
618 (defun fast-lock-get-face-properties ()
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
619 "Return a list of all `face' text properties in the current buffer.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
620 Each element of the list is of the form (VALUE START1 END1 START2 END2 ...)
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
621 where VALUE is a `face' property value and STARTx and ENDx are positions."
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
622 (save-restriction
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
623 (widen)
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
624 (let ((start (text-property-not-all (point-min) (point-max) 'face nil))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
625 end properties value cell)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
626 (while start
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
627 (setq end (next-single-property-change start 'face nil (point-max))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
628 value (get-text-property start 'face))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
629 ;; Make, or add to existing, list of regions with same `face'.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
630 (cond ((setq cell (assoc value properties))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
631 (setcdr cell (cons start (cons end (cdr cell)))))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
632 ((fast-lock-save-facep value)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
633 (push (list value start end) properties)))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
634 (setq start (text-property-not-all end (point-max) 'face nil)))
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
635 properties)))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
636
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
637 (defun fast-lock-set-face-properties (properties)
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
638 "Set all `face' text properties to PROPERTIES in the current buffer.
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
639 Any existing `face' text properties are removed first.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
640 See `fast-lock-get-face-properties' for the format of PROPERTIES."
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
641 (save-buffer-state (plist regions)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
642 (save-restriction
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
643 (widen)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
644 (font-lock-unfontify-region (point-min) (point-max))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
645 (while properties
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
646 (setq plist (list 'face (car (car properties)))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
647 regions (cdr (car properties))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
648 properties (cdr properties))
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
649 ;; Set the `face' property for each start/end region.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
650 (while regions
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
651 (set-text-properties (nth 0 regions) (nth 1 regions) plist)
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
652 (setq regions (nthcdr 2 regions)))))))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
653
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
654 ;; Functions for XEmacs:
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
655
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
656 (when (save-match-data (string-match "XEmacs" (emacs-version)))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
657 ;;
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
658 ;; It would be better to use XEmacs' `map-extents' over extents with a
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
659 ;; `font-lock' property, but `face' properties are on different extents.
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
660 (defun fast-lock-get-face-properties ()
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
661 "Return a list of all `face' text properties in the current buffer.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
662 Each element of the list is of the form (VALUE START1 END1 START2 END2 ...)
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
663 where VALUE is a `face' property value and STARTx and ENDx are positions.
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
664 Only those `face' VALUEs in `fast-lock-save-faces' are returned."
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
665 (save-restriction
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
666 (widen)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
667 (let ((properties ()) cell)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
668 (map-extents
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
669 (function (lambda (extent ignore)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
670 (let ((value (extent-face extent)))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
671 ;; We're only interested if it's one of `fast-lock-save-faces'.
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
672 (when (and value (fast-lock-save-facep value))
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
673 (let ((start (extent-start-position extent))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
674 (end (extent-end-position extent)))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
675 ;; Make or add to existing list of regions with the same
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
676 ;; `face' property value.
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
677 (if (setq cell (assoc value properties))
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
678 (setcdr cell (cons start (cons end (cdr cell))))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
679 (push (list value start end) properties))))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
680 ;; Return nil to keep `map-extents' going.
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
681 nil))))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
682 properties)))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
683 ;;
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
684 ;; Make extents just like XEmacs' font-lock.el does.
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
685 (defun fast-lock-set-face-properties (properties)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
686 "Set all `face' text properties to PROPERTIES in the current buffer.
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
687 Any existing `face' text properties are removed first.
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
688 See `fast-lock-get-face-properties' for the format of PROPERTIES."
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
689 (save-restriction
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
690 (widen)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
691 (font-lock-unfontify-region (point-min) (point-max))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
692 (while properties
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
693 (let ((face (car (car properties)))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
694 (regions (cdr (car properties))))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
695 ;; Set the `face' property, etc., for each start/end region.
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
696 (while regions
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
697 (font-lock-set-face (nth 0 regions) (nth 1 regions) face)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
698 (setq regions (nthcdr 2 regions)))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
699 (setq properties (cdr properties))))))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
700 ;;
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
701 ;; XEmacs 19.12 font-lock.el's `font-lock-fontify-buffer' runs a hook.
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
702 (add-hook 'font-lock-after-fontify-buffer-hook
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
703 'fast-lock-after-fontify-buffer))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
704
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
705 (unless (boundp 'font-lock-inhibit-thing-lock)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
706 (defvar font-lock-inhibit-thing-lock nil
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
707 "List of Font Lock mode related modes that should not be turned on."))
12909
0e165bcd43a2 New version 3.07. Made fast-lock-mode use buffer-file-truename, not buffer-file-name.
Simon Marshall <simon@gnu.org>
parents: 12048
diff changeset
708
16579
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
709 (unless (fboundp 'font-lock-value-in-major-mode)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
710 (defun font-lock-value-in-major-mode (alist)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
711 ;; Return value in ALIST for `major-mode'.
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
712 (if (consp alist)
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
713 (cdr (or (assq major-mode alist) (assq t alist)))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
714 alist)))
aadb4abdeaaa (a) make fast-lock-get-face-properties cope with face property lists, (b) add fast-lock-verbose to control messages.
Simon Marshall <simon@gnu.org>
parents: 15498
diff changeset
715
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
716 (unless (fboundp 'font-lock-compile-keywords)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
717 (defalias 'font-lock-compile-keywords 'identity))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
718
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
719 ;; Install ourselves:
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
720
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
721 (add-hook 'after-save-hook 'fast-lock-save-cache-after-save-file)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
722 (add-hook 'kill-buffer-hook 'fast-lock-save-cache-before-kill-buffer)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
723 (add-hook 'kill-emacs-hook 'fast-lock-save-caches-before-kill-emacs)
12048
8e3d4f515bbb New version 3.06 from author.
Simon Marshall <simon@gnu.org>
parents: 10243
diff changeset
724
15498
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
725 ;;;###autoload
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
726 (if (fboundp 'add-minor-mode) (add-minor-mode 'fast-lock-mode nil))
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
727 ;;;###dont-autoload
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
728 (unless (assq 'fast-lock-mode minor-mode-alist)
4cd3efec2909 Protect before- and after-change-functions when updating text properties.
Simon Marshall <simon@gnu.org>
parents: 14374
diff changeset
729 (setq minor-mode-alist (append minor-mode-alist '((fast-lock-mode nil)))))
10243
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
730
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
731 ;; Provide ourselves:
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
732
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
733 (provide 'fast-lock)
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
734
ea9dda158056 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
735 ;;; fast-lock.el ends here