Subject: bug#77747: 'cursor-face-highlight-mode' signals 'args-out-of-range' in narrowed buffer

From: Ship Mints <[email-masked]>
Date: Sun, 13 Apr 2025 07:28:43 -0400

On Sun, Apr 13, 2025 at 5:52 AM Eli Zaretskii <[email-masked]> wrote:

> > From: Ship Mints <[email-masked]>
> > Date: Fri, 11 Apr 2025 11:32:18 -0400
> >
> > -Q reproducer
> >
> > ;; The culprit appears to be `redisplay--update-cursor-face-highlight'
> > (setq debug-on-error t)
> > (cursor-face-highlight-mode)
> > (save-excursion (insert (propertize "cursor face text\n"
> >                                     'cursor-face 'region)))
> > (narrow-to-region (pos-bol) (pos-eol))
> > (setq unread-command-events (mapcar #'identity
> >                                     (kbd "C-n")))
>
> Thanks, does the below fix it?
>
> diff --git a/lisp/simple.el b/lisp/simple.el
> index ee09a6f..9e9dd15 100644
> --- a/lisp/simple.el
> +++ b/lisp/simple.el
> @@ -7265,7 +7265,7 @@ redisplay--update-cursor-face-highlight
>                (pt (window-point window))
>                (cursor-face (get-text-property pt 'cursor-face)))
>          (let* ((start (previous-single-property-change
> -                       (1+ pt) 'cursor-face nil (point-min)))
> +                       (min (1+ pt) (point-min)) 'cursor-face nil
> (point-min)))
>                 (end (next-single-property-change
>                       pt 'cursor-face nil (point-max)))
>                 (new (redisplay--highlight-overlay-function
>

Not quite.  That winds up coalescing the highlight across lines rather than
just the line with the cursor.

This works better but I'm not sure if this is in the true spirit of the
intended use as the property change may not be floored to bol?

diff --git a/lisp/simple.el b/lisp/simple.el
index 7037158df8d..9ebe9a0ba34 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -7259,7 +7259,7 @@ redisplay--update-cursor-face-highlight
               (pt (window-point window))
               (cursor-face (get-text-property pt 'cursor-face)))
         (let* ((start (previous-single-property-change
-                       (1+ pt) 'cursor-face nil (point-min)))
+                       (min (1+ pt) (pos-bol)) 'cursor-face nil
(point-min)))
                (end (next-single-property-change
                      pt 'cursor-face nil (point-max)))
                (new (redisplay--highlight-overlay-function