annotate lisp/jit-lock.el @ 49506:ac9e2eeeb03d

New format of AUTHORS file; list each author name once followed by contributed and changed files. Improve selection of entries to include in list, and generate list of unrecognized entries indicating syntax errors in ChangeLog files. (authors-coding-system): New variable. (authors-many-files): Update doc string. (authors-aliases): Change format. Now one entry with multiple aliases per author. (authors-valid-file-names, authors-renamed-files-alist) (authors-renamed-files-regexps): New variables. (authors-canonical-file-name): New function. Validates that file exists or occurs in one of the above lists. Record unrecognized file names in global authors-invalid-file-names list. (authors-add): Change to record per-change counts. (authors-canonical-author-name): Handle new format of authors-aliases list. (authors-scan-change-log): Rename FILE arg to LOG-FILE. Change doc string to describe new entry format. Only add author entries for valid file names. (authors-print): Replace by authors-add-to-author-list. (authors-add-to-author-list): New function which reorders per-file entries and adds them to global authors-author-list. (authors): Instead of authors-print to insert in *Authors* buffer, use authors-add-to-author-list to reorder the list and then insert result in *Authors* buffer with new format. Generate *Authors Errors* compilation-mode buffer listing unrecognized ChangeLog entries.
author Kim F. Storm <storm@cua.dk>
date Wed, 29 Jan 2003 00:13:11 +0000
parents 2cf6194833de
children e88404e8f2cf
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
35418
9f3d22817e83 Update copyright.
Gerd Moellmann <gerd@gnu.org>
parents: 35416
diff changeset
3 ;; Copyright (C) 1998, 2000, 2001 Free Software Foundation, Inc.
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
4
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
5 ;; Author: Gerd Moellmann <gerd@gnu.org>
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
6 ;; Keywords: faces files
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
7
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
8 ;; This file is part of GNU Emacs.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
9
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
11 ;; it under the terms of the GNU General Public License as published by
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
12 ;; the Free Software Foundation; either version 2, or (at your option)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
13 ;; any later version.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
14
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
15 ;; GNU Emacs is distributed in the hope that it will be useful,
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
18 ;; GNU General Public License for more details.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
19
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
23 ;; Boston, MA 02111-1307, USA.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
24
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
25 ;;; Commentary:
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
26
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
27 ;; Just-in-time fontification, triggered by C redisplay code.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
28
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
29 ;;; Code:
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
30
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
31
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
32 (eval-when-compile
28501
030a9790d290 (with-buffer-unmodified): New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 28208
diff changeset
33 (defmacro with-buffer-unmodified (&rest body)
030a9790d290 (with-buffer-unmodified): New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 28208
diff changeset
34 "Eval BODY, preserving the current buffer's modified state."
030a9790d290 (with-buffer-unmodified): New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 28208
diff changeset
35 (let ((modified (make-symbol "modified")))
030a9790d290 (with-buffer-unmodified): New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 28208
diff changeset
36 `(let ((,modified (buffer-modified-p)))
32152
00f38571e2b1 (with-buffer-unmodified): Use unwind-protect.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29827
diff changeset
37 (unwind-protect
00f38571e2b1 (with-buffer-unmodified): Use unwind-protect.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29827
diff changeset
38 (progn ,@body)
00f38571e2b1 (with-buffer-unmodified): Use unwind-protect.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29827
diff changeset
39 (unless ,modified
00f38571e2b1 (with-buffer-unmodified): Use unwind-protect.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29827
diff changeset
40 (restore-buffer-modified-p nil))))))
28501
030a9790d290 (with-buffer-unmodified): New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 28208
diff changeset
41
29799
baa52c9029f6 (with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29708
diff changeset
42 (defmacro with-buffer-prepared-for-jit-lock (&rest body)
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
43 "Execute BODY in current buffer, overriding several variables.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
44 Preserves the `buffer-modified-p' state of the current buffer."
28521
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
45 `(with-buffer-unmodified
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
46 (let ((buffer-undo-list t)
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
47 (inhibit-read-only t)
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
48 (inhibit-point-motion-hooks t)
29799
baa52c9029f6 (with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29708
diff changeset
49 (inhibit-modification-hooks t)
28521
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
50 deactivate-mark
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
51 buffer-file-name
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
52 buffer-file-truename)
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
53 ,@body))))
28501
030a9790d290 (with-buffer-unmodified): New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 28208
diff changeset
54
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
55
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
56
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
57 ;;; Customization.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
58
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
59 (defcustom jit-lock-chunk-size 500
29799
baa52c9029f6 (with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29708
diff changeset
60 "*Jit-lock chunks of this many characters, or smaller."
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
61 :type 'integer
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
62 :group 'jit-lock)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
63
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
64
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
65 (defcustom jit-lock-stealth-time 3
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
66 "*Time in seconds to wait before beginning stealth fontification.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
67 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
68 If nil, stealth fontification is never performed.
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
69
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
70 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
71 :type '(choice (const :tag "never" nil)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
72 (number :tag "seconds"))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
73 :group 'jit-lock)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
74
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
75
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
76 (defcustom jit-lock-stealth-nice 0.125
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
77 "*Time in seconds to pause between chunks of stealth fontification.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
78 Each iteration of stealth fontification is separated by this amount of time,
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
79 thus reducing the demand that stealth fontification makes on the system.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
80 If nil, means stealth fontification is never paused.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
81 To reduce machine load during stealth fontification, at the cost of stealth
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
82 taking longer to fontify, you could increase the value of this variable.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
83 See also `jit-lock-stealth-load'."
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
84 :type '(choice (const :tag "never" nil)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
85 (number :tag "seconds"))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
86 :group 'jit-lock)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
87
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
88
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
89 (defcustom jit-lock-stealth-load
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
90 (if (condition-case nil (load-average) (error)) 200)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
91 "*Load in percentage above which stealth fontification is suspended.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
92 Stealth fontification pauses when the system short-term load average (as
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
93 returned by the function `load-average' if supported) goes above this level,
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
94 thus reducing the demand that stealth fontification makes on the system.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
95 If nil, means stealth fontification is never suspended.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
96 To reduce machine load during stealth fontification, at the cost of stealth
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
97 taking longer to fontify, you could reduce the value of this variable.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
98 See also `jit-lock-stealth-nice'."
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
99 :type (if (condition-case nil (load-average) (error))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
100 '(choice (const :tag "never" nil)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
101 (integer :tag "load"))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
102 '(const :format "%t: unsupported\n" nil))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
103 :group 'jit-lock)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
104
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
105
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
106 (defcustom jit-lock-stealth-verbose nil
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
107 "*If non-nil, means stealth fontification should show status messages."
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
108 :type 'boolean
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
109 :group 'jit-lock)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
110
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
111
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
112 (defcustom jit-lock-defer-contextually 'syntax-driven
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
113 "*If non-nil, means deferred fontification should be syntactically true.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
114 If nil, means deferred fontification occurs only on those lines modified. This
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
115 means where modification on a line causes syntactic change on subsequent lines,
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
116 those subsequent lines are not refontified to reflect their new context.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
117 If t, means deferred fontification occurs on those lines modified and all
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
118 subsequent lines. This means those subsequent lines are refontified to reflect
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
119 their new syntactic context, either immediately or when scrolling into them.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
120 If any other value, e.g., `syntax-driven', means deferred syntactically true
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
121 fontification occurs only if syntactic fontification is performed using the
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
122 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
123
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
124 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
125 :type '(choice (const :tag "never" nil)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
126 (const :tag "always" t)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
127 (other :tag "syntax-driven" syntax-driven))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
128 :group 'jit-lock)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
129
41502
828432e1e1d4 Modify a commented-out non-nil value of jit-lock-defer-time, to
Eli Zaretskii <eliz@gnu.org>
parents: 41336
diff changeset
130 (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
131 "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
132 If nil, fontification is not deferred."
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
133 :group 'jit-lock
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
134 :type '(choice (const :tag "never" nil)
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
135 (number :tag "seconds")))
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
136
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
137 ;;; Variables that are not customizable.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
138
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
139 (defvar jit-lock-mode nil
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
140 "Non-nil means Just-in-time Lock mode is active.")
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
141 (make-variable-buffer-local 'jit-lock-mode)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
142
32152
00f38571e2b1 (with-buffer-unmodified): Use unwind-protect.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29827
diff changeset
143 (defvar jit-lock-functions nil
00f38571e2b1 (with-buffer-unmodified): Use unwind-protect.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29827
diff changeset
144 "Functions to do the actual fontification.
00f38571e2b1 (with-buffer-unmodified): Use unwind-protect.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29827
diff changeset
145 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
146 (make-variable-buffer-local 'jit-lock-functions)
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
147
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
148 (defvar jit-lock-first-unfontify-pos nil
32305
ca771411a7fd Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32181
diff changeset
149 "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
150 If nil, contextual fontification is disabled.")
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
151 (make-variable-buffer-local 'jit-lock-first-unfontify-pos)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
152
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
153
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
154 (defvar jit-lock-stealth-timer nil
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
155 "Timer for stealth 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
156
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
157 (defvar jit-lock-defer-timer nil
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
158 "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
159
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
160 (defvar jit-lock-buffers nil
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
161 "List of buffers with pending deferred fontification.")
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
162
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
163 ;;; JIT lock mode
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
164
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
165 (defun jit-lock-mode (arg)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
166 "Toggle Just-in-time Lock mode.
29799
baa52c9029f6 (with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29708
diff changeset
167 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
168 Enable it automatically by customizing group `font-lock'.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
169
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
170 When Just-in-time Lock mode is enabled, fontification is different in the
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
171 following ways:
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
172
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
173 - Demand-driven buffer fontification triggered by Emacs C code.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
174 This means initial fontification of the whole buffer does not occur.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
175 Instead, fontification occurs when necessary, such as when scrolling
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
176 through the buffer would otherwise reveal unfontified areas. This is
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
177 useful if buffer fontification is too slow for large buffers.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
178
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
179 - Stealthy buffer fontification if `jit-lock-stealth-time' is non-nil.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
180 This means remaining unfontified areas of buffers are fontified if Emacs has
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
181 been idle for `jit-lock-stealth-time' seconds, while Emacs remains idle.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
182 This is useful if any buffer has any deferred fontification.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
183
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
184 - Deferred context fontification if `jit-lock-defer-contextually' is
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
185 non-nil. This means fontification updates the buffer corresponding to
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
186 true syntactic context, after `jit-lock-stealth-time' seconds of Emacs
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
187 idle time, while Emacs remains idle. Otherwise, fontification occurs
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
188 on modified lines only, and subsequent lines can remain fontified
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
189 corresponding to previous syntactic contexts. This is useful where
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
190 strings or comments span lines.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
191
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
192 Stealth fontification only occurs while the system remains unloaded.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
193 If the system load rises above `jit-lock-stealth-load' percent, stealth
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
194 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
195 the variable `jit-lock-stealth-nice'."
29799
baa52c9029f6 (with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29708
diff changeset
196 (setq jit-lock-mode arg)
baa52c9029f6 (with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29708
diff changeset
197 (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
198 jit-lock-mode
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
199
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
200 ;; Mark the buffer for refontification.
32305
ca771411a7fd Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32181
diff changeset
201 (jit-lock-refontify)
29413
ce16b083b459 (jit-lock-saved-fontify-buffer-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29288
diff changeset
202
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
203 ;; 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
204 (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
205 (setq jit-lock-stealth-timer
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
206 (run-with-idle-timer jit-lock-stealth-time t
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
207 'jit-lock-stealth-fontify)))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
208
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
209 ;; Init deferred fontification timer.
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
210 (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
211 (setq jit-lock-defer-timer
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
212 (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
213 'jit-lock-deferred-fontify)))
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
214
29799
baa52c9029f6 (with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29708
diff changeset
215 ;; Initialize deferred contextual fontification if requested.
32305
ca771411a7fd Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32181
diff changeset
216 (when (eq jit-lock-defer-contextually t)
32181
f3afd1ff75a8 (jit-lock-mode): Use jit-lock-defer-contextually
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32157
diff changeset
217 (setq jit-lock-first-unfontify-pos
f3afd1ff75a8 (jit-lock-mode): Use jit-lock-defer-contextually
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32157
diff changeset
218 (or jit-lock-first-unfontify-pos (point-max))))
29799
baa52c9029f6 (with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29708
diff changeset
219
32305
ca771411a7fd Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32181
diff changeset
220 ;; Setup our hooks.
29799
baa52c9029f6 (with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29708
diff changeset
221 (add-hook 'after-change-functions 'jit-lock-after-change nil t)
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
222 (add-hook 'fontification-functions 'jit-lock-function))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
223
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
224 ;; Turn Just-in-time Lock mode off.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
225 (t
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
226 ;; Cancel our idle timers.
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
227 (when (and (or jit-lock-stealth-timer jit-lock-defer-timer)
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
228 ;; 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
229 (not (catch 'found
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
230 (dolist (buf (buffer-list))
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
231 (with-current-buffer buf
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
232 (when jit-lock-mode (throw 'found t)))))))
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
233 (when jit-lock-stealth-timer
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
234 (cancel-timer jit-lock-stealth-timer)
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
235 (setq jit-lock-stealth-timer nil))
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
236 (when jit-lock-defer-timer
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
237 (cancel-timer jit-lock-defer-timer)
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
238 (setq jit-lock-defer-timer nil)))
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
239
32305
ca771411a7fd Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32181
diff changeset
240 ;; Remove hooks.
29413
ce16b083b459 (jit-lock-saved-fontify-buffer-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29288
diff changeset
241 (remove-hook 'after-change-functions 'jit-lock-after-change t)
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
242 (remove-hook 'fontification-functions 'jit-lock-function))))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
243
32181
f3afd1ff75a8 (jit-lock-mode): Use jit-lock-defer-contextually
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32157
diff changeset
244 ;;;###autoload
f3afd1ff75a8 (jit-lock-mode): Use jit-lock-defer-contextually
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32157
diff changeset
245 (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
246 "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
247 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
248 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
249 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
250 (add-hook 'jit-lock-functions fun nil t)
32181
f3afd1ff75a8 (jit-lock-mode): Use jit-lock-defer-contextually
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32157
diff changeset
251 (when (and contextual jit-lock-defer-contextually)
f3afd1ff75a8 (jit-lock-mode): Use jit-lock-defer-contextually
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32157
diff changeset
252 (set (make-local-variable 'jit-lock-defer-contextually) t))
32156
b3596a2daf42 (jit-lock-register, jit-lock-unregister): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32152
diff changeset
253 (jit-lock-mode t))
b3596a2daf42 (jit-lock-register, jit-lock-unregister): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32152
diff changeset
254
b3596a2daf42 (jit-lock-register, jit-lock-unregister): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32152
diff changeset
255 (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
256 "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
257 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
258 (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
259 (unless jit-lock-functions (jit-lock-mode nil)))
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
260
29413
ce16b083b459 (jit-lock-saved-fontify-buffer-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29288
diff changeset
261 ;; 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
262 ;; 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
263 ;; 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
264 ;; 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
265 (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
266 "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
267 (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
268 (save-restriction
f37b857741b1 (jit-lock-mode): Force jit-refontify when turned on.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29413
diff changeset
269 (widen)
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
270 (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
271 'fontified nil))))
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
272
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
273 ;;; On demand fontification.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
274
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
275 (defun jit-lock-function (start)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
276 "Fontify current buffer starting at position START.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
277 This function is added to `fontification-functions' when `jit-lock-mode'
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
278 is active."
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
279 (when jit-lock-mode
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
280 (if (null jit-lock-defer-time)
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
281 ;; No deferral.
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
282 (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
283 ;; Record the buffer for later fontification.
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
284 (unless (memq (current-buffer) jit-lock-buffers)
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
285 (push (current-buffer) jit-lock-buffers))
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
286 ;; 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
287 ;; 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
288 (with-buffer-prepared-for-jit-lock
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
289 (put-text-property start
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
290 (next-single-property-change
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
291 start 'fontified nil
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
292 (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
293 'fontified 'defer)))))
32305
ca771411a7fd Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32181
diff changeset
294
ca771411a7fd Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32181
diff changeset
295 (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
296 "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
297 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
298 (with-buffer-prepared-for-jit-lock
28501
030a9790d290 (with-buffer-unmodified): New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 28208
diff changeset
299 (save-excursion
47725
2cf6194833de (jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41502
diff changeset
300 (unless start (setq start (point-min)))
2cf6194833de (jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41502
diff changeset
301 (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
302 ;; 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
303 ;; 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
304 ;; 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
305 ;; `parse-partial-sexp' in function
2cf6194833de (jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41502
diff changeset
306 ;; `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
307 ;; 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
308 ;; `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
309 ;; take a long time in a large buffer.
2cf6194833de (jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41502
diff changeset
310 (let (next)
2cf6194833de (jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41502
diff changeset
311 (save-match-data
2cf6194833de (jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41502
diff changeset
312 ;; 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
313 ;; 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
314 ;; before `end' that has already been fontified.
2cf6194833de (jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41502
diff changeset
315 (while start
2cf6194833de (jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41502
diff changeset
316 ;; Determine the end of this chunk.
2cf6194833de (jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41502
diff changeset
317 (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
318 end))
25395
9d8fff117316 (jit-lock-function): Extend the fontified range
Gerd Moellmann <gerd@gnu.org>
parents: 25341
diff changeset
319
47725
2cf6194833de (jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41502
diff changeset
320 ;; 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
321 ;; 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
322 ;; 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
323 ;; 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
324 ;; 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
325 ;; 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
326 (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
327 (goto-char start) (setq start (line-beginning-position))
32305
ca771411a7fd Don't require font-lock any more.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32181
diff changeset
328
47725
2cf6194833de (jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41502
diff changeset
329 ;; 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
330 ;; 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
331 ;; 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
332 (put-text-property start next 'fontified t)
2cf6194833de (jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41502
diff changeset
333 (run-hook-with-args 'jit-lock-functions start next)
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
334
47725
2cf6194833de (jit-lock-fontify-now): Don't widen.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41502
diff changeset
335 ;; 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
336 (setq start (text-property-any next end 'fontified nil))))))))
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
337
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
338
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
339 ;;; Stealth fontification.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
340
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
341 (defsubst jit-lock-stealth-chunk-start (around)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
342 "Return the start of the next chunk to fontify around position AROUND..
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
343 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
344 (if (zerop (buffer-size))
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
345 nil
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
346 (save-restriction
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
347 (widen)
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
348 (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
349 (prev (previous-single-property-change around 'fontified))
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
350 (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
351 'fontified))
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
352 (start (cond
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
353 ((null prev)
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
354 ;; There is no property change between AROUND
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
355 ;; 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
356 ;; 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
357 ;; fontified, otherwise nothing is fontified.
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
358 (if (eq prop t)
27537
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
359 nil
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
360 (max (point-min)
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
361 (- around (/ jit-lock-chunk-size 2)))))
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
362 ((eq prop t)
27537
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
363 ;; 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
364 ;; text containing AROUND. Start fontifying a
27537
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
365 ;; 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
366 ;; region in front of that.
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
367 (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
368 (point-min))
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
369 (- prev jit-lock-chunk-size)))
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
370 (t
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
371 ;; 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
372 ;; text containing AROUND. Start at PREV or
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
373 ;; 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
374 ;; nearer.
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
375 (max prev (- around jit-lock-chunk-size)))))
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
376 (result (cond ((null start) next)
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
377 ((null next) start)
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
378 ((< (- around start) (- next around)) start)
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
379 (t next))))
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
380 result))))
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
381
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
382
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
383 (defun jit-lock-stealth-fontify ()
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
384 "Fontify buffers stealthily.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
385 This functions is called after Emacs has been idle for
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
386 `jit-lock-stealth-time' seconds."
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
387 ;; I used to check `inhibit-read-only' here, but I can't remember why. -stef
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
388 (unless (or executing-kbd-macro
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
389 (window-minibuffer-p (selected-window)))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
390 (let ((buffers (buffer-list))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
391 minibuffer-auto-raise
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
392 message-log-max)
27537
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
393 (while (and buffers (not (input-pending-p)))
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
394 (let ((buffer (car buffers)))
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
395 (setq buffers (cdr buffers))
27537
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
396
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
397 (with-current-buffer buffer
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
398 (when jit-lock-mode
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
399 ;; This is funny. Calling sit-for with 3rd arg non-nil
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
400 ;; so that it doesn't redisplay, internally calls
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
401 ;; wait_reading_process_input also with a parameter
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
402 ;; saying "don't redisplay." Since this function here
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
403 ;; is called periodically, this effectively leads to
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
404 ;; process output not being redisplayed at all because
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
405 ;; redisplay_internal is never called. (That didn't
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
406 ;; work in the old redisplay either.) So, we learn that
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
407 ;; we mustn't call sit-for that way here. But then, we
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
408 ;; have to be cautious not to call sit-for in a widened
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
409 ;; buffer, since this could display hidden parts of that
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
410 ;; buffer. This explains the seemingly weird use of
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
411 ;; save-restriction/widen here.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
412
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
413 (with-temp-message (if jit-lock-stealth-verbose
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
414 (concat "JIT stealth lock "
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
415 (buffer-name)))
27537
d04b7ce72b4a (jit-lock-function): Widen before calculating end
Gerd Moellmann <gerd@gnu.org>
parents: 25395
diff changeset
416
28521
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
417 ;; Perform deferred unfontification, if any.
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
418 (when jit-lock-first-unfontify-pos
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
419 (save-restriction
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
420 (widen)
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
421 (when (and (>= jit-lock-first-unfontify-pos (point-min))
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
422 (< jit-lock-first-unfontify-pos (point-max)))
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
423 ;; If we're in text that matches a complex multi-line
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
424 ;; font-lock pattern, make sure the whole text will be
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
425 ;; redisplayed eventually.
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
426 (when (get-text-property jit-lock-first-unfontify-pos
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
427 'jit-lock-defer-multiline)
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
428 (setq jit-lock-first-unfontify-pos
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
429 (or (previous-single-property-change
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
430 jit-lock-first-unfontify-pos
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
431 'jit-lock-defer-multiline)
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
432 (point-min))))
29799
baa52c9029f6 (with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29708
diff changeset
433 (with-buffer-prepared-for-jit-lock
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
434 (remove-text-properties
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
435 jit-lock-first-unfontify-pos (point-max)
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
436 '(fontified nil jit-lock-defer-multiline nil)))
29799
baa52c9029f6 (with-buffer-prepared-for-jit-lock):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29708
diff changeset
437 (setq jit-lock-first-unfontify-pos (point-max)))))
28501
030a9790d290 (with-buffer-unmodified): New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 28208
diff changeset
438
28521
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
439 ;; In the following code, the `sit-for' calls cause a
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
440 ;; redisplay, so it's required that the
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
441 ;; buffer-modified flag of a buffer that is displayed
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
442 ;; has the right value---otherwise the mode line of
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
443 ;; an unmodified buffer would show a `*'.
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
444 (let (start
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
445 (nice (or jit-lock-stealth-nice 0))
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
446 (point (point-min)))
28521
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
447 (while (and (setq start
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
448 (jit-lock-stealth-chunk-start point))
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
449 (sit-for nice))
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
450
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
451 ;; fontify a block.
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
452 (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
453 ;; If stealth jit-locking is done backwards, this leads to
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
454 ;; excessive O(n^2) refontification. -stef
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
455 ;; (when (>= jit-lock-first-unfontify-pos start)
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
456 ;; (setq jit-lock-first-unfontify-pos end))
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
457
28521
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
458 ;; Wait a little if load is too high.
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
459 (when (and jit-lock-stealth-load
73d4caf44d53 (with-buffer-unmodified): Use
Gerd Moellmann <gerd@gnu.org>
parents: 28501
diff changeset
460 (> (car (load-average)) jit-lock-stealth-load))
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
461 (sit-for (or jit-lock-stealth-time 30)))))))))))))
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
462
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
463
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
464
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
465 ;;; Deferred fontification.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
466
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
467 (defun jit-lock-deferred-fontify ()
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
468 "Fontify what was deferred."
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
469 (when jit-lock-buffers
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
470 ;; Mark the deferred regions back to `fontified = nil'
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
471 (dolist (buffer jit-lock-buffers)
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
472 (when (buffer-live-p buffer)
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
473 (with-current-buffer buffer
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
474 ;; (message "Jit-Defer %s" (buffer-name))
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
475 (with-buffer-prepared-for-jit-lock
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
476 (let ((pos (point-min)))
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
477 (while
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
478 (progn
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
479 (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
480 (put-text-property
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
481 pos (setq pos (next-single-property-change
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
482 pos 'fontified nil (point-max)))
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
483 'fontified nil))
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
484 (setq pos (next-single-property-change pos 'fontified)))))))))
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
485 (setq jit-lock-buffers nil)
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
486 ;; Force fontification of the visible parts.
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
487 (let ((jit-lock-defer-time nil))
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
488 ;; (message "Jit-Defer Now")
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
489 (sit-for 0)
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
490 ;; (message "Jit-Defer Done")
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
491 )))
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
492
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
493
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
494 (defun jit-lock-after-change (start end old-len)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
495 "Mark the rest of the buffer as not fontified after a change.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
496 Installed on `after-change-functions'.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
497 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
498 is the pre-change length.
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
499 This function ensures that lines following the change will be refontified
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
500 in case the syntax of those lines has changed. Refontification
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
501 will take place when text is fontified stealthily."
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
502 (when jit-lock-mode
29827
dd9436a06050 (jit-lock-after-change): Don't assume point is at START.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29799
diff changeset
503 (save-excursion
dd9436a06050 (jit-lock-after-change): Don't assume point is at START.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29799
diff changeset
504 (with-buffer-prepared-for-jit-lock
dd9436a06050 (jit-lock-after-change): Don't assume point is at START.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29799
diff changeset
505 ;; It's important that the `fontified' property be set from the
dd9436a06050 (jit-lock-after-change): Don't assume point is at START.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29799
diff changeset
506 ;; beginning of the line, else font-lock will properly change the
dd9436a06050 (jit-lock-after-change): Don't assume point is at START.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29799
diff changeset
507 ;; text's face, but the display will have been done already and will
dd9436a06050 (jit-lock-after-change): Don't assume point is at START.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29799
diff changeset
508 ;; be inconsistent with the buffer's content.
dd9436a06050 (jit-lock-after-change): Don't assume point is at START.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29799
diff changeset
509 (goto-char start)
dd9436a06050 (jit-lock-after-change): Don't assume point is at START.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29799
diff changeset
510 (setq start (line-beginning-position))
32531
2555cdee2fed (jit-lock-after-change): If we're in text that
Gerd Moellmann <gerd@gnu.org>
parents: 32485
diff changeset
511
37781
67b115277d7d (jit-lock-after-change): Check the font-lock-multiline
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35429
diff changeset
512 ;; If we're in text that matches a multi-line font-lock pattern,
67b115277d7d (jit-lock-after-change): Check the font-lock-multiline
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35429
diff changeset
513 ;; make sure the whole text will be redisplayed.
41336
36e754afaf7a (jit-lock-defer-time): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
514 ;; I'm not sure this is ever necessary and/or sufficient. -stef
37781
67b115277d7d (jit-lock-after-change): Check the font-lock-multiline
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35429
diff changeset
515 (when (get-text-property start 'font-lock-multiline)
67b115277d7d (jit-lock-after-change): Check the font-lock-multiline
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35429
diff changeset
516 (setq start (or (previous-single-property-change
67b115277d7d (jit-lock-after-change): Check the font-lock-multiline
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35429
diff changeset
517 start 'font-lock-multiline)
67b115277d7d (jit-lock-after-change): Check the font-lock-multiline
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35429
diff changeset
518 (point-min))))
67b115277d7d (jit-lock-after-change): Check the font-lock-multiline
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35429
diff changeset
519
29827
dd9436a06050 (jit-lock-after-change): Don't assume point is at START.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29799
diff changeset
520 ;; Make sure we change at least one char (in case of deletions).
dd9436a06050 (jit-lock-after-change): Don't assume point is at START.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29799
diff changeset
521 (setq end (min (max end (1+ start)) (point-max)))
dd9436a06050 (jit-lock-after-change): Don't assume point is at START.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29799
diff changeset
522 ;; Request refontification.
dd9436a06050 (jit-lock-after-change): Don't assume point is at START.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29799
diff changeset
523 (put-text-property start end 'fontified nil))
dd9436a06050 (jit-lock-after-change): Don't assume point is at START.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29799
diff changeset
524 ;; Mark the change for deferred contextual refontification.
dd9436a06050 (jit-lock-after-change): Don't assume point is at START.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29799
diff changeset
525 (when jit-lock-first-unfontify-pos
dd9436a06050 (jit-lock-after-change): Don't assume point is at START.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29799
diff changeset
526 (setq jit-lock-first-unfontify-pos
dd9436a06050 (jit-lock-after-change): Don't assume point is at START.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29799
diff changeset
527 (min jit-lock-first-unfontify-pos start))))))
25003
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
528
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
529 (provide 'jit-lock)
bb68fe3c72f8 New file.
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
530
38436
b174db545cfd Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37781
diff changeset
531 ;;; jit-lock.el ends here