Mercurial > emacs
annotate lisp/jit-lock.el @ 107777:13c077500eb3
2010-04-04 John Wiegley <jwiegley@gmail.com>
* ido.el (ido-use-virtual-buffers): New variable to indicate
whether "virtual buffer" support is enabled for IDO. Essentially
it works as follows: Say you are visiting a file and the buffer
gets cleaned up by mignight.el. Later, you want to switch to that
buffer, but find it's no longer open. With virtual buffers
enabled, the buffer name stays in the buffer list (using the
ido-virtual face, and always at the end), and if you select it, it
opens the file back up again. This allows you to think less about
whether recently opened files are still open or not. Most of the
time you can quit Emacs, restart, and then switch to a file buffer
that was previously open as if it still were. NOTE: This feature
has been present in iswitchb for several years now, and I'm
porting the same logic to IDO.
(ido-virtual): Face used to indicate virtual buffers in the list.
(ido-buffer-internal): If a buffer is chosen, and no such buffer
exists, but a virtual buffer of that name does (which would be why
it was in the list), recreate the buffer by reopening the file.
(ido-make-buffer-list): If virtual buffers are being used, call
`ido-add-virtual-buffers-to-list' before the make list hook.
(ido-virtual-buffers): New variable which contains a copy of the
current contents of the `recentf-list', albeit pared down for the
sake of speed, and with proper faces applied.
(ido-add-virtual-buffers-to-list): Using the `recentf-list',
create a list of "virtual buffers" to present to the user in
addition to the currently open set. Note that this logic could
get rather slow if that list is too large. With the default
`recentf-max-saved-items' of 200, there is little speed penalty.
author | jwiegley@gmail.com |
---|---|
date | Sun, 04 Apr 2010 02:55:19 -0400 |
parents | 1d1d5d9bd884 |
children | 280c8ae2476d 376148b31b5e |
rev | line source |
---|---|
38436
b174db545cfd
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
37781
diff
changeset
|
1 ;;; jit-lock.el --- just-in-time fontification |
25003 | 2 |
64762
41bb365f41c4
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64091
diff
changeset
|
3 ;; Copyright (C) 1998, 2000, 2001, 2002, 2003, 2004, |
106815 | 4 ;; 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
25003 | 5 |
6 ;; Author: Gerd Moellmann <gerd@gnu.org> | |
7 ;; Keywords: faces files | |
8 | |
9 ;; This file is part of GNU Emacs. | |
10 | |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
79721
diff
changeset
|
11 ;; GNU Emacs is free software: you can redistribute it and/or modify |
25003 | 12 ;; it under the terms of the GNU General Public License as published by |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
79721
diff
changeset
|
13 ;; the Free Software Foundation, either version 3 of the License, or |
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
79721
diff
changeset
|
14 ;; (at your option) any later version. |
25003 | 15 |
16 ;; GNU Emacs is distributed in the hope that it will be useful, | |
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 ;; GNU General Public License for more details. | |
20 | |
21 ;; You should have received a copy of the GNU General Public License | |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
79721
diff
changeset
|
22 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. |
25003 | 23 |
24 ;;; Commentary: | |
25 | |
26 ;; Just-in-time fontification, triggered by C redisplay code. | |
27 | |
28 ;;; Code: | |
29 | |
30 | |
31 (eval-when-compile | |
72248
a1a0b1eed3a8
(jit-lock-fontify-now): Preserve the buffer's
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
72231
diff
changeset
|
32 (require 'cl) |
a1a0b1eed3a8
(jit-lock-fontify-now): Preserve the buffer's
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
72231
diff
changeset
|
33 |
28501
030a9790d290
(with-buffer-unmodified): New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
28208
diff
changeset
|
34 (defmacro with-buffer-unmodified (&rest body) |
030a9790d290
(with-buffer-unmodified): New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
28208
diff
changeset
|
35 "Eval BODY, preserving the current buffer's modified state." |
53756
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
36 (declare (debug t)) |
28501
030a9790d290
(with-buffer-unmodified): New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
28208
diff
changeset
|
37 (let ((modified (make-symbol "modified"))) |
030a9790d290
(with-buffer-unmodified): New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
28208
diff
changeset
|
38 `(let ((,modified (buffer-modified-p))) |
32152
00f38571e2b1
(with-buffer-unmodified): Use unwind-protect.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29827
diff
changeset
|
39 (unwind-protect |
00f38571e2b1
(with-buffer-unmodified): Use unwind-protect.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29827
diff
changeset
|
40 (progn ,@body) |
00f38571e2b1
(with-buffer-unmodified): Use unwind-protect.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29827
diff
changeset
|
41 (unless ,modified |
00f38571e2b1
(with-buffer-unmodified): Use unwind-protect.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29827
diff
changeset
|
42 (restore-buffer-modified-p nil)))))) |
49597
e88404e8f2cf
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47725
diff
changeset
|
43 |
29799
baa52c9029f6
(with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29708
diff
changeset
|
44 (defmacro with-buffer-prepared-for-jit-lock (&rest body) |
25003 | 45 "Execute BODY in current buffer, overriding several variables. |
46 Preserves the `buffer-modified-p' state of the current buffer." | |
53756
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
47 (declare (debug t)) |
102043
e30b05317b87
(with-buffer-prepared-for-jit-lock): Swap the `let' and
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
48 `(let ((buffer-undo-list t) |
e30b05317b87
(with-buffer-prepared-for-jit-lock): Swap the `let' and
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
49 (inhibit-read-only t) |
e30b05317b87
(with-buffer-prepared-for-jit-lock): Swap the `let' and
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
50 (inhibit-point-motion-hooks t) |
e30b05317b87
(with-buffer-prepared-for-jit-lock): Swap the `let' and
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
51 (inhibit-modification-hooks t) |
e30b05317b87
(with-buffer-prepared-for-jit-lock): Swap the `let' and
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
52 deactivate-mark |
e30b05317b87
(with-buffer-prepared-for-jit-lock): Swap the `let' and
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
53 buffer-file-name |
e30b05317b87
(with-buffer-prepared-for-jit-lock): Swap the `let' and
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
54 buffer-file-truename) |
e30b05317b87
(with-buffer-prepared-for-jit-lock): Swap the `let' and
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
55 ;; Do reset the modification status from within the let, since |
e30b05317b87
(with-buffer-prepared-for-jit-lock): Swap the `let' and
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
56 ;; otherwise set-buffer-modified-p may try to unlock the file. |
e30b05317b87
(with-buffer-prepared-for-jit-lock): Swap the `let' and
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
57 (with-buffer-unmodified |
e30b05317b87
(with-buffer-prepared-for-jit-lock): Swap the `let' and
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
58 ,@body)))) |
28501
030a9790d290
(with-buffer-unmodified): New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
28208
diff
changeset
|
59 |
49597
e88404e8f2cf
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47725
diff
changeset
|
60 |
25003 | 61 |
62 ;;; Customization. | |
63 | |
53709
f790b749630e
(jit-lock): Move group declaration from font-lock.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52401
diff
changeset
|
64 (defgroup jit-lock nil |
f790b749630e
(jit-lock): Move group declaration from font-lock.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52401
diff
changeset
|
65 "Font Lock support mode to fontify just-in-time." |
f790b749630e
(jit-lock): Move group declaration from font-lock.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52401
diff
changeset
|
66 :version "21.1" |
f790b749630e
(jit-lock): Move group declaration from font-lock.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52401
diff
changeset
|
67 :group 'font-lock) |
f790b749630e
(jit-lock): Move group declaration from font-lock.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52401
diff
changeset
|
68 |
25003 | 69 (defcustom jit-lock-chunk-size 500 |
100171 | 70 "Jit-lock fontifies chunks of at most this many characters at a time. |
67923
ea28d90f5964
(jit-lock-chunk-size): Doc fix.
Eli Zaretskii <eliz@gnu.org>
parents:
66579
diff
changeset
|
71 |
ea28d90f5964
(jit-lock-chunk-size): Doc fix.
Eli Zaretskii <eliz@gnu.org>
parents:
66579
diff
changeset
|
72 This variable controls both display-time and stealth fontification." |
25003 | 73 :type 'integer |
74 :group 'jit-lock) | |
75 | |
76 | |
76291
7d2b5814cd4e
* NEWS (fontification): Mention that the new default for
David Kastrup <dak@gnu.org>
parents:
75347
diff
changeset
|
77 (defcustom jit-lock-stealth-time nil |
100171 | 78 "Time in seconds to wait before beginning stealth fontification. |
25003 | 79 Stealth fontification occurs if there is no input within this time. |
32581
38b7e156a71f
(jit-lock-stealth-time): Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents:
32531
diff
changeset
|
80 If nil, stealth fontification is never performed. |
25003 | 81 |
82 The value of this variable is used when JIT Lock mode is turned on." | |
83 :type '(choice (const :tag "never" nil) | |
76291
7d2b5814cd4e
* NEWS (fontification): Mention that the new default for
David Kastrup <dak@gnu.org>
parents:
75347
diff
changeset
|
84 (number :tag "seconds" :value 16)) |
25003 | 85 :group 'jit-lock) |
86 | |
87 | |
61746
86d97731e558
(jit-lock-stealth-time): Change default value to 16.
Eli Zaretskii <eliz@gnu.org>
parents:
60461
diff
changeset
|
88 (defcustom jit-lock-stealth-nice 0.5 |
100171 | 89 "Time in seconds to pause between chunks of stealth fontification. |
25003 | 90 Each iteration of stealth fontification is separated by this amount of time, |
91 thus reducing the demand that stealth fontification makes on the system. | |
92 If nil, means stealth fontification is never paused. | |
93 To reduce machine load during stealth fontification, at the cost of stealth | |
94 taking longer to fontify, you could increase the value of this variable. | |
95 See also `jit-lock-stealth-load'." | |
96 :type '(choice (const :tag "never" nil) | |
49597
e88404e8f2cf
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47725
diff
changeset
|
97 (number :tag "seconds")) |
25003 | 98 :group 'jit-lock) |
49597
e88404e8f2cf
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47725
diff
changeset
|
99 |
25003 | 100 |
101 (defcustom jit-lock-stealth-load | |
102 (if (condition-case nil (load-average) (error)) 200) | |
100171 | 103 "Load in percentage above which stealth fontification is suspended. |
25003 | 104 Stealth fontification pauses when the system short-term load average (as |
105 returned by the function `load-average' if supported) goes above this level, | |
106 thus reducing the demand that stealth fontification makes on the system. | |
107 If nil, means stealth fontification is never suspended. | |
108 To reduce machine load during stealth fontification, at the cost of stealth | |
109 taking longer to fontify, you could reduce the value of this variable. | |
110 See also `jit-lock-stealth-nice'." | |
111 :type (if (condition-case nil (load-average) (error)) | |
112 '(choice (const :tag "never" nil) | |
113 (integer :tag "load")) | |
114 '(const :format "%t: unsupported\n" nil)) | |
115 :group 'jit-lock) | |
116 | |
117 | |
118 (defcustom jit-lock-stealth-verbose nil | |
100171 | 119 "If non-nil, means stealth fontification should show status messages." |
25003 | 120 :type 'boolean |
121 :group 'jit-lock) | |
122 | |
123 | |
53755
9bd36e762e48
(jit-lock-stealth-fontify): Allow quit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53709
diff
changeset
|
124 (defvaralias 'jit-lock-defer-contextually 'jit-lock-contextually) |
9bd36e762e48
(jit-lock-stealth-fontify): Allow quit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53709
diff
changeset
|
125 (defcustom jit-lock-contextually 'syntax-driven |
100171 | 126 "If non-nil, means fontification should be syntactically true. |
53755
9bd36e762e48
(jit-lock-stealth-fontify): Allow quit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53709
diff
changeset
|
127 If nil, means fontification occurs only on those lines modified. This |
25003 | 128 means where modification on a line causes syntactic change on subsequent lines, |
129 those subsequent lines are not refontified to reflect their new context. | |
53755
9bd36e762e48
(jit-lock-stealth-fontify): Allow quit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53709
diff
changeset
|
130 If t, means fontification occurs on those lines modified and all |
25003 | 131 subsequent lines. This means those subsequent lines are refontified to reflect |
53756
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
132 their new syntactic context, after `jit-lock-context-time' seconds. |
53755
9bd36e762e48
(jit-lock-stealth-fontify): Allow quit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53709
diff
changeset
|
133 If any other value, e.g., `syntax-driven', means syntactically true |
25003 | 134 fontification occurs only if syntactic fontification is performed using the |
135 buffer mode's syntax table, i.e., only if `font-lock-keywords-only' is nil. | |
136 | |
137 The value of this variable is used when JIT Lock mode is turned on." | |
138 :type '(choice (const :tag "never" nil) | |
139 (const :tag "always" t) | |
140 (other :tag "syntax-driven" syntax-driven)) | |
141 :group 'jit-lock) | |
142 | |
53756
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
143 (defcustom jit-lock-context-time 0.5 |
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
144 "Idle time after which text is contextually refontified, if applicable." |
62531
c905fcf5e3d9
Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents:
61746
diff
changeset
|
145 :type '(number :tag "seconds") |
c905fcf5e3d9
Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents:
61746
diff
changeset
|
146 :group 'jit-lock) |
c905fcf5e3d9
Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents:
61746
diff
changeset
|
147 |
41502
828432e1e1d4
Modify a commented-out non-nil value of jit-lock-defer-time, to
Eli Zaretskii <eliz@gnu.org>
parents:
41336
diff
changeset
|
148 (defcustom jit-lock-defer-time nil ;; 0.25 |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
149 "Idle time after which deferred fontification should take place. |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
150 If nil, fontification is not deferred." |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
151 :group 'jit-lock |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
152 :type '(choice (const :tag "never" nil) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
153 (number :tag "seconds"))) |
25003 | 154 |
155 ;;; Variables that are not customizable. | |
156 | |
157 (defvar jit-lock-mode nil | |
158 "Non-nil means Just-in-time Lock mode is active.") | |
159 (make-variable-buffer-local 'jit-lock-mode) | |
160 | |
32152
00f38571e2b1
(with-buffer-unmodified): Use unwind-protect.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29827
diff
changeset
|
161 (defvar jit-lock-functions nil |
00f38571e2b1
(with-buffer-unmodified): Use unwind-protect.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29827
diff
changeset
|
162 "Functions to do the actual fontification. |
00f38571e2b1
(with-buffer-unmodified): Use unwind-protect.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29827
diff
changeset
|
163 They are called with two arguments: the START and END of the region to fontify.") |
32305
ca771411a7fd
Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32181
diff
changeset
|
164 (make-variable-buffer-local 'jit-lock-functions) |
25003 | 165 |
53709
f790b749630e
(jit-lock): Move group declaration from font-lock.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52401
diff
changeset
|
166 (defvar jit-lock-context-unfontify-pos nil |
32305
ca771411a7fd
Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32181
diff
changeset
|
167 "Consider text after this position as contextually unfontified. |
29799
baa52c9029f6
(with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29708
diff
changeset
|
168 If nil, contextual fontification is disabled.") |
53709
f790b749630e
(jit-lock): Move group declaration from font-lock.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52401
diff
changeset
|
169 (make-variable-buffer-local 'jit-lock-context-unfontify-pos) |
25003 | 170 |
171 | |
172 (defvar jit-lock-stealth-timer nil | |
173 "Timer for stealth fontification in Just-in-time Lock mode.") | |
72508
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
174 (defvar jit-lock-stealth-repeat-timer nil |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
175 "Timer for repeated stealth fontification in Just-in-time Lock mode.") |
53756
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
176 (defvar jit-lock-context-timer nil |
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
177 "Timer for context fontification in Just-in-time Lock mode.") |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
178 (defvar jit-lock-defer-timer nil |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
179 "Timer for deferred fontification in Just-in-time Lock mode.") |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
180 |
53709
f790b749630e
(jit-lock): Move group declaration from font-lock.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52401
diff
changeset
|
181 (defvar jit-lock-defer-buffers nil |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
182 "List of buffers with pending deferred fontification.") |
72508
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
183 (defvar jit-lock-stealth-buffers nil |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
184 "List of buffers that are being fontified stealthily.") |
25003 | 185 |
186 ;;; JIT lock mode | |
187 | |
188 (defun jit-lock-mode (arg) | |
189 "Toggle Just-in-time Lock mode. | |
29799
baa52c9029f6
(with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29708
diff
changeset
|
190 Turn Just-in-time Lock mode on if and only if ARG is non-nil. |
25003 | 191 Enable it automatically by customizing group `font-lock'. |
192 | |
193 When Just-in-time Lock mode is enabled, fontification is different in the | |
194 following ways: | |
195 | |
196 - Demand-driven buffer fontification triggered by Emacs C code. | |
197 This means initial fontification of the whole buffer does not occur. | |
198 Instead, fontification occurs when necessary, such as when scrolling | |
199 through the buffer would otherwise reveal unfontified areas. This is | |
200 useful if buffer fontification is too slow for large buffers. | |
201 | |
202 - Stealthy buffer fontification if `jit-lock-stealth-time' is non-nil. | |
203 This means remaining unfontified areas of buffers are fontified if Emacs has | |
204 been idle for `jit-lock-stealth-time' seconds, while Emacs remains idle. | |
205 This is useful if any buffer has any deferred fontification. | |
206 | |
53755
9bd36e762e48
(jit-lock-stealth-fontify): Allow quit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53709
diff
changeset
|
207 - Deferred context fontification if `jit-lock-contextually' is |
25003 | 208 non-nil. This means fontification updates the buffer corresponding to |
53756
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
209 true syntactic context, after `jit-lock-context-time' seconds of Emacs |
25003 | 210 idle time, while Emacs remains idle. Otherwise, fontification occurs |
211 on modified lines only, and subsequent lines can remain fontified | |
212 corresponding to previous syntactic contexts. This is useful where | |
213 strings or comments span lines. | |
214 | |
215 Stealth fontification only occurs while the system remains unloaded. | |
216 If the system load rises above `jit-lock-stealth-load' percent, stealth | |
217 fontification is suspended. Stealth fontification intensity is controlled via | |
29413
ce16b083b459
(jit-lock-saved-fontify-buffer-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29288
diff
changeset
|
218 the variable `jit-lock-stealth-nice'." |
29799
baa52c9029f6
(with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29708
diff
changeset
|
219 (setq jit-lock-mode arg) |
baa52c9029f6
(with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29708
diff
changeset
|
220 (cond (;; Turn Just-in-time Lock mode on. |
baa52c9029f6
(with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29708
diff
changeset
|
221 jit-lock-mode |
25003 | 222 |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
223 ;; Mark the buffer for refontification. |
32305
ca771411a7fd
Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32181
diff
changeset
|
224 (jit-lock-refontify) |
29413
ce16b083b459
(jit-lock-saved-fontify-buffer-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29288
diff
changeset
|
225 |
25003 | 226 ;; Install an idle timer for stealth fontification. |
32181
f3afd1ff75a8
(jit-lock-mode): Use jit-lock-defer-contextually
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32157
diff
changeset
|
227 (when (and jit-lock-stealth-time (null jit-lock-stealth-timer)) |
29413
ce16b083b459
(jit-lock-saved-fontify-buffer-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29288
diff
changeset
|
228 (setq jit-lock-stealth-timer |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
229 (run-with-idle-timer jit-lock-stealth-time t |
25003 | 230 'jit-lock-stealth-fontify))) |
231 | |
72508
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
232 ;; Create, but do not activate, the idle timer for repeated |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
233 ;; stealth fontification. |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
234 (when (and jit-lock-stealth-time (null jit-lock-stealth-repeat-timer)) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
235 (setq jit-lock-stealth-repeat-timer (timer-create)) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
236 (timer-set-function jit-lock-stealth-repeat-timer |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
237 'jit-lock-stealth-fontify '(t))) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
238 |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
239 ;; Init deferred fontification timer. |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
240 (when (and jit-lock-defer-time (null jit-lock-defer-timer)) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
241 (setq jit-lock-defer-timer |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
242 (run-with-idle-timer jit-lock-defer-time t |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
243 'jit-lock-deferred-fontify))) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
244 |
53709
f790b749630e
(jit-lock): Move group declaration from font-lock.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52401
diff
changeset
|
245 ;; Initialize contextual fontification if requested. |
53755
9bd36e762e48
(jit-lock-stealth-fontify): Allow quit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53709
diff
changeset
|
246 (when (eq jit-lock-contextually t) |
53756
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
247 (unless jit-lock-context-timer |
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
248 (setq jit-lock-context-timer |
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
249 (run-with-idle-timer jit-lock-context-time t |
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
250 'jit-lock-context-fontify))) |
53709
f790b749630e
(jit-lock): Move group declaration from font-lock.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52401
diff
changeset
|
251 (setq jit-lock-context-unfontify-pos |
f790b749630e
(jit-lock): Move group declaration from font-lock.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52401
diff
changeset
|
252 (or jit-lock-context-unfontify-pos (point-max)))) |
29799
baa52c9029f6
(with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29708
diff
changeset
|
253 |
32305
ca771411a7fd
Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32181
diff
changeset
|
254 ;; Setup our hooks. |
29799
baa52c9029f6
(with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29708
diff
changeset
|
255 (add-hook 'after-change-functions 'jit-lock-after-change nil t) |
25003 | 256 (add-hook 'fontification-functions 'jit-lock-function)) |
257 | |
258 ;; Turn Just-in-time Lock mode off. | |
259 (t | |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
260 ;; Cancel our idle timers. |
53756
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
261 (when (and (or jit-lock-stealth-timer jit-lock-defer-timer |
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
262 jit-lock-context-timer) |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
263 ;; Only if there's no other buffer using them. |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
264 (not (catch 'found |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
265 (dolist (buf (buffer-list)) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
266 (with-current-buffer buf |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
267 (when jit-lock-mode (throw 'found t))))))) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
268 (when jit-lock-stealth-timer |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
269 (cancel-timer jit-lock-stealth-timer) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
270 (setq jit-lock-stealth-timer nil)) |
53756
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
271 (when jit-lock-context-timer |
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
272 (cancel-timer jit-lock-context-timer) |
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
273 (setq jit-lock-context-timer nil)) |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
274 (when jit-lock-defer-timer |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
275 (cancel-timer jit-lock-defer-timer) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
276 (setq jit-lock-defer-timer nil))) |
25003 | 277 |
32305
ca771411a7fd
Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32181
diff
changeset
|
278 ;; Remove hooks. |
29413
ce16b083b459
(jit-lock-saved-fontify-buffer-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29288
diff
changeset
|
279 (remove-hook 'after-change-functions 'jit-lock-after-change t) |
25003 | 280 (remove-hook 'fontification-functions 'jit-lock-function)))) |
281 | |
32181
f3afd1ff75a8
(jit-lock-mode): Use jit-lock-defer-contextually
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32157
diff
changeset
|
282 (defun jit-lock-register (fun &optional contextual) |
32157
c3d137c056d1
(jit-lock-register, jit-lock-unregister): Docstring fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32156
diff
changeset
|
283 "Register FUN as a fontification function to be called in this buffer. |
c3d137c056d1
(jit-lock-register, jit-lock-unregister): Docstring fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32156
diff
changeset
|
284 FUN will be called with two arguments START and END indicating the region |
32181
f3afd1ff75a8
(jit-lock-mode): Use jit-lock-defer-contextually
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32157
diff
changeset
|
285 that needs to be (re)fontified. |
f3afd1ff75a8
(jit-lock-mode): Use jit-lock-defer-contextually
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32157
diff
changeset
|
286 If non-nil, CONTEXTUAL means that a contextual fontification would be useful." |
32156
b3596a2daf42
(jit-lock-register, jit-lock-unregister): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32152
diff
changeset
|
287 (add-hook 'jit-lock-functions fun nil t) |
53755
9bd36e762e48
(jit-lock-stealth-fontify): Allow quit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53709
diff
changeset
|
288 (when (and contextual jit-lock-contextually) |
9bd36e762e48
(jit-lock-stealth-fontify): Allow quit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53709
diff
changeset
|
289 (set (make-local-variable 'jit-lock-contextually) t)) |
32156
b3596a2daf42
(jit-lock-register, jit-lock-unregister): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32152
diff
changeset
|
290 (jit-lock-mode t)) |
b3596a2daf42
(jit-lock-register, jit-lock-unregister): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32152
diff
changeset
|
291 |
b3596a2daf42
(jit-lock-register, jit-lock-unregister): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32152
diff
changeset
|
292 (defun jit-lock-unregister (fun) |
32157
c3d137c056d1
(jit-lock-register, jit-lock-unregister): Docstring fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32156
diff
changeset
|
293 "Unregister FUN as a fontification function. |
32156
b3596a2daf42
(jit-lock-register, jit-lock-unregister): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32152
diff
changeset
|
294 Only applies to the current buffer." |
b3596a2daf42
(jit-lock-register, jit-lock-unregister): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32152
diff
changeset
|
295 (remove-hook 'jit-lock-functions fun t) |
32305
ca771411a7fd
Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32181
diff
changeset
|
296 (unless jit-lock-functions (jit-lock-mode nil))) |
25003 | 297 |
29413
ce16b083b459
(jit-lock-saved-fontify-buffer-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29288
diff
changeset
|
298 ;; This function is used to prevent font-lock-fontify-buffer from |
ce16b083b459
(jit-lock-saved-fontify-buffer-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29288
diff
changeset
|
299 ;; fontifying eagerly the whole buffer. This is important for |
ce16b083b459
(jit-lock-saved-fontify-buffer-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29288
diff
changeset
|
300 ;; things like CWarn mode which adds/removes a few keywords and |
ce16b083b459
(jit-lock-saved-fontify-buffer-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29288
diff
changeset
|
301 ;; does a refontify (which takes ages on large files). |
32305
ca771411a7fd
Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32181
diff
changeset
|
302 (defun jit-lock-refontify (&optional beg end) |
ca771411a7fd
Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32181
diff
changeset
|
303 "Force refontification of the region BEG..END (default whole buffer)." |
29799
baa52c9029f6
(with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29708
diff
changeset
|
304 (with-buffer-prepared-for-jit-lock |
29708
f37b857741b1
(jit-lock-mode): Force jit-refontify when turned on.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29413
diff
changeset
|
305 (save-restriction |
f37b857741b1
(jit-lock-mode): Force jit-refontify when turned on.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29413
diff
changeset
|
306 (widen) |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
307 (put-text-property (or beg (point-min)) (or end (point-max)) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
308 'fontified nil)))) |
25003 | 309 |
310 ;;; On demand fontification. | |
311 | |
312 (defun jit-lock-function (start) | |
313 "Fontify current buffer starting at position START. | |
314 This function is added to `fontification-functions' when `jit-lock-mode' | |
315 is active." | |
66534
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
316 (when (and jit-lock-mode (not memory-full)) |
69599
0b906e4eb64e
(jit-lock-function): Check for the actual defer-timer rather than just
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69499
diff
changeset
|
317 (if (null jit-lock-defer-timer) |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
318 ;; No deferral. |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
319 (jit-lock-fontify-now start (+ start jit-lock-chunk-size)) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
320 ;; Record the buffer for later fontification. |
53709
f790b749630e
(jit-lock): Move group declaration from font-lock.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52401
diff
changeset
|
321 (unless (memq (current-buffer) jit-lock-defer-buffers) |
f790b749630e
(jit-lock): Move group declaration from font-lock.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52401
diff
changeset
|
322 (push (current-buffer) jit-lock-defer-buffers)) |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
323 ;; Mark the area as defer-fontified so that the redisplay engine |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
324 ;; is happy and so that the idle timer can find the places to fontify. |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
325 (with-buffer-prepared-for-jit-lock |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
326 (put-text-property start |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
327 (next-single-property-change |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
328 start 'fontified nil |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
329 (min (point-max) (+ start jit-lock-chunk-size))) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
330 'fontified 'defer))))) |
32305
ca771411a7fd
Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32181
diff
changeset
|
331 |
ca771411a7fd
Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32181
diff
changeset
|
332 (defun jit-lock-fontify-now (&optional start end) |
ca771411a7fd
Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32181
diff
changeset
|
333 "Fontify current buffer from START to END. |
ca771411a7fd
Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32181
diff
changeset
|
334 Defaults to the whole buffer. END can be out of bounds." |
29799
baa52c9029f6
(with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29708
diff
changeset
|
335 (with-buffer-prepared-for-jit-lock |
28501
030a9790d290
(with-buffer-unmodified): New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
28208
diff
changeset
|
336 (save-excursion |
47725
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
337 (unless start (setq start (point-min))) |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
338 (setq end (if end (min end (point-max)) (point-max))) |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
339 ;; This did bind `font-lock-beginning-of-syntax-function' to |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
340 ;; nil at some point, for an unknown reason. Don't do this; it |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
341 ;; can make highlighting slow due to expensive calls to |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
342 ;; `parse-partial-sexp' in function |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
343 ;; `font-lock-fontify-syntactically-region'. Example: paging |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
344 ;; from the end of a buffer to its start, can do repeated |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
345 ;; `parse-partial-sexp' starting from `point-min', which can |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
346 ;; take a long time in a large buffer. |
72231
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
347 (let ((orig-start start) next) |
47725
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
348 (save-match-data |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
349 ;; Fontify chunks beginning at START. The end of a |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
350 ;; chunk is either `end', or the start of a region |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
351 ;; before `end' that has already been fontified. |
73135
365ddb09e339
(jit-lock-fontify-now): Don't fontify the empty text.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
72865
diff
changeset
|
352 (while (and start (< start end)) |
47725
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
353 ;; Determine the end of this chunk. |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
354 (setq next (or (text-property-any start end 'fontified t) |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
355 end)) |
25395
9d8fff117316
(jit-lock-function): Extend the fontified range
Gerd Moellmann <gerd@gnu.org>
parents:
25341
diff
changeset
|
356 |
47725
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
357 ;; Decide which range of text should be fontified. |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
358 ;; The problem is that START and NEXT may be in the |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
359 ;; middle of something matched by a font-lock regexp. |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
360 ;; Until someone has a better idea, let's start |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
361 ;; at the start of the line containing START and |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
362 ;; stop at the start of the line following NEXT. |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
363 (goto-char next) (setq next (line-beginning-position 2)) |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
364 (goto-char start) (setq start (line-beginning-position)) |
49597
e88404e8f2cf
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47725
diff
changeset
|
365 |
66151
934d10a9685c
(jit-lock-fontify-now): Move jit-lock-context-unfontify-pos.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64762
diff
changeset
|
366 ;; Make sure the contextual refontification doesn't re-refontify |
934d10a9685c
(jit-lock-fontify-now): Move jit-lock-context-unfontify-pos.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64762
diff
changeset
|
367 ;; what's already been refontified. |
934d10a9685c
(jit-lock-fontify-now): Move jit-lock-context-unfontify-pos.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64762
diff
changeset
|
368 (when (and jit-lock-context-unfontify-pos |
934d10a9685c
(jit-lock-fontify-now): Move jit-lock-context-unfontify-pos.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64762
diff
changeset
|
369 (< jit-lock-context-unfontify-pos next) |
66439
52c79134b5d5
(jit-lock-fontify-now): Be careful not to skip multiline
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66156
diff
changeset
|
370 (>= jit-lock-context-unfontify-pos start) |
52c79134b5d5
(jit-lock-fontify-now): Be careful not to skip multiline
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66156
diff
changeset
|
371 ;; Don't move boundary forward if we have to |
52c79134b5d5
(jit-lock-fontify-now): Be careful not to skip multiline
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66156
diff
changeset
|
372 ;; refontify previous text. Otherwise, we risk moving |
52c79134b5d5
(jit-lock-fontify-now): Be careful not to skip multiline
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66156
diff
changeset
|
373 ;; it past the end of the multiline property and thus |
52c79134b5d5
(jit-lock-fontify-now): Be careful not to skip multiline
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66156
diff
changeset
|
374 ;; forget about this multiline region altogether. |
52c79134b5d5
(jit-lock-fontify-now): Be careful not to skip multiline
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66156
diff
changeset
|
375 (not (get-text-property start 'jit-lock-defer-multiline))) |
66151
934d10a9685c
(jit-lock-fontify-now): Move jit-lock-context-unfontify-pos.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64762
diff
changeset
|
376 (setq jit-lock-context-unfontify-pos next)) |
934d10a9685c
(jit-lock-fontify-now): Move jit-lock-context-unfontify-pos.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64762
diff
changeset
|
377 |
47725
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
378 ;; Fontify the chunk, and mark it as fontified. |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
379 ;; We mark it first, to make sure that we don't indefinitely |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
380 ;; re-execute this fontification if an error occurs. |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
381 (put-text-property start next 'fontified t) |
53755
9bd36e762e48
(jit-lock-stealth-fontify): Allow quit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53709
diff
changeset
|
382 (condition-case err |
9bd36e762e48
(jit-lock-stealth-fontify): Allow quit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53709
diff
changeset
|
383 (run-hook-with-args 'jit-lock-functions start next) |
9bd36e762e48
(jit-lock-stealth-fontify): Allow quit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53709
diff
changeset
|
384 ;; If the user quits (which shouldn't happen in normal on-the-fly |
9bd36e762e48
(jit-lock-stealth-fontify): Allow quit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53709
diff
changeset
|
385 ;; jit-locking), make sure the fontification will be performed |
9bd36e762e48
(jit-lock-stealth-fontify): Allow quit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53709
diff
changeset
|
386 ;; before displaying the block again. |
9bd36e762e48
(jit-lock-stealth-fontify): Allow quit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53709
diff
changeset
|
387 (quit (put-text-property start next 'fontified nil) |
9bd36e762e48
(jit-lock-stealth-fontify): Allow quit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53709
diff
changeset
|
388 (funcall 'signal (car err) (cdr err)))) |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
389 |
72231
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
390 ;; The redisplay engine has already rendered the buffer up-to |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
391 ;; `orig-start' and won't notice if the above jit-lock-functions |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
392 ;; changed the appearance of any part of the buffer prior |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
393 ;; to that. So if `start' is before `orig-start', we need to |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
394 ;; cause a new redisplay cycle after this one so that any changes |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
395 ;; are properly reflected on screen. |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
396 ;; To make such repeated redisplay happen less often, we can |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
397 ;; eagerly extend the refontified region with |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
398 ;; jit-lock-after-change-extend-region-functions. |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
399 (when (< start orig-start) |
73136
db20c4c0a56f
(jit-lock-force-redisplay): Rename from jit-lock-fontify-again.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73135
diff
changeset
|
400 (run-with-timer 0 nil 'jit-lock-force-redisplay |
72865
1ba9cc2a8b76
(jit-lock-fontify-again): New function.
Kim F. Storm <storm@cua.dk>
parents:
72508
diff
changeset
|
401 (current-buffer) start orig-start)) |
72231
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
402 |
47725
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
403 ;; Find the start of the next chunk, if any. |
2cf6194833de
(jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41502
diff
changeset
|
404 (setq start (text-property-any next end 'fontified nil)))))))) |
25003 | 405 |
73136
db20c4c0a56f
(jit-lock-force-redisplay): Rename from jit-lock-fontify-again.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73135
diff
changeset
|
406 (defun jit-lock-force-redisplay (buf start end) |
db20c4c0a56f
(jit-lock-force-redisplay): Rename from jit-lock-fontify-again.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73135
diff
changeset
|
407 "Force the display engine to re-render buffer BUF from START to END." |
db20c4c0a56f
(jit-lock-force-redisplay): Rename from jit-lock-fontify-again.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73135
diff
changeset
|
408 (with-current-buffer buf |
db20c4c0a56f
(jit-lock-force-redisplay): Rename from jit-lock-fontify-again.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73135
diff
changeset
|
409 (with-buffer-prepared-for-jit-lock |
db20c4c0a56f
(jit-lock-force-redisplay): Rename from jit-lock-fontify-again.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73135
diff
changeset
|
410 ;; Don't cause refontification (it's already been done), but just do |
db20c4c0a56f
(jit-lock-force-redisplay): Rename from jit-lock-fontify-again.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73135
diff
changeset
|
411 ;; some random buffer change, so as to force redisplay. |
73137 | 412 (put-text-property start end 'fontified t)))) |
72865
1ba9cc2a8b76
(jit-lock-fontify-again): New function.
Kim F. Storm <storm@cua.dk>
parents:
72508
diff
changeset
|
413 |
1ba9cc2a8b76
(jit-lock-fontify-again): New function.
Kim F. Storm <storm@cua.dk>
parents:
72508
diff
changeset
|
414 |
25003 | 415 |
416 ;;; Stealth fontification. | |
417 | |
418 (defsubst jit-lock-stealth-chunk-start (around) | |
102971
dfda66dfca92
* jit-lock.el (jit-lock-stealth-chunk-start): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents:
102043
diff
changeset
|
419 "Return the start of the next chunk to fontify around position AROUND. |
25003 | 420 Value is nil if there is nothing more to fontify." |
27537
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
421 (if (zerop (buffer-size)) |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
422 nil |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
423 (save-restriction |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
424 (widen) |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
425 (let* ((next (text-property-not-all around (point-max) 'fontified t)) |
27537
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
426 (prev (previous-single-property-change around 'fontified)) |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
427 (prop (get-text-property (max (point-min) (1- around)) |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
428 'fontified)) |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
429 (start (cond |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
430 ((null prev) |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
431 ;; There is no property change between AROUND |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
432 ;; and the start of the buffer. If PROP is |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
433 ;; non-nil, everything in front of AROUND is |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
434 ;; fontified, otherwise nothing is fontified. |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
435 (if (eq prop t) |
27537
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
436 nil |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
437 (max (point-min) |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
438 (- around (/ jit-lock-chunk-size 2))))) |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
439 ((eq prop t) |
27537
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
440 ;; PREV is the start of a region of fontified |
29799
baa52c9029f6
(with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29708
diff
changeset
|
441 ;; text containing AROUND. Start fontifying a |
27537
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
442 ;; chunk size before the end of the unfontified |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
443 ;; region in front of that. |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
444 (max (or (previous-single-property-change prev 'fontified) |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
445 (point-min)) |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
446 (- prev jit-lock-chunk-size))) |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
447 (t |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
448 ;; PREV is the start of a region of unfontified |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
449 ;; text containing AROUND. Start at PREV or |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
450 ;; chunk size in front of AROUND, whichever is |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
451 ;; nearer. |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
452 (max prev (- around jit-lock-chunk-size))))) |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
453 (result (cond ((null start) next) |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
454 ((null next) start) |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
455 ((< (- around start) (- next around)) start) |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
456 (t next)))) |
d04b7ce72b4a
(jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents:
25395
diff
changeset
|
457 result)))) |
49597
e88404e8f2cf
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47725
diff
changeset
|
458 |
72508
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
459 (defun jit-lock-stealth-fontify (&optional repeat) |
25003 | 460 "Fontify buffers stealthily. |
72508
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
461 This function is called repeatedly after Emacs has become idle for |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
462 `jit-lock-stealth-time' seconds. Optional argument REPEAT is expected |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
463 non-nil in a repeated invocation of this function." |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
464 ;; Cancel timer for repeated invocations. |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
465 (unless repeat |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
466 (cancel-timer jit-lock-stealth-repeat-timer)) |
25003 | 467 (unless (or executing-kbd-macro |
66534
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
468 memory-full |
72508
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
469 (window-minibuffer-p (selected-window)) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
470 ;; For first invocation set up `jit-lock-stealth-buffers'. |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
471 ;; In repeated invocations it's already been set up. |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
472 (null (if repeat |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
473 jit-lock-stealth-buffers |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
474 (setq jit-lock-stealth-buffers (buffer-list))))) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
475 (let ((buffer (car jit-lock-stealth-buffers)) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
476 (delay 0) |
25003 | 477 minibuffer-auto-raise |
72508
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
478 message-log-max |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
479 start) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
480 (if (and jit-lock-stealth-load |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
481 (> (car (load-average)) jit-lock-stealth-load)) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
482 ;; Wait a little if load is too high. |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
483 (setq delay jit-lock-stealth-time) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
484 (if (buffer-live-p buffer) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
485 (with-current-buffer buffer |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
486 (if (and jit-lock-mode |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
487 (setq start (jit-lock-stealth-chunk-start (point)))) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
488 ;; Fontify one block of at most `jit-lock-chunk-size' |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
489 ;; characters. |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
490 (with-temp-message (if jit-lock-stealth-verbose |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
491 (concat "JIT stealth lock " |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
492 (buffer-name))) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
493 (jit-lock-fontify-now start |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
494 (+ start jit-lock-chunk-size)) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
495 ;; Run again after `jit-lock-stealth-nice' seconds. |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
496 (setq delay (or jit-lock-stealth-nice 0))) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
497 ;; Nothing to fontify here. Remove this buffer from |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
498 ;; `jit-lock-stealth-buffers' and run again immediately. |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
499 (setq jit-lock-stealth-buffers (cdr jit-lock-stealth-buffers)))) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
500 ;; Buffer is no longer live. Remove it from |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
501 ;; `jit-lock-stealth-buffers' and run again immediately. |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
502 (setq jit-lock-stealth-buffers (cdr jit-lock-stealth-buffers)))) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
503 ;; Call us again. |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
504 (when jit-lock-stealth-buffers |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
505 (timer-set-idle-time jit-lock-stealth-repeat-timer (current-idle-time)) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
506 (timer-inc-time jit-lock-stealth-repeat-timer delay) |
5d642f9eff22
* emacs-lisp/timer.el (timer-set-idle-time, run-with-idle-timer):
Chong Yidong <cyd@stupidchicken.com>
parents:
72431
diff
changeset
|
507 (timer-activate-when-idle jit-lock-stealth-repeat-timer t))))) |
25003 | 508 |
509 | |
510 ;;; Deferred fontification. | |
511 | |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
512 (defun jit-lock-deferred-fontify () |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
513 "Fontify what was deferred." |
66534
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
514 (when (and jit-lock-defer-buffers (not memory-full)) |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
515 ;; Mark the deferred regions back to `fontified = nil' |
53709
f790b749630e
(jit-lock): Move group declaration from font-lock.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52401
diff
changeset
|
516 (dolist (buffer jit-lock-defer-buffers) |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
517 (when (buffer-live-p buffer) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
518 (with-current-buffer buffer |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
519 ;; (message "Jit-Defer %s" (buffer-name)) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
520 (with-buffer-prepared-for-jit-lock |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
521 (let ((pos (point-min))) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
522 (while |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
523 (progn |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
524 (when (eq (get-text-property pos 'fontified) 'defer) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
525 (put-text-property |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
526 pos (setq pos (next-single-property-change |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
527 pos 'fontified nil (point-max))) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
528 'fontified nil)) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
529 (setq pos (next-single-property-change pos 'fontified))))))))) |
53709
f790b749630e
(jit-lock): Move group declaration from font-lock.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52401
diff
changeset
|
530 (setq jit-lock-defer-buffers nil) |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
531 ;; Force fontification of the visible parts. |
69599
0b906e4eb64e
(jit-lock-function): Check for the actual defer-timer rather than just
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69499
diff
changeset
|
532 (let ((jit-lock-defer-timer nil)) |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
533 ;; (message "Jit-Defer Now") |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
534 (sit-for 0) |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
535 ;; (message "Jit-Defer Done") |
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
536 ))) |
49597
e88404e8f2cf
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47725
diff
changeset
|
537 |
41336
36e754afaf7a
(jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38436
diff
changeset
|
538 |
53756
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
539 (defun jit-lock-context-fontify () |
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
540 "Refresh fontification to take new context into account." |
66534
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
541 (unless memory-full |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
542 (dolist (buffer (buffer-list)) |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
543 (with-current-buffer buffer |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
544 (when jit-lock-context-unfontify-pos |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
545 ;; (message "Jit-Context %s" (buffer-name)) |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
546 (save-restriction |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
547 (widen) |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
548 (when (and (>= jit-lock-context-unfontify-pos (point-min)) |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
549 (< jit-lock-context-unfontify-pos (point-max))) |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
550 ;; If we're in text that matches a complex multi-line |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
551 ;; font-lock pattern, make sure the whole text will be |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
552 ;; redisplayed eventually. |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
553 ;; Despite its name, we treat jit-lock-defer-multiline here |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
554 ;; rather than in jit-lock-defer since it has to do with multiple |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
555 ;; lines, i.e. with context. |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
556 (when (get-text-property jit-lock-context-unfontify-pos |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
557 'jit-lock-defer-multiline) |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
558 (setq jit-lock-context-unfontify-pos |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
559 (or (previous-single-property-change |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
560 jit-lock-context-unfontify-pos |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
561 'jit-lock-defer-multiline) |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
562 (point-min)))) |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
563 (with-buffer-prepared-for-jit-lock |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
564 ;; Force contextual refontification. |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
565 (remove-text-properties |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
566 jit-lock-context-unfontify-pos (point-max) |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
567 '(fontified nil jit-lock-defer-multiline nil))) |
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
568 (setq jit-lock-context-unfontify-pos (point-max))))))))) |
53756
bbadbe04fc3d
(jit-lock-context-time, jit-lock-context-timer): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53755
diff
changeset
|
569 |
72231
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
570 (defvar jit-lock-start) (defvar jit-lock-end) ; Dynamically scoped variables. |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
571 (defvar jit-lock-after-change-extend-region-functions nil |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
572 "Hook that can extend the text to refontify after a change. |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
573 This is run after every buffer change. The functions are called with |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
574 the three arguments of `after-change-functions': START END OLD-LEN. |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
575 The extended region to refontify is returned indirectly by modifying |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
576 the variables `jit-lock-start' and `jit-lock-end'. |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
577 |
72431
f13889b47192
(jit-lock-fontify-now): Protect the modified status of the right buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
72248
diff
changeset
|
578 Note that extending the region this way is not strictly necessary, except |
f13889b47192
(jit-lock-fontify-now): Protect the modified status of the right buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
72248
diff
changeset
|
579 that the nature of the redisplay code tends to otherwise leave some of |
f13889b47192
(jit-lock-fontify-now): Protect the modified status of the right buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
72248
diff
changeset
|
580 the rehighlighted text displayed with the old highlight until the next |
f13889b47192
(jit-lock-fontify-now): Protect the modified status of the right buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
72248
diff
changeset
|
581 redisplay (see comment about repeated redisplay in `jit-lock-fontify-now').") |
72231
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
582 |
25003 | 583 (defun jit-lock-after-change (start end old-len) |
584 "Mark the rest of the buffer as not fontified after a change. | |
585 Installed on `after-change-functions'. | |
586 START and END are the start and end of the changed text. OLD-LEN | |
587 is the pre-change length. | |
588 This function ensures that lines following the change will be refontified | |
589 in case the syntax of those lines has changed. Refontification | |
590 will take place when text is fontified stealthily." | |
66534
364aad458607
(jit-lock-function, jit-lock-stealth-fontify)
Richard M. Stallman <rms@gnu.org>
parents:
66439
diff
changeset
|
591 (when (and jit-lock-mode (not memory-full)) |
72231
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
592 (let ((jit-lock-start start) |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
593 (jit-lock-end end)) |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
594 (with-buffer-prepared-for-jit-lock |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
595 (run-hook-with-args 'jit-lock-after-change-extend-region-functions |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
596 start end old-len) |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
597 ;; Make sure we change at least one char (in case of deletions). |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
598 (setq jit-lock-end (min (max jit-lock-end (1+ start)) (point-max))) |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
599 ;; Request refontification. |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
600 (put-text-property jit-lock-start jit-lock-end 'fontified nil)) |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
601 ;; Mark the change for deferred contextual refontification. |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
602 (when jit-lock-context-unfontify-pos |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
603 (setq jit-lock-context-unfontify-pos |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
604 ;; Here we use `start' because nothing guarantees that the |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
605 ;; text between start and end will be otherwise refontified: |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
606 ;; usually it will be refontified by virtue of being |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
607 ;; displayed, but if it's outside of any displayed area in the |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
608 ;; buffer, only jit-lock-context-* will re-fontify it. |
3ca9684795fe
(jit-lock-fontify-now): Cause a second redisplay if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69599
diff
changeset
|
609 (min jit-lock-context-unfontify-pos jit-lock-start)))))) |
49597
e88404e8f2cf
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47725
diff
changeset
|
610 |
25003 | 611 (provide 'jit-lock) |
612 | |
66151
934d10a9685c
(jit-lock-fontify-now): Move jit-lock-context-unfontify-pos.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64762
diff
changeset
|
613 ;; arch-tag: 56b5de6e-f581-453b-bb97-49c39372ff9e |
38436
b174db545cfd
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
37781
diff
changeset
|
614 ;;; jit-lock.el ends here |