[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#58122: 28.2; overlay before/after-string does not render more than o
From: |
Eli Zaretskii |
Subject: |
bug#58122: 28.2; overlay before/after-string does not render more than one fringe display spec |
Date: |
Wed, 28 Sep 2022 16:40:44 +0300 |
tags 58122 wontfix
thanks
> Date: Tue, 27 Sep 2022 11:05:10 -0700
> From: "Josh Caswell" <emacs@woolsweater.net>
>
> An overlay `before-string' or `after-string' property with both left and
> right fringe display specs only seems to render the first spec.
>
> *Demonstration*:
> - Launch GUI Emacs with the -q flag
> - In an Elisp buffer, define these two commands
>
> (defun insert-two-squares ()
> (interactive)
> (insert (propertize " " 'display [(left-fringe hollow-square)
> (right-fringe hollow-square)])))
>
> (defun overlay-two-squares (right-first)
> (interactive "P")
> (remove-overlays)
> (let ((ov (make-overlay (point) (point)))
> (specs [(left-fringe hollow-square)
> (right-fringe hollow-square)]))
> (overlay-put ov 'before-string
> (propertize " "
> 'display
> (if right-first
> (reverse specs)
> specs)))))
>
> - Switch to a new test buffer
> - Invoke `insert-two-squares'; observe that both left and right fringes
> display a hollow square
> - Delete the inserted character (fringe bitmaps disappear)
> - Invoke `overlay-two-squares'; observe that only the left fringe displays a
> hollow square
> - Invoke `overlay-two-squares' prefixed with `C-u'; observe that only the
> _right_ fringe displays the hollow square
>
> The same behavior is seen if the overlay property is `after-string' rather
> than `before-string'.
>
> *Expectation*:
> Based on the display spec documentation I would expect the overlay to render
> fringes the same way as an inserted propertized string.
Thank you for your report.
This was never supported in Emacs. The reasons are subtle and very
technical, and I will not go into them here. Making this work as
expected might be possible, but it would require changes on a very low
level in the code that handles nested display properties and overlay
strings, which is already extremely complicated. I find changes of
such nature unjustified for such a fringe (pun intended) use case.
As an easy work-around, you can have 2 different overlay strings at
the same position, like this:
(defun insert-two-overlays ()
(interactive)
(remove-overlays)
(let ((ov1 (make-overlay (point) (point)))
(ov2 (make-overlay (point) (point))))
(overlay-put ov1 'before-string
(propertize " " 'display '(left-fringe hollow-square)))
(overlay-put ov2 'before-string
(propertize " " 'display '(right-fringe hollow-square)))))