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