From 49d758e5a91f19615fe1e7858b013c88d95da0a4 Mon Sep 17 00:00:00 2001 From: Gregory Heytings Date: Mon, 29 Mar 2021 09:31:15 +0000 Subject: [PATCH] Improve font-lock-update and rename it to font-lock-dwim * lisp/font-lock.el (font-lock-dwim): Renamed from 'font-lock-update'. Only refontify the region when it is active, and act more cautiously. * list/font-lock.el (font-lock-update-region): New function that calls the appropriate function depending on the current Font Lock state. * lisp/bindings.el (ctl-x-x-map): Adjust the command name. * etc/NEWS: Adjust the command name. --- etc/NEWS | 4 ++-- lisp/bindings.el | 2 +- lisp/font-lock.el | 33 +++++++++++++++++++++++++-------- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 2d66a93474..4747d49ac5 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -94,7 +94,7 @@ useful on systems such as FreeBSD which ships only with "etc/termcap". * Changes in Emacs 28.1 +++ -** New command 'font-lock-update', bound to 'C-x x f'. +** New command 'font-lock-dwim', bound to 'C-x x f'. This command updates the syntax highlighting in this buffer. ** The new NonGNU ELPA archive is enabled by default alongside GNU ELPA. @@ -255,7 +255,7 @@ The 'C-x x' keymap now holds keystrokes for various buffer-oriented commands. The new keystrokes are 'C-x x g' ('revert-buffer'), 'C-x x r' ('rename-buffer'), 'C-x x u' ('rename-uniquely'), 'C-x x n' ('clone-buffer'), 'C-x x i' ('insert-buffer'), 'C-x x t' -('toggle-truncate-lines') and 'C-x x f' ('font-lock-update'). +('toggle-truncate-lines') and 'C-x x f' ('font-lock-dwim'). --- ** Commands 'set-frame-width' and 'set-frame-height' can now get their diff --git a/lisp/bindings.el b/lisp/bindings.el index 6eac528eb6..6f25e9738a 100644 --- a/lisp/bindings.el +++ b/lisp/bindings.el @@ -1432,7 +1432,7 @@ ctl-x-map (defvar ctl-x-x-map (let ((map (make-sparse-keymap))) - (define-key map "f" #'font-lock-update) + (define-key map "f" #'font-lock-dwim) (define-key map "g" #'revert-buffer) (define-key map "r" #'rename-buffer) (define-key map "u" #'rename-uniquely) diff --git a/lisp/font-lock.el b/lisp/font-lock.el index 82915d8c8b..4fb66fc45a 100644 --- a/lisp/font-lock.el +++ b/lisp/font-lock.el @@ -1120,16 +1120,33 @@ font-lock-ensure (funcall font-lock-ensure-function (or beg (point-min)) (or end (point-max))))) -(defun font-lock-update (&optional arg) - "Updates the syntax highlighting in this buffer. -Refontify the accessible portion of this buffer, or enable Font Lock mode -in this buffer if it is currently disabled. With prefix ARG, toggle Font -Lock mode." +(defun font-lock-update-region (&optional beg end) + "Update the syntax highlighting between BEG and END. +Refontify depending on the current Font Lock mode state. +Font Lock mode can be disabled, in which case the text is unfontified, +or enabled but inactive, in which case the text is refontified, +or enabled and active, in which case the text fontification is flushed. +If the region is not specified, it defaults to the entire accessible +portion of the current buffer." + (let ((b (or beg (point-min))) + (e (or end (point-max)))) + (if (not font-lock-mode) + (font-lock-unfontify-region b e) + (if (not font-lock-keywords) + (font-lock-fontify-region b e) + (font-lock-flush b e))))) + +(defun font-lock-dwim (&optional arg) + "Update the syntax highlighting in this buffer. +Refontify the region if it is active, or the accessible portion of the +buffer. Otherwise, with prefix ARG, toggle Font Lock mode." (interactive "P") (save-excursion - (if (and (not arg) font-lock-mode) - (font-lock-fontify-region (point-min) (point-max)) - (font-lock-unfontify-region (point-min) (point-max)) + (if (not arg) + (if (use-region-p) + (font-lock-update-region (region-beginning) (region-end)) + (font-lock-update-region)) + (font-lock-update-region) (font-lock-mode 'toggle)))) (defun font-lock-default-fontify-buffer () -- 2.30.2