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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 102971
diff changeset
4 ;; 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
5
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
6 ;; Author: Gerd Moellmann <gerd@gnu.org>
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
7 ;; Keywords: faces files
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
8
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
15
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
19 ;; GNU General Public License for more details.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
20
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
23
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
24 ;;; Commentary:
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
25
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
26 ;; Just-in-time fontification, triggered by C redisplay code.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
27
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
28 ;;; Code:
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
29
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
30
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
45 "Execute BODY in current buffer, overriding several variables.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
61
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
62 ;;; Customization.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
69 (defcustom jit-lock-chunk-size 500
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
73 :type 'integer
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
74 :group 'jit-lock)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
75
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
78 "Time in seconds to wait before beginning stealth fontification.
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
81
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
82 The value of this variable is used when JIT Lock mode is turned on."
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
85 :group 'jit-lock)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
86
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
89 "Time in seconds to pause between chunks of stealth fontification.
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
90 Each iteration of stealth fontification is separated by this amount of time,
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
91 thus reducing the demand that stealth fontification makes on the system.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
92 If nil, means stealth fontification is never paused.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
93 To reduce machine load during stealth fontification, at the cost of stealth
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
94 taking longer to fontify, you could increase the value of this variable.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
95 See also `jit-lock-stealth-load'."
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
98 :group 'jit-lock)
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47725
diff changeset
99
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
100
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
101 (defcustom jit-lock-stealth-load
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
102 (if (condition-case nil (load-average) (error)) 200)
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
103 "Load in percentage above which stealth fontification is suspended.
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
104 Stealth fontification pauses when the system short-term load average (as
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
105 returned by the function `load-average' if supported) goes above this level,
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
106 thus reducing the demand that stealth fontification makes on the system.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
107 If nil, means stealth fontification is never suspended.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
108 To reduce machine load during stealth fontification, at the cost of stealth
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
109 taking longer to fontify, you could reduce the value of this variable.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
110 See also `jit-lock-stealth-nice'."
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
111 :type (if (condition-case nil (load-average) (error))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
112 '(choice (const :tag "never" nil)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
113 (integer :tag "load"))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
114 '(const :format "%t: unsupported\n" nil))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
115 :group 'jit-lock)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
116
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
117
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
118 (defcustom jit-lock-stealth-verbose nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
119 "If non-nil, means stealth fontification should show status messages."
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
120 :type 'boolean
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
121 :group 'jit-lock)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
122
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
128 means where modification on a line causes syntactic change on subsequent lines,
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
134 fontification occurs only if syntactic fontification is performed using the
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
135 buffer mode's syntax table, i.e., only if `font-lock-keywords-only' is nil.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
136
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
137 The value of this variable is used when JIT Lock mode is turned on."
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
138 :type '(choice (const :tag "never" nil)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
139 (const :tag "always" t)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
140 (other :tag "syntax-driven" syntax-driven))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
141 :group 'jit-lock)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
154
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
155 ;;; Variables that are not customizable.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
156
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
157 (defvar jit-lock-mode nil
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
158 "Non-nil means Just-in-time Lock mode is active.")
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
159 (make-variable-buffer-local 'jit-lock-mode)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
170
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
171
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
172 (defvar jit-lock-stealth-timer nil
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
185
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
186 ;;; JIT lock mode
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
187
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
188 (defun jit-lock-mode (arg)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
191 Enable it automatically by customizing group `font-lock'.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
192
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
193 When Just-in-time Lock mode is enabled, fontification is different in the
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
194 following ways:
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
195
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
196 - Demand-driven buffer fontification triggered by Emacs C code.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
197 This means initial fontification of the whole buffer does not occur.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
198 Instead, fontification occurs when necessary, such as when scrolling
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
199 through the buffer would otherwise reveal unfontified areas. This is
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
200 useful if buffer fontification is too slow for large buffers.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
201
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
202 - Stealthy buffer fontification if `jit-lock-stealth-time' is non-nil.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
203 This means remaining unfontified areas of buffers are fontified if Emacs has
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
204 been idle for `jit-lock-stealth-time' seconds, while Emacs remains idle.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
205 This is useful if any buffer has any deferred fontification.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
210 idle time, while Emacs remains idle. Otherwise, fontification occurs
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
211 on modified lines only, and subsequent lines can remain fontified
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
212 corresponding to previous syntactic contexts. This is useful where
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
213 strings or comments span lines.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
214
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
215 Stealth fontification only occurs while the system remains unloaded.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
216 If the system load rises above `jit-lock-stealth-load' percent, stealth
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
230 'jit-lock-stealth-fontify)))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
256 (add-hook 'fontification-functions 'jit-lock-function))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
257
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
258 ;; Turn Just-in-time Lock mode off.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
280 (remove-hook 'fontification-functions 'jit-lock-function))))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
309
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
310 ;;; On demand fontification.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
311
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
312 (defun jit-lock-function (start)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
313 "Fontify current buffer starting at position START.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
314 This function is added to `fontification-functions' when `jit-lock-mode'
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
b8d627e75b2d Paren typo.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 73136
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
415
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
416 ;;; Stealth fontification.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
417
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
508
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
509
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
510 ;;; Deferred fontification.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
583 (defun jit-lock-after-change (start end old-len)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
584 "Mark the rest of the buffer as not fontified after a change.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
585 Installed on `after-change-functions'.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
586 START and END are the start and end of the changed text. OLD-LEN
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
587 is the pre-change length.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
588 This function ensures that lines following the change will be refontified
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
589 in case the syntax of those lines has changed. Refontification
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
611 (provide 'jit-lock)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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