GNU bug report logs - #58122
28.2; overlay before/after-string does not render more than one fringe display spec

Previous Next

Package: emacs;

Reported by: "Josh Caswell" <emacs <at> woolsweater.net>

Date: Tue, 27 Sep 2022 19:17:02 UTC

Severity: normal

Tags: wontfix

Found in version 28.2

Done: Eli Zaretskii <eliz <at> gnu.org>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 58122 in the body.
You can then email your comments to 58122 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#58122; Package emacs. (Tue, 27 Sep 2022 19:17:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to "Josh Caswell" <emacs <at> woolsweater.net>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Tue, 27 Sep 2022 19:17:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: "Josh Caswell" <emacs <at> woolsweater.net>
To: bug-gnu-emacs <at> gnu.org
Subject: 28.2; overlay before/after-string does not render more than one fringe
 display spec
Date: Tue, 27 Sep 2022 11:05:10 -0700
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.


In GNU Emacs 28.2 (build 1, aarch64-apple-darwin21.1.0, NS appkit-2113.00 Version 12.0.1 (Build 21A559))
of 2022-09-12 built on armbob.lan
Windowing system distributor 'Apple', version 10.3.2113
System Description:  macOS 12.0.1

Configured using:
'configure --with-ns '--enable-locallisppath=/Library/Application
Support/Emacs/${version}/site-lisp:/Library/Application
Support/Emacs/site-lisp' --with-modules'

Configured features:
ACL GMP GNUTLS JSON LIBXML2 MODULES NOTIFY KQUEUE NS PDUMPER THREADS
TOOLKIT_SCROLL_BARS ZLIB

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  indent-tabs-mode: t
  transient-mark-mode: t

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message rmc puny dired dired-loaddefs
rfc822 mml mml-sec epa derived epg rfc6068 epg-config gnus-util rmail
rmail-loaddefs auth-source cl-seq eieio eieio-core cl-macs
eieio-loaddefs password-cache json map text-property-search seq byte-opt
gv bytecomp byte-compile cconv mm-decode mm-bodies mm-encode mail-parse
rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045
ietf-drums mm-util mail-prsvr mail-utils time-date subr-x edmacro kmacro
cl-loaddefs cl-lib iso-transl tooltip eldoc paren electric uniquify
ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/ns-win ns-win
ucs-normalize mule-util term/common-win tool-bar dnd fontset image
regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode
prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu
timer select scroll-bar mouse jit-lock font-lock syntax font-core
term/tty-colors frame minibuffer cl-generic cham georgian utf-8-lang
misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms
cp51932 hebrew greek romanian slovak czech european ethiopic indian
cyrillic chinese composite emoji-zwj charscript charprop case-table
epa-hook jka-cmpr-hook help simple abbrev obarray cl-preloaded nadvice
button loaddefs faces cus-face macroexp files window text-properties
overlay sha1 md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote threads kqueue cocoa ns multi-tty
make-network-process emacs)

Memory information:
((conses 16 52550 8825)
(symbols 48 6664 1)
(strings 32 18735 1663)
(string-bytes 1 623539)
(vectors 16 14125)
(vector-slots 8 194959 12178)
(floats 8 23 44)
(intervals 56 313 0)
(buffers 992 12))




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#58122; Package emacs. (Wed, 28 Sep 2022 13:41:02 GMT) Full text and rfc822 format available.

Message #8 received at 58122 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: "Josh Caswell" <emacs <at> woolsweater.net>
Cc: 58122 <at> debbugs.gnu.org
Subject: Re: 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 <at> 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)))))





Added tag(s) wontfix. Request was from Eli Zaretskii <eliz <at> gnu.org> to control <at> debbugs.gnu.org. (Wed, 28 Sep 2022 13:41:02 GMT) Full text and rfc822 format available.

Reply sent to Eli Zaretskii <eliz <at> gnu.org>:
You have taken responsibility. (Thu, 29 Sep 2022 06:14:01 GMT) Full text and rfc822 format available.

Notification sent to "Josh Caswell" <emacs <at> woolsweater.net>:
bug acknowledged by developer. (Thu, 29 Sep 2022 06:14:02 GMT) Full text and rfc822 format available.

Message #15 received at 58122-done <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Josh <emacs <at> woolsweater.net>
Cc: 58122-done <at> debbugs.gnu.org
Subject: Re: bug#58122: 28.2;
 overlay before/after-string does not render more than one
 fringe display spec
Date: Thu, 29 Sep 2022 09:12:57 +0300
> Date: Wed, 28 Sep 2022 18:18:57 -0700
> From: Josh <emacs <at> woolsweater.net>
> Cc: 58122 <at> debbugs.gnu.org
> 
> > 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:
> 
> Got it. I think this workaround should be sufficient. Thank you for the quick response!

Thanks, so I'm closing this bug report.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#58122; Package emacs. (Thu, 29 Sep 2022 14:58:03 GMT) Full text and rfc822 format available.

Message #18 received at 58122 <at> debbugs.gnu.org (full text, mbox):

From: Josh <emacs <at> woolsweater.net>
To: "Eli Zaretskii" <eliz <at> gnu.org>
Cc: 58122 <at> debbugs.gnu.org
Subject: Re: bug#58122: 28.2;
 overlay before/after-string does not render more than one
 fringe display spec
Date: Wed, 28 Sep 2022 18:18:57 -0700

On Wed, Sep 28, 2022, at 6:40 AM, Eli Zaretskii wrote:
> tags 58122 wontfix
> thanks
>
>> Date: Tue, 27 Sep 2022 11:05:10 -0700
>> From: "Josh Caswell" <emacs <at> 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:

Got it. I think this workaround should be sufficient. Thank you for the quick response!




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Fri, 28 Oct 2022 11:24:05 GMT) Full text and rfc822 format available.

This bug report was last modified 1 year and 180 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.