unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Gregory Heytings <gregory@heytings.org>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: emacs-devel@gnu.org
Subject: Re: master 2399541: Remove font-lock toggle from font-lock-update
Date: Mon, 29 Mar 2021 09:44:03 +0000	[thread overview]
Message-ID: <a83bd81e9adc74c7d496@heytings.org> (raw)
In-Reply-To: <jwvmtuq98wh.fsf-monnier+emacs@gnu.org>

[-- Attachment #1: Type: text/plain, Size: 997 bytes --]


Thanks for your detailed reply!

>
> Yes, there are three cases: - font-lock-mode is nil - font-lock-mode is 
> t but the font-lock machinery is not activated (e.g. in text-mode with 
> the default config). - font-lock fully activated.
>

With this indication and another mail you sent to Eli, I think I finally 
understand what you mean.  One thing I'm not entirely sure is whether the 
second case is (and font-lock-mode (not font-lock-keywords)) or (and 
font-lock-mode (not font-lock-fontified)), but my guess is that 
font-lock-fontified is an internal variable and that it is safer to use 
font-lock-keywords here.

>> +Otherwise, with prefix ARG, toggle Font Lock mode."
>
> Is this behavior useful?
>

I think it is, yes, and I think it makes sense to use the prefix argument 
for that.  M-x font-lock-mode does not always produce the expected effect, 
which can be puzzling, so having a way to "do what I mean" in a command is 
useful.

I attach the patch, updated with your suggestions.

[-- Attachment #2: Type: text/x-diff, Size: 4248 bytes --]

From 49d758e5a91f19615fe1e7858b013c88d95da0a4 Mon Sep 17 00:00:00 2001
From: Gregory Heytings <gregory@heytings.org>
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


  reply	other threads:[~2021-03-29  9:44 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20210324143048.23515.75257@vcs0.savannah.gnu.org>
     [not found] ` <20210324143050.40C6E20D10@vcs0.savannah.gnu.org>
2021-03-24 15:23   ` master 2399541: Remove font-lock toggle from font-lock-update Stefan Monnier
2021-03-24 15:28     ` Lars Ingebrigtsen
2021-03-24 15:47       ` Stefan Monnier
2021-03-24 15:29     ` Paul W. Rankin via Emacs development discussions.
2021-03-24 15:32     ` Gregory Heytings
2021-03-24 15:43       ` Lars Ingebrigtsen
2021-03-24 16:03         ` Lars Ingebrigtsen
2021-03-24 17:43           ` Paul W. Rankin via Emacs development discussions.
2021-03-24 17:49             ` Lars Ingebrigtsen
2021-03-24 22:07               ` Stefan Monnier
2021-03-24 22:27                 ` Gregory Heytings
2021-03-25 13:52                   ` Stefan Monnier
2021-03-25 20:58                     ` Gregory Heytings
2021-03-25 22:39                       ` Stefan Monnier
2021-03-29  9:44                         ` Gregory Heytings [this message]
2021-03-29 13:00                           ` Stefan Monnier
2021-03-29 14:40                             ` Gregory Heytings
2021-03-29 15:50                               ` Stefan Monnier
2021-03-25  9:09                 ` Lars Ingebrigtsen
2021-03-25 10:14                   ` Gregory Heytings
2021-03-25 11:00                     ` Alan Mackenzie
2021-03-25  2:07               ` Paul W. Rankin via Emacs development discussions.

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a83bd81e9adc74c7d496@heytings.org \
    --to=gregory@heytings.org \
    --cc=emacs-devel@gnu.org \
    --cc=monnier@iro.umontreal.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).