Skip to content

Commit

Permalink
* lisp/font-lock.el (font-lock-flush, font-lock-ensure): New functions.
Browse files Browse the repository at this point in the history
(font-lock-fontify-buffer): Mark interactive-only.
(font-lock-multiline, font-lock-fontified, font-lock-set-defaults):
Make buffer-local.
(font-lock-specified-p): Remove redundant boundp check.
(font-lock-flush-function, font-lock-ensure-function): New vars.
(font-lock-turn-on-thing-lock): Set them.
(font-lock-default-fontify-buffer): Obey font-lock-dont-widen.
(font-lock-after-change-function): Make `old-len' optional.
(font-lock-set-defaults): Remove redundant `set' of font-lock-defaults.
Call font-lock-flush, just in case.
* lisp/progmodes/verilog-mode.el (verilog-preprocess): Disable workaround in
recent Emacsen.
* lisp/progmodes/vera-mode.el (vera-fontify-buffer): Declare obsolete.
(vera-mode-map, vera-mode-menu): Remove bindings to it.
* lisp/progmodes/idlw-help.el (idlwave-help-fontify): Use font-lock-ensure
and with-syntax-table.
* lisp/textmodes/conf-mode.el (conf-quote-normal):
* lisp/progmodes/sh-script.el (sh-set-shell):
* lisp/progmodes/prog-mode.el (prettify-symbols-mode):
* lisp/progmodes/f90.el (f90-font-lock-n):
* lisp/progmodes/cwarn.el (cwarn-mode):
* lisp/nxml/nxml-mode.el (nxml-toggle-char-ref-extra-display):
* lisp/progmodes/compile.el (compilation-setup, compilation--unsetup):
* lisp/hi-lock.el (hi-lock-mode, hi-lock-unface-buffer)
(hi-lock-set-pattern, hi-lock-set-file-patterns): Use font-lock-flush.
* lisp/mail/rmail.el (rmail-variables): Set font-lock-dont-widen instead of
font-lock-fontify-buffer-function and
font-lock-unfontify-buffer-function.
(rmail-unfontify-buffer-function, rmail-fontify-message):
Use with-silent-modifications.
* lisp/htmlfontify.el (hfy-force-fontification): Use jit-lock-fontify-now
and font-lock-ensure.
* lisp/bs.el (bs-show-in-buffer): Use font-lock-ensure.
* lisp/gnus/mm-view.el (mm-display-inline-fontify): Use font-lock-ensure.
* lisp/gnus/gnus-cite.el (gnus-message-citation-mode): Use font-lock-flush.
* lisp/org/org-compat.el (org-font-lock-ensure): New function.
* lisp/org/ox-odt.el (org-odt-do-format-code):
* lisp/org/ox-html.el (org-html-fontify-code):
* lisp/org/org.el (org-fontify-like-in-org-mode):
* lisp/org/org-src.el (org-src-font-lock-fontify-block):
* lisp/org/org-clock.el (org-clock-get-clocktable): Use it.
* lisp/org/ox-org.el (org-org-publish-to-org): Use it.  Avoid using find-file
from Elisp.
* test/automated/ruby-mode-tests.el (ruby-assert-face): Use font-lock-ensure.
(ruby-interpolation-keeps-non-quote-syntax): Use syntax-propertize.
  • Loading branch information
monnier committed May 29, 2014
1 parent 2662ca5 commit 6711a21
Show file tree
Hide file tree
Showing 33 changed files with 564 additions and 461 deletions.
4 changes: 4 additions & 0 deletions etc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ performance improvements when pasting large amounts of text.

* Changes in Specialized Modes and Packages in Emacs 24.5

** font-lock
*** New functions font-lock-ensure and font-lock-flush that should be used
instead of font-lock-fontify-buffer when called from Elisp.

---
** The Rmail commands d, C-d and u now handle repeat counts
to delete or undelete multiple messages.
Expand Down
37 changes: 37 additions & 0 deletions lisp/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,40 @@
2014-05-29 Stefan Monnier <monnier@iro.umontreal.ca>

* font-lock.el (font-lock-flush, font-lock-ensure): New functions.
(font-lock-fontify-buffer): Mark interactive-only.
(font-lock-multiline, font-lock-fontified, font-lock-set-defaults):
Make buffer-local.
(font-lock-specified-p): Remove redundant boundp check.
(font-lock-flush-function, font-lock-ensure-function): New vars.
(font-lock-turn-on-thing-lock): Set them.
(font-lock-default-fontify-buffer): Obey font-lock-dont-widen.
(font-lock-after-change-function): Make `old-len' optional.
(font-lock-set-defaults): Remove redundant `set' of font-lock-defaults.
Call font-lock-flush, just in case.
* progmodes/verilog-mode.el (verilog-preprocess): Disable workaround in
recent Emacsen.
* progmodes/vera-mode.el (vera-fontify-buffer): Declare obsolete.
(vera-mode-map, vera-mode-menu): Remove bindings to it.
* progmodes/idlw-help.el (idlwave-help-fontify): Use font-lock-ensure
and with-syntax-table.
* textmodes/conf-mode.el (conf-quote-normal):
* progmodes/sh-script.el (sh-set-shell):
* progmodes/prog-mode.el (prettify-symbols-mode):
* progmodes/f90.el (f90-font-lock-n):
* progmodes/cwarn.el (cwarn-mode):
* nxml/nxml-mode.el (nxml-toggle-char-ref-extra-display):
* progmodes/compile.el (compilation-setup, compilation--unsetup):
* hi-lock.el (hi-lock-mode, hi-lock-unface-buffer)
(hi-lock-set-pattern, hi-lock-set-file-patterns): Use font-lock-flush.
* mail/rmail.el (rmail-variables): Set font-lock-dont-widen instead of
font-lock-fontify-buffer-function and
font-lock-unfontify-buffer-function.
(rmail-unfontify-buffer-function, rmail-fontify-message):
Use with-silent-modifications.
* htmlfontify.el (hfy-force-fontification): Use jit-lock-fontify-now
and font-lock-ensure.
* bs.el (bs-show-in-buffer): Use font-lock-ensure.

2014-05-28 Thien-Thi Nguyen <ttn@gnu.org>

* emacs-lisp/package.el (package-generate-autoloads):
Expand Down
2 changes: 1 addition & 1 deletion lisp/bs.el
Original file line number Diff line number Diff line change
Expand Up @@ -1143,7 +1143,7 @@ and move point to current buffer."
(delete-char -1)
(bs--set-window-height)
(bs--goto-current-buffer)
(font-lock-fontify-buffer)
(font-lock-ensure)
(bs-apply-sort-faces)
(set-buffer-modified-p nil)))

Expand Down
10 changes: 5 additions & 5 deletions lisp/calendar/calendar.el
Original file line number Diff line number Diff line change
Expand Up @@ -1475,16 +1475,16 @@ Optional integers MON and YR are used instead of today's date."
(set-window-vscroll nil 0))
(sit-for 0))
(and (bound-and-true-p font-lock-mode)
(font-lock-fontify-buffer))
(font-lock-fontify-buffer)) ;FIXME: Why?
(and calendar-mark-holidays-flag
;;; (calendar-date-is-valid-p today) ; useful for BC dates
;; (calendar-date-is-valid-p today) ; useful for BC dates
(calendar-mark-holidays)
(and in-calendar-window (sit-for 0)))
(unwind-protect
(if calendar-mark-diary-entries-flag (diary-mark-entries))
(if today-visible
(run-hooks 'calendar-today-visible-hook)
(run-hooks 'calendar-today-invisible-hook)))))
(run-hooks (if today-visible
'calendar-today-visible-hook
'calendar-today-invisible-hook)))))

(defun calendar-generate (month year)
"Generate a three-month Gregorian calendar centered around MONTH, YEAR."
Expand Down
73 changes: 57 additions & 16 deletions lisp/font-lock.el
Original file line number Diff line number Diff line change
Expand Up @@ -601,14 +601,14 @@ This is normally set via `font-lock-defaults'.")
Currently, valid mode names are `fast-lock-mode', `jit-lock-mode' and
`lazy-lock-mode'. This is normally set via `font-lock-defaults'.")

(defvar font-lock-multiline nil
(defvar-local font-lock-multiline nil
"Whether font-lock should cater to multiline keywords.
If nil, don't try to handle multiline patterns.
If t, always handle multiline patterns.
If `undecided', don't try to handle multiline patterns until you see one.
Major/minor modes can set this variable if they know which option applies.")

(defvar font-lock-fontified nil) ; Whether we have fontified the buffer.
(defvar-local font-lock-fontified nil) ; Whether we have fontified the buffer.

;; Font Lock mode.

Expand All @@ -626,6 +626,8 @@ Major/minor modes can set this variable if they know which option applies.")
;; Shut up the byte compiler.
(defvar font-lock-face-attributes)) ; Obsolete but respected if set.

(defvar-local font-lock-set-defaults nil) ; Whether we have set up defaults.

(defun font-lock-specified-p (mode)
"Return non-nil if the current buffer is ready for fontification.
The MODE argument, if non-nil, means Font Lock mode is about to
Expand All @@ -634,7 +636,6 @@ be enabled."
(and (boundp 'font-lock-keywords)
font-lock-keywords)
(and mode
(boundp 'font-lock-set-defaults)
font-lock-set-defaults
font-lock-major-mode
(not (eq font-lock-major-mode major-mode)))))
Expand Down Expand Up @@ -921,6 +922,14 @@ The value of this variable is used when Font Lock mode is turned on."
;; Prepare for jit-lock
(remove-hook 'after-change-functions
'font-lock-after-change-function t)
(set (make-local-variable 'font-lock-flush-function)
'jit-lock-refontify)
(set (make-local-variable 'font-lock-ensure-function)
'jit-lock-fontify-now)
;; Prevent font-lock-fontify-buffer from fontifying eagerly the whole
;; buffer. This is important for things like CWarn mode which
;; adds/removes a few keywords and does a refontify (which takes ages on
;; large files).
(set (make-local-variable 'font-lock-fontify-buffer-function)
'jit-lock-refontify)
;; Don't fontify eagerly (and don't abort if the buffer is large).
Expand Down Expand Up @@ -1025,12 +1034,23 @@ This function should preserve the match-data.
The region it returns may start or end in the middle of a line.")
(make-variable-buffer-local 'font-lock-extend-after-change-region-function)

(defun font-lock-fontify-buffer ()
(defun font-lock-fontify-buffer (&optional interactively)
"Fontify the current buffer the way the function `font-lock-mode' would."
(interactive)
(declare
;; When called from Lisp, this function is a big mess. The caller usually
;; expects one of the following behaviors:
;; - refresh the highlighting (because the font-lock-keywords have been
;; changed).
;; - apply font-lock highlighting even if font-lock-mode is not enabled.
;; - reset the highlighting rules because font-lock-defaults
;; has been changed (and then rehighlight everything).
;; Of course, this function doesn't do all of the above in all situations
;; (e.g. depending on whether jit-lock is in use) and it can't guess what
;; the caller wants.
(interactive-only "use font-lock-ensure or font-lock-flush instead."))
(interactive "p")
(font-lock-set-defaults)
(let ((font-lock-verbose (or font-lock-verbose
(called-interactively-p 'interactive))))
(let ((font-lock-verbose (or font-lock-verbose interactively)))
(funcall font-lock-fontify-buffer-function)))

(defun font-lock-unfontify-buffer ()
Expand All @@ -1049,6 +1069,31 @@ This works by calling `font-lock-unfontify-region-function'."
(save-buffer-state
(funcall font-lock-unfontify-region-function beg end)))

(defvar font-lock-flush-function #'font-lock-after-change-function
"Function to use to mark a region for refontification.
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."
(and font-lock-mode
font-lock-fontified
(funcall font-lock-flush-function
(or beg (point-min)) (or end (point-max)))))

(defvar font-lock-ensure-function
(lambda (_beg _end)
(unless font-lock-fontified (font-lock-default-fontify-buffer)))
"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."
(font-lock-set-defaults)
(funcall font-lock-ensure-function
(or beg (point-min)) (or end (point-max))))

(defun font-lock-default-fontify-buffer ()
"Fontify the whole buffer using `font-lock-fontify-region-function'."
(let ((verbose (if (numberp font-lock-verbose)
Expand All @@ -1059,7 +1104,7 @@ This works by calling `font-lock-unfontify-region-function'."
(format "Fontifying %s..." (buffer-name)))
;; Make sure we fontify etc. in the whole buffer.
(save-restriction
(widen)
(unless font-lock-dont-widen (widen))
(condition-case nil
(save-excursion
(save-match-data
Expand Down Expand Up @@ -1201,7 +1246,7 @@ This function is the default `font-lock-unfontify-region-function'."
'(face font-lock-multiline)))))

;; Called when any modification is made to buffer text.
(defun font-lock-after-change-function (beg end old-len)
(defun font-lock-after-change-function (beg end &optional old-len)
(save-excursion
(let ((inhibit-point-motion-hooks t)
(inhibit-quit t)
Expand Down Expand Up @@ -1786,8 +1831,6 @@ A LEVEL of nil is equal to a LEVEL of 0, a LEVEL of t is equal to
(t
(car keywords))))

(defvar font-lock-set-defaults nil) ; Whether we have set up defaults.

(defun font-lock-refresh-defaults ()
"Restart fontification in current buffer after recomputing from defaults.
Recompute fontification variables using `font-lock-defaults' and
Expand Down Expand Up @@ -1815,17 +1858,14 @@ Sets various variables using `font-lock-defaults' and
(unless (and font-lock-set-defaults
(eq font-lock-major-mode major-mode))
(setq font-lock-major-mode major-mode)
(set (make-local-variable 'font-lock-set-defaults) t)
(make-local-variable 'font-lock-fontified)
(make-local-variable 'font-lock-multiline)
(setq font-lock-set-defaults t)
(let* ((defaults font-lock-defaults)
(keywords
(font-lock-choose-keywords (nth 0 defaults)
(font-lock-value-in-major-mode font-lock-maximum-decoration)))
(local (cdr (assq major-mode font-lock-keywords-alist)))
(removed-keywords
(cdr-safe (assq major-mode font-lock-removed-keywords-alist))))
(set (make-local-variable 'font-lock-defaults) defaults)
;; Syntactic fontification?
(if (nth 1 defaults)
(set (make-local-variable 'font-lock-keywords-only) t)
Expand Down Expand Up @@ -1868,7 +1908,8 @@ Sets various variables using `font-lock-defaults' and
;; Now compile the keywords.
(unless (eq (car font-lock-keywords) t)
(setq font-lock-keywords
(font-lock-compile-keywords font-lock-keywords))))))
(font-lock-compile-keywords font-lock-keywords))))
(font-lock-flush)))

;;; Color etc. support.

Expand Down
17 changes: 11 additions & 6 deletions lisp/gnus/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
2014-05-29 Stefan Monnier <monnier@iro.umontreal.ca>

* mm-view.el (mm-display-inline-fontify): Use font-lock-ensure.
* gnus-cite.el (gnus-message-citation-mode): Use font-lock-flush.

2014-05-15 Katsumi Yamaoka <yamaoka@jpl.org>

* gnus-art.el (gnus-mime-inline-part, gnus-mm-display-part): Don't
delete next part button; keep spacing between buttons.
* gnus-art.el (gnus-mime-inline-part, gnus-mm-display-part):
Don't delete next part button; keep spacing between buttons.

2014-05-14 Katsumi Yamaoka <yamaoka@jpl.org>

Expand Down Expand Up @@ -45,8 +50,8 @@
* mm-decode.el (mm-display-part): Don't insert a newline in the top.
(mm-shr): Make undisplayer unbreakable.

* mm-view.el (mm-inline-image-emacs, mm-inline-image-xemacs): Don't
insert excessive newline.
* mm-view.el (mm-inline-image-emacs, mm-inline-image-xemacs):
Don't insert excessive newline.
(mm-inline-text-html-render-with-w3m, mm-inline-text)
(mm-insert-inline): Make undisplayer unbreakable.

Expand Down Expand Up @@ -148,8 +153,8 @@

2014-03-23 Katsumi Yamaoka <yamaoka@jpl.org>

* gnus-art.el (gnus-mime-buttonize-attachments-in-header): Display
buttons that are hidden in unselected alternative part as well.
* gnus-art.el (gnus-mime-buttonize-attachments-in-header):
Display buttons that are hidden in unselected alternative part as well.
(gnus-mime-display-alternative): Redraw attachment buttons in header.

* gmm-utils.el (gmm-labels): Add edebug spec.
Expand Down
9 changes: 6 additions & 3 deletions lisp/gnus/gnus-cite.el
Original file line number Diff line number Diff line change
Expand Up @@ -1204,7 +1204,8 @@ When enabled, it automatically turns on `font-lock-mode'."
nil ;; init-value
"" ;; lighter
nil ;; keymap
(when (eq major-mode 'message-mode)
(when (eq major-mode 'message-mode) ;FIXME: Use derived-mode-p.
;; FIXME: Use font-lock-add-keywords!
(let ((defaults (car (if (featurep 'xemacs)
(get 'message-mode 'font-lock-defaults)
font-lock-defaults)))
Expand Down Expand Up @@ -1233,8 +1234,10 @@ When enabled, it automatically turns on `font-lock-mode'."
font-lock-keywords nil))
(setq font-lock-set-defaults nil))
(font-lock-set-defaults)
(cond ((symbol-value 'font-lock-mode)
(font-lock-fontify-buffer))
(cond (font-lock-mode
(if (fboundp 'font-lock-flush)
(font-lock-flush)
(font-lock-fontify-buffer)))
(gnus-message-citation-mode
(font-lock-mode 1)))))

Expand Down
6 changes: 4 additions & 2 deletions lisp/gnus/mm-view.el
Original file line number Diff line number Diff line change
Expand Up @@ -520,9 +520,11 @@ If MODE is not set, try to find mode automatically."
(set-auto-mode)))
;; The mode function might have already turned on font-lock.
;; Do not fontify if the guess mode is fundamental.
(unless (or (symbol-value 'font-lock-mode)
(unless (or font-lock-mode
(eq major-mode 'fundamental-mode))
(font-lock-fontify-buffer))))
(if (fboundp 'font-lock-ensure)
(font-lock-ensure)
(font-lock-fontify-buffer)))))
;; By default, XEmacs font-lock uses non-duplicable text
;; properties. This code forces all the text properties
;; to be copied along with the text.
Expand Down
8 changes: 4 additions & 4 deletions lisp/hi-lock.el
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,7 @@ versions before 22 use the following in your init file:
(font-lock-remove-keywords nil hi-lock-file-patterns)
(setq hi-lock-file-patterns nil))
(remove-overlays nil nil 'hi-lock-overlay t)
(when font-lock-fontified (font-lock-fontify-buffer)))
(font-lock-flush))
(define-key-after menu-bar-edit-menu [hi-lock] nil)
(remove-hook 'font-lock-mode-hook 'hi-lock-font-lock-hook t)))

Expand Down Expand Up @@ -601,7 +601,7 @@ then remove all hi-lock highlighting."
(delq keyword hi-lock-interactive-patterns))
(remove-overlays
nil nil 'hi-lock-overlay-regexp (hi-lock--hashcons (car keyword)))
(when font-lock-fontified (font-lock-fontify-buffer)))))
(font-lock-flush))))

;;;###autoload
(defun hi-lock-write-interactive-patterns ()
Expand Down Expand Up @@ -695,7 +695,7 @@ with completion and history."
(if (and font-lock-mode (font-lock-specified-p major-mode))
(progn
(font-lock-add-keywords nil (list pattern) t)
(font-lock-fontify-buffer))
(font-lock-flush))
(let* ((range-min (- (point) (/ hi-lock-highlight-range 2)))
(range-max (+ (point) (/ hi-lock-highlight-range 2)))
(search-start
Expand All @@ -719,7 +719,7 @@ with completion and history."
(font-lock-remove-keywords nil hi-lock-file-patterns)
(setq hi-lock-file-patterns patterns)
(font-lock-add-keywords nil hi-lock-file-patterns t)
(font-lock-fontify-buffer)))
(font-lock-flush)))

(defun hi-lock-find-patterns ()
"Find patterns in current buffer for hi-lock."
Expand Down
26 changes: 17 additions & 9 deletions lisp/htmlfontify.el
Original file line number Diff line number Diff line change
Expand Up @@ -1809,17 +1809,25 @@ fontified. This is a simple convenience wrapper around
(eval-and-compile (require 'font-lock))
(if (boundp 'font-lock-cache-position)
(or font-lock-cache-position
(set 'font-lock-cache-position (make-marker))))
(if (not noninteractive)
(progn
(message "hfy interactive mode (%S %S)" window-system major-mode)
(when (and font-lock-defaults
font-lock-mode)
(font-lock-fontify-region (point-min) (point-max) nil)))
(setq font-lock-cache-position (make-marker))))
(cond
(noninteractive
(message "hfy batch mode (%s:%S)"
(or (buffer-file-name) (buffer-name)) major-mode)
(when font-lock-defaults
(font-lock-fontify-buffer)) ))
(if (fboundp 'font-lock-ensure)
(font-lock-ensure)
(when font-lock-defaults
(font-lock-fontify-buffer))))
((fboundp #'jit-lock-fontify-now)
(message "hfy jit-lock mode (%S %S)" window-system major-mode)
(jit-lock-fontify-now))
(t
(message "hfy interactive mode (%S %S)" window-system major-mode)
;; If jit-lock is not in use, then the buffer is already fontified!
;; (when (and font-lock-defaults
;; font-lock-mode)
;; (font-lock-fontify-region (point-min) (point-max) nil))
)))

;;;###autoload
(defun htmlfontify-buffer (&optional srcdir file)
Expand Down
Loading

0 comments on commit 6711a21

Please sign in to comment.