don't require grep in vc-git
[bpt/emacs.git] / lisp / font-core.el
CommitLineData
f62be99b
CW
1;;; font-core.el --- Core interface to font-lock
2
ba318903 3;; Copyright (C) 1992-2014 Free Software Foundation, Inc.
f62be99b 4
34dc21db 5;; Maintainer: emacs-devel@gnu.org
f62be99b 6;; Keywords: languages, faces
bd78fa1d 7;; Package: emacs
f62be99b
CW
8
9;; This file is part of GNU Emacs.
10
eb3fa2cf 11;; GNU Emacs is free software: you can redistribute it and/or modify
f62be99b 12;; it under the terms of the GNU General Public License as published by
eb3fa2cf
GM
13;; the Free Software Foundation, either version 3 of the License, or
14;; (at your option) any later version.
f62be99b
CW
15
16;; GNU Emacs is distributed in the hope that it will be useful,
17;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;; GNU General Public License for more details.
20
21;; You should have received a copy of the GNU General Public License
eb3fa2cf 22;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
f62be99b
CW
23
24;;; Code:
25
26;; This variable is used by mode packages that support Font Lock mode by
27;; defining their own keywords to use for `font-lock-keywords'. (The mode
28;; command should make it buffer-local and set it to provide the set up.)
29(defvar font-lock-defaults nil
30 "Defaults for Font Lock mode specified by the major mode.
31Defaults should be of the form:
32
77f5a70d 33 (KEYWORDS [KEYWORDS-ONLY [CASE-FOLD [SYNTAX-ALIST [SYNTAX-BEGIN ...]]]])
f62be99b 34
5ff602de
GM
35KEYWORDS may be a symbol (a variable or function whose value is the keywords
36to use for fontification) or a list of symbols (specifying different levels
37of fontification).
38
39If KEYWORDS-ONLY is non-nil, syntactic fontification (strings and
40comments) is not performed.
41
f62be99b 42If CASE-FOLD is non-nil, the case of the keywords is ignored when fontifying.
5ff602de 43
f62be99b
CW
44If SYNTAX-ALIST is non-nil, it should be a list of cons pairs of the form
45\(CHAR-OR-STRING . STRING) used to set the local Font Lock syntax table, for
46keyword and syntactic fontification (see `modify-syntax-entry').
47
48If SYNTAX-BEGIN is non-nil, it should be a function with no args used to move
49backwards outside any enclosing syntactic block, for syntactic fontification.
50Typical values are `beginning-of-line' (i.e., the start of the line is known to
51be outside a syntactic block), or `beginning-of-defun' for programming modes or
52`backward-paragraph' for textual modes (i.e., the mode-dependent function is
53known to move outside a syntactic block). If nil, the beginning of the buffer
54is used as a position outside of a syntactic block, in the worst case.
55
5ff602de
GM
56\(See also Info node `(elisp)Font Lock Basics'.)
57
f62be99b
CW
58These item elements are used by Font Lock mode to set the variables
59`font-lock-keywords', `font-lock-keywords-only',
60`font-lock-keywords-case-fold-search', `font-lock-syntax-table' and
61`font-lock-beginning-of-syntax-function', respectively.
62
63Further item elements are alists of the form (VARIABLE . VALUE) and are in no
64particular order. Each VARIABLE is made buffer-local before set to VALUE.
65
66Currently, appropriate variables include `font-lock-mark-block-function'.
67If this is non-nil, it should be a function with no args used to mark any
68enclosing block of text, for fontification via \\[font-lock-fontify-block].
69Typical values are `mark-defun' for programming modes or `mark-paragraph' for
70textual modes (i.e., the mode-dependent function is known to put point and mark
71around a text block relevant to that mode).
72
73Other variables include that for syntactic keyword fontification,
77f5a70d
LK
74`font-lock-syntactic-keywords' and those for buffer-specialized fontification
75functions, `font-lock-fontify-buffer-function',
76`font-lock-unfontify-buffer-function', `font-lock-fontify-region-function',
77`font-lock-unfontify-region-function', and `font-lock-inhibit-thing-lock'.")
ac549fa5 78;;;###autoload
6dc3311d 79(put 'font-lock-defaults 'risky-local-variable t)
f62be99b
CW
80(make-variable-buffer-local 'font-lock-defaults)
81
7c4ef9b3
CW
82(defvar font-lock-function 'font-lock-default-function
83 "A function which is called when `font-lock-mode' is toggled.
84It will be passed one argument, which is the current value of
85`font-lock-mode'.")
7c4ef9b3 86
642b63e8 87;; The mode for which font-lock was initialized, or nil if none.
36901266 88(defvar font-lock-major-mode)
06e21633 89
f62be99b 90(define-minor-mode font-lock-mode
06e21633
CY
91 "Toggle syntax highlighting in this buffer (Font Lock mode).
92With a prefix argument ARG, enable Font Lock mode if ARG is
93positive, and disable it otherwise. If called from Lisp, enable
94the mode if ARG is omitted or nil.
f62be99b
CW
95
96When Font Lock mode is enabled, text is fontified as you type it:
97
98 - Comments are displayed in `font-lock-comment-face';
99 - Strings are displayed in `font-lock-string-face';
100 - Certain other expressions are displayed in other faces according to the
101 value of the variable `font-lock-keywords'.
102
103To customize the faces (colors, fonts, etc.) used by Font Lock for
104fontifying different parts of buffer text, use \\[customize-face].
105
106You can enable Font Lock mode in any major mode automatically by turning on in
107the major mode's hook. For example, put in your ~/.emacs:
108
109 (add-hook 'c-mode-hook 'turn-on-font-lock)
110
111Alternatively, you can use Global Font Lock mode to automagically turn on Font
112Lock mode in buffers whose major mode supports it and whose major mode is one
113of `font-lock-global-modes'. For example, put in your ~/.emacs:
114
115 (global-font-lock-mode t)
116
ea5b829c
RF
117Where major modes support different levels of fontification, you can use
118the variable `font-lock-maximum-decoration' to specify which level you
119generally prefer. When you turn Font Lock mode on/off the buffer is
120fontified/defontified, though fontification occurs only if the buffer is
121less than `font-lock-maximum-size'.
f62be99b 122
f62be99b
CW
123To add your own highlighting for some major mode, and modify the highlighting
124selected automatically via the variable `font-lock-maximum-decoration', you can
125use `font-lock-add-keywords'.
126
127To fontify a buffer, without turning on Font Lock mode and regardless of buffer
128size, you can use \\[font-lock-fontify-buffer].
129
130To fontify a block (the function or paragraph containing point, or a number of
131lines around point), perhaps because modification on the current line caused
132syntactic change on other lines, you can use \\[font-lock-fontify-block].
133
6aecca99 134You can set your own default settings for some mode, by setting a
7c4ef9b3
CW
135buffer local value for `font-lock-defaults', via its mode hook.
136
137The above is the default behavior of `font-lock-mode'; you may specify
138your own function which is called when `font-lock-mode' is toggled via
139`font-lock-function'. "
9324f671 140 nil nil nil
487915d7 141 :after-hook (font-lock-initial-fontify)
f62be99b
CW
142 ;; Don't turn on Font Lock mode if we don't have a display (we're running a
143 ;; batch job) or if the buffer is invisible (the name starts with a space).
5a4689d9 144 (when (or noninteractive (eq (aref (buffer-name) 0) ?\s))
f62be99b 145 (setq font-lock-mode nil))
8e97108f
RS
146 (funcall font-lock-function font-lock-mode)
147 ;; Arrange to unfontify this buffer if we change major mode later.
148 (if font-lock-mode
2dc20ca8 149 (add-hook 'change-major-mode-hook 'font-lock-change-mode nil t)
36901266 150 (remove-hook 'change-major-mode-hook 'font-lock-change-mode t)))
2dc20ca8
RS
151
152;; Get rid of fontification for the old major mode.
153;; We do this when changing major modes.
154(defun font-lock-change-mode ()
40e2bbe9
SM
155 (font-lock-mode -1))
156
67c9f58d
RS
157(defun font-lock-defontify ()
158 "Clear out all `font-lock-face' properties in current buffer.
e350babd 159A major mode that uses `font-lock-face' properties might want to put
67c9f58d
RS
160this function onto `change-major-mode-hook'."
161 (let ((modp (buffer-modified-p))
162 (inhibit-read-only t))
163 (save-restriction
164 (widen)
165 (remove-list-of-text-properties (point-min) (point-max)
166 '(font-lock-face)))
bb125ff0 167 (restore-buffer-modified-p modp)))
67c9f58d 168
642b63e8 169(defvar font-lock-set-defaults)
40e2bbe9 170(defun font-lock-default-function (mode)
f62be99b 171 ;; Turn on Font Lock mode.
40e2bbe9 172 (when mode
1b6adddb
CW
173 (set (make-local-variable 'char-property-alias-alist)
174 (copy-tree char-property-alias-alist))
175 ;; Add `font-lock-face' as an alias for the `face' property.
176 (let ((elt (assq 'face char-property-alias-alist)))
177 (if elt
178 (unless (memq 'font-lock-face (cdr elt))
179 (setcdr elt (nconc (cdr elt) (list 'font-lock-face))))
e350babd 180 (push (list 'face 'font-lock-face) char-property-alias-alist))))
f62be99b 181 ;; Turn off Font Lock mode.
40e2bbe9 182 (unless mode
1b6adddb
CW
183 ;; Remove `font-lock-face' as an alias for the `face' property.
184 (set (make-local-variable 'char-property-alias-alist)
185 (copy-tree char-property-alias-alist))
186 (let ((elt (assq 'face char-property-alias-alist)))
187 (when elt
188 (setcdr elt (remq 'font-lock-face (cdr elt)))
189 (when (null (cdr elt))
e350babd
SM
190 (setq char-property-alias-alist
191 (delq elt char-property-alias-alist))))))
192
193 ;; Only do hard work if the mode has specified stuff in
194 ;; `font-lock-defaults'.
c98c6276 195 (when (font-lock-specified-p mode)
e350babd 196 (font-lock-mode-internal mode)))
71296446 197
f62be99b
CW
198(defun turn-on-font-lock ()
199 "Turn on Font Lock mode (only if the terminal can display it)."
200 (unless font-lock-mode
201 (font-lock-mode)))
202
f62be99b
CW
203;;; Global Font Lock mode.
204
205;; A few people have hassled in the past for a way to make it easier to turn on
206;; Font Lock mode, without the user needing to know for which modes s/he has to
207;; turn it on, perhaps the same way hilit19.el/hl319.el does. I've always
e1dbe924 208;; balked at that way, as I see it as just re-molding the same problem in
f62be99b
CW
209;; another form. That is; some person would still have to keep track of which
210;; modes (which may not even be distributed with Emacs) support Font Lock mode.
211;; The list would always be out of date. And that person might have to be me.
212
213;; Implementation.
214;;
215;; In a previous discussion the following hack came to mind. It is a gross
216;; hack, but it generally works. We use the convention that major modes start
217;; by calling the function `kill-all-local-variables', which in turn runs
218;; functions on the hook variable `change-major-mode-hook'. We attach our
219;; function `font-lock-change-major-mode' to that hook. Of course, when this
220;; hook is run, the major mode is in the process of being changed and we do not
221;; know what the final major mode will be. So, `font-lock-change-major-mode'
222;; only (a) notes the name of the current buffer, and (b) adds our function
35a46c5c 223;; `turn-on-font-lock-if-desired' to the hook variables
21178fee
LT
224;; `after-change-major-mode-hook' and `post-command-hook' (for modes
225;; that do not yet run `after-change-major-mode-hook'). By the time
f62be99b
CW
226;; the functions on the first of these hooks to be run are run, the new major
227;; mode is assumed to be in place. This way we get a Font Lock function run
228;; when a major mode is turned on, without knowing major modes or their hooks.
229;;
21178fee
LT
230;; Naturally this requires that major modes run `kill-all-local-variables'
231;; and `after-change-major-mode-hook', as they are supposed to. For modes
232;; that do not run `after-change-major-mode-hook' yet, `post-command-hook'
233;; takes care of things if the mode is set directly or indirectly by
234;; an interactive command; however, problems can occur if the mode is
235;; set by a timer or process: in that case, proper handling of Font Lock mode
236;; may be delayed until the next interactive command.
f62be99b
CW
237
238;; User interface.
239;;
240;; Although Global Font Lock mode is a pseudo-mode, I think that the user
241;; interface should conform to the usual Emacs convention for modes, i.e., a
242;; command to toggle the feature (`global-font-lock-mode') with a variable for
fffa137c 243;; finer control of the mode's behavior (`font-lock-global-modes').
f62be99b
CW
244;;
245;; The feature should not be enabled by loading font-lock.el, since other
246;; mechanisms for turning on Font Lock mode, such as M-x font-lock-mode RET or
247;; (add-hook 'c-mode-hook 'turn-on-font-lock), would cause Font Lock mode to be
248;; turned on everywhere. That would not be intuitive or informative because
249;; loading a file tells you nothing about the feature or how to control it. It
250;; would also be contrary to the Principle of Least Surprise. sm.
251
252(defcustom font-lock-global-modes t
9201cc28 253 "Modes for which Font Lock mode is automagically turned on.
f62be99b
CW
254Global Font Lock mode is controlled by the command `global-font-lock-mode'.
255If nil, means no modes have Font Lock mode automatically turned on.
256If t, all modes that support Font Lock mode have it automatically turned on.
257If a list, it should be a list of `major-mode' symbol names for which Font Lock
258mode should be automatically turned on. The sense of the list is negated if it
259begins with `not'. For example:
260 (c-mode c++-mode)
261means that Font Lock mode is turned on for buffers in C and C++ modes only."
262 :type '(choice (const :tag "none" nil)
263 (const :tag "all" t)
264 (set :menu-tag "mode specific" :tag "modes"
265 :value (not)
266 (const :tag "Except" not)
267 (repeat :inline t (symbol :tag "mode"))))
268 :group 'font-lock)
269
35a46c5c
RS
270(defun turn-on-font-lock-if-desired ()
271 (when (cond ((eq font-lock-global-modes t)
272 t)
273 ((eq (car-safe font-lock-global-modes) 'not)
274 (not (memq major-mode (cdr font-lock-global-modes))))
347437a5 275 (t (memq major-mode font-lock-global-modes)))
f62be99b
CW
276 (let (inhibit-quit)
277 (turn-on-font-lock))))
278
44cba17e 279(define-globalized-minor-mode global-font-lock-mode
35a46c5c 280 font-lock-mode turn-on-font-lock-if-desired
adba8116
SM
281 ;; What was this :extra-args thingy for? --Stef
282 ;; :extra-args (dummy)
283 :initialize 'custom-initialize-delay
3ff522d9
JL
284 :init-value (not (or noninteractive emacs-basic-display))
285 :group 'font-lock
286 :version "22.1")
f62be99b
CW
287
288;;; End of Global Font Lock mode.
289
290(provide 'font-core)
291
292;;; font-core.el ends here