X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/0479a1b62ceeb9586168146e2c8f49f2a5ebaf2f..73d213f2816876fe9c6c429e75a3be5454a42b34:/lisp/font-lock.el diff --git a/lisp/font-lock.el b/lisp/font-lock.el index 6c8392bc09..6f94f353c9 100644 --- a/lisp/font-lock.el +++ b/lisp/font-lock.el @@ -1,6 +1,6 @@ ;;; font-lock.el --- Electric font lock mode -;; Copyright (C) 1992-2015 Free Software Foundation, Inc. +;; Copyright (C) 1992-2016 Free Software Foundation, Inc. ;; Author: Jamie Zawinski ;; Richard Stallman @@ -538,12 +538,13 @@ and what they do: dollar-sign character. Hash characters in other contexts will still follow whatever the syntax table says about the hash character. - (\"\\\\('\\\\).\\\\('\\\\)\" + (\"\\\\(\\='\\\\).\\\\(\\='\\\\)\" (1 \"\\\"\") (2 \"\\\"\")) - gives a pair single-quotes, which surround a single character, a SYNTAX of - \"\\\"\" (meaning string quote syntax). Single-quote characters in other + gives a pair of apostrophes, which surround a single character, a + SYNTAX of \"\\\"\" (meaning string quote syntax). Apostrophes in other + contexts will not be affected. This is normally set via `font-lock-defaults'.") @@ -555,21 +556,6 @@ This is normally set via `font-lock-defaults'.") If this is nil, the major mode's syntax table is used. This is normally set via `font-lock-defaults'.") -(defvar font-lock-beginning-of-syntax-function nil - "Non-nil means use this function to move back outside all constructs. -When called with no args it should move point backward to a place which -is not in a string or comment and not within any bracket-pairs (or else, -a place such that any bracket-pairs outside it can be ignored for Emacs -syntax analysis and fontification). - -If this is nil, Font Lock uses `syntax-begin-function' to move back -outside of any comment, string, or sexp. This variable is semi-obsolete; -we recommend setting `syntax-begin-function' instead. - -This is normally set via `font-lock-defaults'.") -(make-obsolete-variable 'font-lock-beginning-of-syntax-function - 'syntax-begin-function "23.3" 'set) - (defvar font-lock-mark-block-function nil "Non-nil means use this function to mark a block of text. When called with no args it should leave point at the beginning of any @@ -585,11 +571,14 @@ This is normally set via `font-lock-defaults'.") This is used when turning off Font Lock mode. This is normally set via `font-lock-defaults'.") -(defvar font-lock-fontify-region-function 'font-lock-default-fontify-region +(defvar font-lock-fontify-region-function #'font-lock-default-fontify-region "Function to use for fontifying a region. It should take two args, the beginning and end of the region, and an optional third arg VERBOSE. If VERBOSE is non-nil, the function should print status -messages. This is normally set via `font-lock-defaults'.") +messages. This is normally set via `font-lock-defaults'. +If it fontifies a larger region, it should ideally return a list of the form +\(jit-lock-bounds BEG . END) indicating the bounds of the region actually +fontified.") (defvar font-lock-unfontify-region-function 'font-lock-default-unfontify-region "Function to use for unfontifying a region. @@ -600,6 +589,7 @@ This is normally set via `font-lock-defaults'.") "List of Font Lock mode related modes that should not be turned on. Currently, valid mode names are `fast-lock-mode', `jit-lock-mode' and `lazy-lock-mode'. This is normally set via `font-lock-defaults'.") +(make-obsolete-variable 'font-lock-inhibit-thing-lock nil "25.1") (defvar-local font-lock-multiline nil "Whether font-lock should cater to multiline keywords. @@ -679,9 +669,9 @@ end of the current highlighting list. For example: - (font-lock-add-keywords 'c-mode - '((\"\\\\\\=<\\\\(FIXME\\\\):\" 1 'font-lock-warning-face prepend) - (\"\\\\\\=<\\\\(and\\\\|or\\\\|not\\\\)\\\\\\=>\" . 'font-lock-keyword-face))) + (font-lock-add-keywords \\='c-mode + \\='((\"\\\\\\=<\\\\(FIXME\\\\):\" 1 \\='font-lock-warning-face prepend) + (\"\\\\\\=<\\\\(and\\\\|or\\\\|not\\\\)\\\\\\=>\" . \\='font-lock-keyword-face))) adds two fontification patterns for C mode, to fontify `FIXME:' words, even in comments, and to fontify `and', `or' and `not' words as keywords. @@ -692,12 +682,12 @@ pass nil for MODE and add the call to c-mode-hook. For example: - (add-hook 'c-mode-hook + (add-hook \\='c-mode-hook (lambda () (font-lock-add-keywords nil - '((\"\\\\\\=<\\\\(FIXME\\\\):\" 1 'font-lock-warning-face prepend) + \\='((\"\\\\\\=<\\\\(FIXME\\\\):\" 1 \\='font-lock-warning-face prepend) (\"\\\\\\=<\\\\(and\\\\|or\\\\|not\\\\)\\\\\\=>\" . - 'font-lock-keyword-face))))) + \\='font-lock-keyword-face))))) The above procedure may fail to add keywords to derived modes if some involved major mode does not follow the standard conventions. @@ -773,7 +763,7 @@ see the variables `c-font-lock-extra-types', `c++-font-lock-extra-types', (setq font-lock-removed-keywords-alist (delq cell font-lock-removed-keywords-alist))))))) -;; Written by Anders Lindgren . +;; Written by Anders Lindgren ;; ;; Case study: ;; (I) The keywords are removed from a major mode. @@ -935,7 +925,7 @@ The value of this variable is used when Font Lock mode is turned on." ;; Don't fontify eagerly (and don't abort if the buffer is large). (set (make-local-variable 'font-lock-fontified) t) ;; Use jit-lock. - (jit-lock-register 'font-lock-fontify-region + (jit-lock-register #'font-lock-fontify-region (not font-lock-keywords-only)) ;; Tell jit-lock how we extend the region to refontify. (add-hook 'jit-lock-after-change-extend-region-functions @@ -1075,7 +1065,8 @@ Called with two arguments BEG and END.") (defun font-lock-flush (&optional beg end) "Declare the region BEG...END's fontification as out-of-date. -If the region is not specified, it defaults to the whole buffer." +If the region is not specified, it defaults to the entire +accessible portion of the current buffer." (and font-lock-mode font-lock-fontified (funcall font-lock-flush-function @@ -1083,13 +1074,20 @@ If the region is not specified, it defaults to the whole buffer." (defvar font-lock-ensure-function (lambda (_beg _end) - (unless font-lock-fontified (font-lock-default-fontify-buffer))) + (unless font-lock-fontified + (font-lock-default-fontify-buffer) + (unless font-lock-mode + ;; If font-lock is not enabled, we don't have the hooks in place to + ;; track modifications, so a subsequent call to font-lock-ensure can't + ;; assume that the fontification is still valid. + (setq font-lock-fontified nil)))) "Function to make sure a region has been fontified. Called with two arguments BEG and END.") (defun font-lock-ensure (&optional beg end) "Make sure the region BEG...END has been fontified. -If the region is not specified, it defaults to the whole buffer." +If the region is not specified, it defaults to the entire accessible +portion of the buffer." (font-lock-set-defaults) (funcall font-lock-ensure-function (or beg (point-min)) (or end (point-max)))) @@ -1176,7 +1174,9 @@ Put first the functions more likely to cause a change and cheaper to compute.") (let ((changed nil)) (goto-char font-lock-beg) (unless (bolp) - (setq changed t font-lock-beg (line-beginning-position))) + (setq changed t font-lock-beg + (let ((inhibit-field-text-motion t)) + (line-beginning-position)))) (goto-char font-lock-end) (unless (bolp) (unless (eq font-lock-end @@ -1220,7 +1220,8 @@ This function is the default `font-lock-fontify-region-function'." (font-lock-fontify-syntactic-keywords-region start end))) (unless font-lock-keywords-only (font-lock-fontify-syntactically-region beg end loudly)) - (font-lock-fontify-keywords-region beg end loudly))))) + (font-lock-fontify-keywords-region beg end loudly) + `(jit-lock-bounds ,beg . ,end))))) ;; The following must be rethought, since keywords can override fontification. ;; ;; Now scan for keywords, but not if we are inside a comment now. @@ -1307,15 +1308,18 @@ This function does 2 things: (point-min)))) (when (< end (point-max)) (setq end - (if (get-text-property end 'font-lock-multiline) - (or (text-property-any end (point-max) - 'font-lock-multiline nil) - (point-max)) + (cond + ((get-text-property end 'font-lock-multiline) + (or (text-property-any end (point-max) + 'font-lock-multiline nil) + (point-max))) + ;; If `end' has been set by the function above, don't corrupt it. + (font-lock-extend-after-change-region-function end) ;; Rounding up to a whole number of lines should include the ;; line right after `end'. Typical case: the first char of ;; the line was deleted. Or a \n was inserted in the middle ;; of a line. - (1+ end)))) + (t (1+ end))))) ;; Finally, pre-enlarge the region to a whole number of lines, to try ;; and anticipate what font-lock-default-fontify-region will do, so as to ;; avoid double-redisplay. @@ -1341,11 +1345,11 @@ no ARG is given and `font-lock-mark-block-function' is nil. If `font-lock-mark-block-function' non-nil and no ARG is given, it is used to delimit the region to fontify." (interactive "P") - (let ((inhibit-point-motion-hooks t) font-lock-beginning-of-syntax-function + (let ((inhibit-point-motion-hooks t) deactivate-mark) ;; Make sure we have the right `font-lock-keywords' etc. (if (not font-lock-mode) (font-lock-set-defaults)) - (save-excursion + (save-mark-and-excursion (save-match-data (condition-case error-data (if (or arg (not font-lock-mark-block-function)) @@ -1759,11 +1763,10 @@ If SYNTACTIC-KEYWORDS is non-nil, it means these keywords are used for (cons t (cons keywords (mapcar #'font-lock-compile-keyword keywords)))) (if (and (not syntactic-keywords) - (let ((beg-function - (or font-lock-beginning-of-syntax-function - syntax-begin-function))) + (let ((beg-function syntax-begin-function)) (or (eq beg-function 'beginning-of-defun) - (get beg-function 'font-lock-syntax-paren-check))) + (if (symbolp beg-function) + (get beg-function 'font-lock-syntax-paren-check)))) (not beginning-of-defun-function)) ;; Try to detect when a string or comment contains something that ;; looks like a defun and would thus confuse font-lock. @@ -1884,17 +1887,14 @@ Sets various variables using `font-lock-defaults' and (list (car selem)) (mapcar 'identity (car selem)))) (modify-syntax-entry char syntax font-lock-syntax-table))))) - ;; Syntax function for syntactic fontification? - (if (nth 4 defaults) - (set (make-local-variable 'font-lock-beginning-of-syntax-function) - (nth 4 defaults)) - (kill-local-variable 'font-lock-beginning-of-syntax-function)) + ;; (nth 4 defaults) used to hold `font-lock-beginning-of-syntax-function', + ;; but that was removed in 25.1, so if it's a cons cell, we assume that + ;; it's part of the variable alist. ;; Variable alist? - (dolist (x (nthcdr 5 defaults)) + (dolist (x (nthcdr (if (consp (nth 4 defaults)) 4 5) defaults)) (set (make-local-variable (car x)) (cdr x))) ;; Set up `font-lock-keywords' last because its value might depend - ;; on other settings (e.g. font-lock-compile-keywords uses - ;; font-lock-beginning-of-syntax-function). + ;; on other settings. (set (make-local-variable 'font-lock-keywords) (font-lock-eval-keywords keywords)) ;; Local fontification?