GNU logs - #40821, boring messages


Message sent to bug-gnu-emacs@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: bug#40821: Margin strings are displayed in reverse order of overlay priority (low-priority specs hide high-priority ones)
Resent-From: =?UTF-8?Q?Cl=C3=A9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: bug-gnu-emacs@HIDDEN
Resent-Date: Fri, 24 Apr 2020 15:57:01 +0000
Resent-Message-ID: <handler.40821.B.158774381524943 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: report 40821
X-GNU-PR-Package: emacs
X-GNU-PR-Keywords: 
To: 40821 <at> debbugs.gnu.org
X-Debbugs-Original-To: bug-gnu-emacs <bug-gnu-emacs@HIDDEN>
Received: via spool by submit <at> debbugs.gnu.org id=B.158774381524943
          (code B ref -1); Fri, 24 Apr 2020 15:57:01 +0000
Received: (at submit) by debbugs.gnu.org; 24 Apr 2020 15:56:55 +0000
Received: from localhost ([127.0.0.1]:57778 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jS0hD-0006UE-B0
	for submit <at> debbugs.gnu.org; Fri, 24 Apr 2020 11:56:55 -0400
Received: from lists.gnu.org ([209.51.188.17]:55531)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <cpitclaudel@HIDDEN>) id 1jS0hA-0006U6-Km
 for submit <at> debbugs.gnu.org; Fri, 24 Apr 2020 11:56:53 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:35454)
 by lists.gnu.org with esmtp (Exim 4.90_1)
 (envelope-from <cpitclaudel@HIDDEN>) id 1jS0h8-0006V2-Mu
 for bug-gnu-emacs@HIDDEN; Fri, 24 Apr 2020 11:56:52 -0400
X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,
 DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,
 RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=unavailable autolearn_force=no
 version=3.4.2
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.90_1)
 (envelope-from <cpitclaudel@HIDDEN>) id 1jS0h8-0000Op-3y
 for bug-gnu-emacs@HIDDEN; Fri, 24 Apr 2020 11:56:50 -0400
Received: from mail-qv1-xf32.google.com ([2607:f8b0:4864:20::f32]:42332)
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <cpitclaudel@HIDDEN>)
 id 1jS0h7-0000OV-JL
 for bug-gnu-emacs@HIDDEN; Fri, 24 Apr 2020 11:56:49 -0400
Received: by mail-qv1-xf32.google.com with SMTP id v18so4873290qvx.9
 for <bug-gnu-emacs@HIDDEN>; Fri, 24 Apr 2020 08:56:48 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=to:from:subject:message-id:date:user-agent:mime-version
 :content-language;
 bh=AxiB/+pDgIxg8kyzzEzI2Oewlbipf26nlifEQogDWDQ=;
 b=HSNBN6lIVHkEKPoR8PWZAk35EQdsF3DSt4V28okjYPjzSf0c4SzcaQfMpeC7xOW+FW
 jJ3d0tk7HIDbRwtctc+ibgFmKGTuy8Dm3HqXY/S6h5KnL6W1X4ZghCeUPwC8q5Etdfx/
 CgJx+TWsbUUQpNHVpvovOW8KahmVCDNX8MhxIMM7Ur+xIxAnnPY6Ro3BVBIzu/kjI/Er
 u7ohHzacaKeatMqDm/iZ0RB+UoGsOKqR92mWqaGCfk+9ivACeh54oAql2HGRz/JFWilD
 FI7L11IzP/GKkk7m4b68bCLw0aXh72GlWpZ1Sk68UohY5NoxPlHOqABAjegJJiCgYaIV
 /wiA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:to:from:subject:message-id:date:user-agent
 :mime-version:content-language;
 bh=AxiB/+pDgIxg8kyzzEzI2Oewlbipf26nlifEQogDWDQ=;
 b=O9trnxY5EJlhAU40yKwcH0Jv4saIR9g3Y4Gb1YIwHpiSuqTrH4QBZOFbM4PCo0tNMm
 dV+ZvQWMg8TPRNVZ1QdwVB4hAppMyzaf61HqT1Lym3DXMDq3NNitP4nG/ygNe0MFPhwl
 UrUYEjbjcTxiANjaMgO6yrzgSYKaPGj8EvQXEui52sUJeKSt3S3jpjlpf/wUyDB2BO2X
 5HZRN+D20bfJUz2A3AC01jreAV+9GLLwVKEGISq0v6VOnm88Q+oyXi1rS+L82AIuR1de
 NE6vy9NQGIhIMJPKuXWUsOj/Cj7UX5e/vRYNOLVQNaPDrI20z2gtRv1hBjATHqU4P9Wn
 X1wQ==
X-Gm-Message-State: AGi0PuallRyQROztyjNRSKifeKdkkU5YDE5q4RrPBIf8o483WdDyqeh+
 TXu1Y+g0kNEhoNEZczjxRHMFRfex
X-Google-Smtp-Source: APiQypJxz1KCVdwQHe3M9JSL7Mq/N6mZhItl1E0QVPNpRGJGK0ekMxxxVE0yRZQ6UvgZyi7S1kHRGA==
X-Received: by 2002:a0c:c590:: with SMTP id a16mr9871964qvj.21.1587743807964; 
 Fri, 24 Apr 2020 08:56:47 -0700 (PDT)
Received: from ?IPv6:2601:184:4180:66e7:54d6:bfeb:aa49:9d3b?
 ([2601:184:4180:66e7:54d6:bfeb:aa49:9d3b])
 by smtp.googlemail.com with ESMTPSA id h19sm4184545qtk.78.2020.04.24.08.56.46
 for <bug-gnu-emacs@HIDDEN>
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Fri, 24 Apr 2020 08:56:47 -0700 (PDT)
From: =?UTF-8?Q?Cl=C3=A9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
Message-ID: <33007735-30b9-4c52-c440-929686e1cb0e@HIDDEN>
Date: Fri, 24 Apr 2020 11:56:45 -0400
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
 Thunderbird/68.7.0
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------FC3702BB7D9D1EDE1367EA1A"
Content-Language: en-GB
Received-SPF: pass client-ip=2607:f8b0:4864:20::f32;
 envelope-from=cpitclaudel@HIDDEN; helo=mail-qv1-xf32.google.com
X-detected-operating-system: by eggs.gnu.org: Error: [-] PROGRAM ABORT :
 Malformed IPv6 address (bad octet value).
 Location : parse_addr6(), p0f-client.c:67
X-Received-From: 2607:f8b0:4864:20::f32
X-Spam-Score: 2.3 (++)
X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org",
 has NOT identified this incoming email as spam.  The original
 message has been attached to this so you can view it or label
 similar future email.  If you have any questions, see
 the administrator of that system for details.
 Content preview:  Hi all, The following sample shows the words "low", "mid"
 and "high" in the left margin using overlays. (with-current-buffer
 (get-buffer-create
 "*margins*") (erase-buffer) (delete-all-overlays) (setq left-margin-width
 16) (let ((beg (point)) (end (progn (insert "test") (point)))) (let ((ov-low
 (make-ove [...] 
 Content analysis details:   (2.3 points, 10.0 required)
 pts rule name              description
 ---- ---------------------- --------------------------------------------------
 0.0 FREEMAIL_FROM          Sender email is commonly abused enduser mail
 provider (cpitclaudel[at]gmail.com)
 0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record
 1.0 SPF_SOFTFAIL           SPF: sender does not match SPF record (softfail)
 -0.7 RCVD_IN_DNSWL_LOW      RBL: Sender listed at https://www.dnswl.org/,
 low trust [209.51.188.17 listed in list.dnswl.org]
 2.0 SPOOFED_FREEMAIL       No description available.
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

This is a multi-part message in MIME format.
--------------FC3702BB7D9D1EDE1367EA1A
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

Hi all,

The following sample shows the words "low", "mid" and "high" in the left margin using overlays.

(with-current-buffer (get-buffer-create "*margins*")
  (erase-buffer)
  (delete-all-overlays)
  (setq left-margin-width 16)
  (let ((beg (point))
        (end (progn (insert "test") (point))))
    (let ((ov-low (make-overlay beg end)))
      (overlay-put ov-low 'before-string (propertize "low" 'display '((margin left-margin) "low")))
      (overlay-put ov-low 'priority 10))
    (let ((ov-mid (make-overlay beg end)))
      (overlay-put ov-mid 'before-string (propertize "mid" 'display '((margin left-margin) "mid")))
      (overlay-put ov-mid 'priority 50))
    (let ((ov-high (make-overlay beg end)))
      (overlay-put ov-high 'before-string (propertize "high" 'display '((margin left-margin) "high")))
      (overlay-put ov-high 'priority 100))))

All three overlays begin at the same point.  Currently, it seems that margin specs are concatenated in order of increasing priority.  This is likely due to before-strings being concatenated in that order?
One unfortunate side effect of this is that, when margins are too narrow, low-priority margin specs are displayed before high-priority ones, and hence high-priority ones are not visible.

Additionally, unlike fringe bitmaps, for which the highest-priority bitmap replaces all others on the same line, there doesn't seem to be a way for higher-priority margin specs to replace lower-priority ones.

This issue came up when trying to develop a mode to indicate errors and warnings in the margins (instead of drawing symbols in the fringes).  Currently, if a line contains errors and warnings, Flycheck will place multiple overlays on the same line, and the fringe bitmap corresponding to the highest-priority one will be displayed.  But if we put a symbol in the margins instead of the fringes, the symbols won't override each others: instead, they will be concatenated, often in the wrong order (as shown in the attached screenshot).

It would be great if margin specs could be displayed in order of decreasing priority, or if some mechanism existed to indicate that two margin specs are intended to replace each other (the highest-priority one replacing the lowest-priority one), rather than being concatenated.

Clément.


--------------FC3702BB7D9D1EDE1367EA1A
Content-Type: image/png;
 name="margins-w.png"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="margins-w.png"

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
--------------FC3702BB7D9D1EDE1367EA1A--




Message sent:


Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-Mailer: MIME-tools 5.505 (Entity 5.505)
Content-Type: text/plain; charset=utf-8
X-Loop: help-debbugs@HIDDEN
From: help-debbugs@HIDDEN (GNU bug Tracking System)
To: =?UTF-8?Q?Cl=C3=A9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
Subject: bug#40821: Acknowledgement (Margin strings are displayed in
 reverse order of overlay priority (low-priority specs hide high-priority
 ones))
Message-ID: <handler.40821.B.158774381524943.ack <at> debbugs.gnu.org>
References: <33007735-30b9-4c52-c440-929686e1cb0e@HIDDEN>
X-Gnu-PR-Message: ack 40821
X-Gnu-PR-Package: emacs
Reply-To: 40821 <at> debbugs.gnu.org
Date: Fri, 24 Apr 2020 15:57:02 +0000

Thank you for filing a new bug report with debbugs.gnu.org.

This is an automatically generated reply to let you know your message
has been received.

Your message is being forwarded to the package maintainers and other
interested parties for their attention; they will reply in due course.

Your message has been sent to the package maintainer(s):
 bug-gnu-emacs@HIDDEN

If you wish to submit further information on this problem, please
send it to 40821 <at> debbugs.gnu.org.

Please do not send mail to help-debbugs@HIDDEN unless you wish
to report a problem with the Bug-tracking system.

--=20
40821: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D40821
GNU Bug Tracking System
Contact help-debbugs@HIDDEN with problems


Message sent to bug-gnu-emacs@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: bug#40821: Margin strings are displayed in reverse order of overlay priority (low-priority specs hide high-priority ones)
Resent-From: Eli Zaretskii <eliz@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: bug-gnu-emacs@HIDDEN
Resent-Date: Sat, 25 Apr 2020 07:59:01 +0000
Resent-Message-ID: <handler.40821.B40821.15878015309843 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 40821
X-GNU-PR-Package: emacs
X-GNU-PR-Keywords: 
To: =?UTF-8?Q?Cl=C3=A9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
Cc: 40821 <at> debbugs.gnu.org
Received: via spool by 40821-submit <at> debbugs.gnu.org id=B40821.15878015309843
          (code B ref 40821); Sat, 25 Apr 2020 07:59:01 +0000
Received: (at 40821) by debbugs.gnu.org; 25 Apr 2020 07:58:50 +0000
Received: from localhost ([127.0.0.1]:58471 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jSFi5-0002Yb-Se
	for submit <at> debbugs.gnu.org; Sat, 25 Apr 2020 03:58:50 -0400
Received: from eggs.gnu.org ([209.51.188.92]:41348)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>)
 id 1jSFi3-0002YI-IQ; Sat, 25 Apr 2020 03:58:48 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:50052)
 by eggs.gnu.org with esmtp (Exim 4.90_1)
 (envelope-from <eliz@HIDDEN>)
 id 1jSFhy-00018p-7G; Sat, 25 Apr 2020 03:58:42 -0400
Received: from [176.228.60.248] (port=4783 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1jSFhw-0003CE-Py; Sat, 25 Apr 2020 03:58:41 -0400
Date: Sat, 25 Apr 2020 10:58:31 +0300
Message-Id: <83o8rg809k.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
In-Reply-To: <33007735-30b9-4c52-c440-929686e1cb0e@HIDDEN> (message from
 =?UTF-8?Q?Cl=C3=A9ment?= Pit-Claudel on Fri, 24 Apr 2020 11:56:45 -0400)
References: <33007735-30b9-4c52-c440-929686e1cb0e@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -2.3 (--)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

severity 40821 wishlist
thanks

> From: Clément Pit-Claudel <cpitclaudel@HIDDEN>
> Date: Fri, 24 Apr 2020 11:56:45 -0400
> 
> All three overlays begin at the same point.  Currently, it seems that margin specs are concatenated in order of increasing priority.  This is likely due to before-strings being concatenated in that order?

The strings are not concatenated, they are displayed one after
another, in the order they are processed by the display engine.

The overlays at a given buffer position are indeed sorted.  First,
before-strings should come before after-strings, and within each class
the overlays are sorted in the order of increasing priority.  Then the
sorted overlays are processed one by one in the sorted order.

> One unfortunate side effect of this is that, when margins are too narrow, low-priority margin specs are displayed before high-priority ones, and hence high-priority ones are not visible.

Yes, the display margins use this very simple strategy of truncating
the stuff that has no margin space to be displayed.  Why can't you
compute the width of the margins taking into consideration the size of
what you need to display there?

> Additionally, unlike fringe bitmaps, for which the highest-priority bitmap replaces all others on the same line, there doesn't seem to be a way for higher-priority margin specs to replace lower-priority ones.

First, I don't understand what you say about fringe bitmaps: I don't
think there's any priority associated with those bitmaps, or what am I
missing?

It should be possible to support this idea of "replacing" margin specs
(which seems strange to me, FWIW), given some special display spec,
but it would need a separate pass through the overlays, to find those
which draw in the margins, and mark the replaced ones as "not to be
processed".  But I question the need for such a complexity, when a
simpler solution that doesn't require any changes seems to be at hand.

> This issue came up when trying to develop a mode to indicate errors and warnings in the margins (instead of drawing symbols in the fringes).  Currently, if a line contains errors and warnings, Flycheck will place multiple overlays on the same line, and the fringe bitmap corresponding to the highest-priority one will be displayed.  But if we put a symbol in the margins instead of the fringes, the symbols won't override each others: instead, they will be concatenated, often in the wrong order (as shown in the attached screenshot).

A simple way of overcoming this problem is to define the overlay
priorities in the reverse order of the Flycheck's error/warning
priorities.  A better solution would be to make the margin wider as
needed, something that should be easy enough (line-number-mode did
that, for example).




Message received at control <at> debbugs.gnu.org:


Received: (at control) by debbugs.gnu.org; 25 Apr 2020 07:58:49 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Apr 25 03:58:49 2020
Received: from localhost ([127.0.0.1]:58469 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jSFi5-0002YZ-JF
	for submit <at> debbugs.gnu.org; Sat, 25 Apr 2020 03:58:49 -0400
Received: from eggs.gnu.org ([209.51.188.92]:41348)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>)
 id 1jSFi3-0002YI-IQ; Sat, 25 Apr 2020 03:58:48 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:50052)
 by eggs.gnu.org with esmtp (Exim 4.90_1)
 (envelope-from <eliz@HIDDEN>)
 id 1jSFhy-00018p-7G; Sat, 25 Apr 2020 03:58:42 -0400
Received: from [176.228.60.248] (port=4783 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1jSFhw-0003CE-Py; Sat, 25 Apr 2020 03:58:41 -0400
Date: Sat, 25 Apr 2020 10:58:31 +0300
Message-Id: <83o8rg809k.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: =?utf-8?Q?Cl=C3=A9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
In-Reply-To: <33007735-30b9-4c52-c440-929686e1cb0e@HIDDEN> (message from
 =?utf-8?Q?Cl=C3=A9ment?= Pit-Claudel on Fri, 24 Apr 2020 11:56:45 -0400)
Subject: Re: bug#40821: Margin strings are displayed in reverse order of
 overlay priority (low-priority specs hide high-priority ones)
References: <33007735-30b9-4c52-c440-929686e1cb0e@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: control
Cc: 40821 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

severity 40821 wishlist
thanks

> From: Clément Pit-Claudel <cpitclaudel@HIDDEN>
> Date: Fri, 24 Apr 2020 11:56:45 -0400
> 
> All three overlays begin at the same point.  Currently, it seems that margin specs are concatenated in order of increasing priority.  This is likely due to before-strings being concatenated in that order?

The strings are not concatenated, they are displayed one after
another, in the order they are processed by the display engine.

The overlays at a given buffer position are indeed sorted.  First,
before-strings should come before after-strings, and within each class
the overlays are sorted in the order of increasing priority.  Then the
sorted overlays are processed one by one in the sorted order.

> One unfortunate side effect of this is that, when margins are too narrow, low-priority margin specs are displayed before high-priority ones, and hence high-priority ones are not visible.

Yes, the display margins use this very simple strategy of truncating
the stuff that has no margin space to be displayed.  Why can't you
compute the width of the margins taking into consideration the size of
what you need to display there?

> Additionally, unlike fringe bitmaps, for which the highest-priority bitmap replaces all others on the same line, there doesn't seem to be a way for higher-priority margin specs to replace lower-priority ones.

First, I don't understand what you say about fringe bitmaps: I don't
think there's any priority associated with those bitmaps, or what am I
missing?

It should be possible to support this idea of "replacing" margin specs
(which seems strange to me, FWIW), given some special display spec,
but it would need a separate pass through the overlays, to find those
which draw in the margins, and mark the replaced ones as "not to be
processed".  But I question the need for such a complexity, when a
simpler solution that doesn't require any changes seems to be at hand.

> This issue came up when trying to develop a mode to indicate errors and warnings in the margins (instead of drawing symbols in the fringes).  Currently, if a line contains errors and warnings, Flycheck will place multiple overlays on the same line, and the fringe bitmap corresponding to the highest-priority one will be displayed.  But if we put a symbol in the margins instead of the fringes, the symbols won't override each others: instead, they will be concatenated, often in the wrong order (as shown in the attached screenshot).

A simple way of overcoming this problem is to define the overlay
priorities in the reverse order of the Flycheck's error/warning
priorities.  A better solution would be to make the margin wider as
needed, something that should be easy enough (line-number-mode did
that, for example).




Message sent to bug-gnu-emacs@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: bug#40821: Margin strings are displayed in reverse order of overlay priority (low-priority specs hide high-priority ones)
Resent-From: =?UTF-8?Q?Cl=C3=A9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: bug-gnu-emacs@HIDDEN
Resent-Date: Sat, 25 Apr 2020 13:02:01 +0000
Resent-Message-ID: <handler.40821.B40821.158781967830605 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 40821
X-GNU-PR-Package: emacs
X-GNU-PR-Keywords: 
To: Eli Zaretskii <eliz@HIDDEN>
Cc: 40821 <at> debbugs.gnu.org
Received: via spool by 40821-submit <at> debbugs.gnu.org id=B40821.158781967830605
          (code B ref 40821); Sat, 25 Apr 2020 13:02:01 +0000
Received: (at 40821) by debbugs.gnu.org; 25 Apr 2020 13:01:18 +0000
Received: from localhost ([127.0.0.1]:59007 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jSKQn-0007xY-Kf
	for submit <at> debbugs.gnu.org; Sat, 25 Apr 2020 09:01:17 -0400
Received: from mail-qt1-f182.google.com ([209.85.160.182]:42546)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <cpitclaudel@HIDDEN>) id 1jSKQl-0007xL-Df
 for 40821 <at> debbugs.gnu.org; Sat, 25 Apr 2020 09:01:15 -0400
Received: by mail-qt1-f182.google.com with SMTP id x12so9776368qts.9
 for <40821 <at> debbugs.gnu.org>; Sat, 25 Apr 2020 06:01:15 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=subject:to:cc:references:from:message-id:date:user-agent
 :mime-version:in-reply-to:content-language:content-transfer-encoding;
 bh=KklEax+jh4WQ+1jMYQs8n4agbuDWGAC3jlxqDvDYLtg=;
 b=ZubdYgslcooleuiQfo5gX8w0e4zVYb41ojqutnmZipktZahthMoSDACzlL/Nex3uB9
 at6swpSo26m0M7YG8XMKJS6HVLKxQ/v9krvQf/0OMtlB/TmnBrrnXCR2ToLuCkz25Eto
 fn2fGUa2Upj2R0R43LXEUggN3C8bGsbuDqztGW6oiqPmaR5HrrtZI2sZyb49R8GPfaqj
 YwlWVf94CHwH3TzXF9ZMVOj8z+lVHpMYBqLF3DRdJnRWYOMJhzzqqNJvLVSkCD5SUlNy
 5NKHcuG/QSWSmECSVcvMUyRUv6bDK9uKKrKXAxuAEAiaRT/zW76fFZ74uf/RXCQ2+rQ/
 TKFA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:subject:to:cc:references:from:message-id:date
 :user-agent:mime-version:in-reply-to:content-language
 :content-transfer-encoding;
 bh=KklEax+jh4WQ+1jMYQs8n4agbuDWGAC3jlxqDvDYLtg=;
 b=tbI74Gl3RwktbgC8lgrXolPkxb/XJMZ02YPHHPczugdGRMsJRDst8UyIhGCTZhgwmL
 JsO3UN2A4CB1JYYSfPaNJ79aUuQQYMWJ+u7K42GDpEqdXkka+5A6Ci6rlEWgN/Ji4aHy
 HImL27qLlNRJUWN0hvmCdnqnAB6U7ejS3S3VQANojsRR+3V1Eog2vEeSHwwDiPNysi+b
 9WGSgLTO5Ng0AbEKA/WdHU1PohHryykT7hW67Xrmg/P0UBVLtSWOZDJWZXSJiZ+zgzbB
 wbordYWst1HudoJVWi+Hj2wUuVmDWfV0+izfHk8ilW6er8kTxem93856dFLDv1Tnpywr
 9Fbg==
X-Gm-Message-State: AGi0PuZv+QeSbEm6qslluX6dK+F0bF3B+acyzE3yQEy5Bm2G7vRQUBS/
 xIp2Cxen/em5ANeqCSlAnwWkQNmHzu4=
X-Google-Smtp-Source: APiQypKaRXCR1IeMSgO024GoBOGUTrH8l1XXzI9GRpxD6gElMdz+EdP4z2V0hL64MFdGJEUlG+fJKw==
X-Received: by 2002:ac8:65cc:: with SMTP id t12mr14076442qto.310.1587819669520; 
 Sat, 25 Apr 2020 06:01:09 -0700 (PDT)
Received: from ?IPv6:2601:184:4180:66e7:54d6:bfeb:aa49:9d3b?
 ([2601:184:4180:66e7:54d6:bfeb:aa49:9d3b])
 by smtp.googlemail.com with ESMTPSA id r6sm6196168qtc.28.2020.04.25.06.01.08
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Sat, 25 Apr 2020 06:01:09 -0700 (PDT)
References: <33007735-30b9-4c52-c440-929686e1cb0e@HIDDEN>
 <83o8rg809k.fsf@HIDDEN>
From: =?UTF-8?Q?Cl=C3=A9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
Message-ID: <5da7af4f-0f8c-c79c-38d7-ed7465d9b34d@HIDDEN>
Date: Sat, 25 Apr 2020 09:01:07 -0400
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
 Thunderbird/68.7.0
MIME-Version: 1.0
In-Reply-To: <83o8rg809k.fsf@HIDDEN>
Content-Type: text/plain; charset=utf-8
Content-Language: en-GB
Content-Transfer-Encoding: 8bit
X-Spam-Score: 0.0 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

On 25/04/2020 03.58, Eli Zaretskii wrote:
>> One unfortunate side effect of this is that, when margins are too narrow, low-priority margin specs are displayed before high-priority ones, and hence high-priority ones are not visible.
> 
> Yes, the display margins use this very simple strategy of truncating
> the stuff that has no margin space to be displayed.  Why can't you
> compute the width of the margins taking into consideration the size of
> what you need to display there?

I only want/need to display one margin indicator — the highest priority one :)
Consider a line with the following contents:

eee www ewew

And let's assume that the compiler says this:

0-3: error: …
4-7: warning: …
8-12: error: …
8-12: warning: …

In that case, I don't need 4 indicators in the margin, I want just one (indicating an error). But in the the buffer I'd like 4 overlays to apply error and warning faces (though, since two of them cover the same area, one will not be visible; overlay priorities are used to ensure that the error one will take precedence over the warning one).

>> Additionally, unlike fringe bitmaps, for which the highest-priority bitmap replaces all others on the same line, there doesn't seem to be a way for higher-priority margin specs to replace lower-priority ones.
> 
> First, I don't understand what you say about fringe bitmaps: I don't
> think there's any priority associated with those bitmaps, or what am I
> missing?

Your confusion is understandable: I was wrong :(

(with-current-buffer (get-buffer-create "*fringes*")
  (erase-buffer)
  (delete-all-overlays)
  (let ((beg (point))
        (end (progn (insert "test") (point))))
    (let ((ov-low (make-overlay beg end)))
      (overlay-put ov-low 'before-string (propertize "low" 'display '(left-fringe right-arrow compilation-info)))
      (overlay-put ov-low 'priority 10))
    (let ((ov-mid (make-overlay beg end)))
      (overlay-put ov-mid 'before-string (propertize "mid" 'display '(left-fringe compilation-warning)))
      (overlay-put ov-mid 'priority 50))
    (let ((ov-high (make-overlay beg end)))
      (overlay-put ov-high 'before-string (propertize "high" 'display '(left-fringe compilation-error)))
      (overlay-put ov-high 'priority 100)))
  (pop-to-buffer (current-buffer)))

I thought this would show a fringe icon in compilation-error face, because of the higher priority of the corresponding overlay.  It doesn't.
Should I report this as a separate issue?

> It should be possible to support this idea of "replacing" margin specs
> (which seems strange to me, FWIW), given some special display spec,
> but it would need a separate pass through the overlays, to find those
> which draw in the margins, and mark the replaced ones as "not to be
> processed".  But I question the need for such a complexity, when a
> simpler solution that doesn't require any changes seems to be at hand.

Widening the margin isn't a working solution for this case, but displaying the margin specs in order of increasing priority would work.  However, wouldn't that require a second pass as well?  That is, if margin specs were sorted by priority before being inserted, it would work (it wouldn't matter that there are multiple instead of one, since the most important one would be first).

>> This issue came up when trying to develop a mode to indicate errors and warnings in the margins (instead of drawing symbols in the fringes).  Currently, if a line contains errors and warnings, Flycheck will place multiple overlays on the same line, and the fringe bitmap corresponding to the highest-priority one will be displayed.  But if we put a symbol in the margins instead of the fringes, the symbols won't override each others: instead, they will be concatenated, often in the wrong order (as shown in the attached screenshot).
> 
> A simple way of overcoming this problem is to define the overlay
> priorities in the reverse order of the Flycheck's error/warning
> priorities.  A better solution would be to make the margin wider as
> needed, something that should be easy enough (line-number-mode did
> that, for example).

Unfortunately, neither of these will do.  Reversing the overlay priorities means that the text (ewew) in the example above (eee www ewew) will have the warning face applied to it, not the error face.

Making the margins wider won't help either, because I'd like to display the highest-priority issue in the margin, not all of them (often compilers get confused and issue additional spurious messages, so even if there's multiple errors and warnings on one line displaying a single error indicator in the fringe or margin is enough).

Thanks for your help,
Clément.




Message sent to bug-gnu-emacs@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: bug#40821: Margin strings are displayed in reverse order of overlay priority (low-priority specs hide high-priority ones)
Resent-From: Eli Zaretskii <eliz@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: bug-gnu-emacs@HIDDEN
Resent-Date: Sat, 25 Apr 2020 14:05:02 +0000
Resent-Message-ID: <handler.40821.B40821.15878234955320 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 40821
X-GNU-PR-Package: emacs
X-GNU-PR-Keywords: 
To: =?UTF-8?Q?Cl=C3=A9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
Cc: 40821 <at> debbugs.gnu.org
Received: via spool by 40821-submit <at> debbugs.gnu.org id=B40821.15878234955320
          (code B ref 40821); Sat, 25 Apr 2020 14:05:02 +0000
Received: (at 40821) by debbugs.gnu.org; 25 Apr 2020 14:04:55 +0000
Received: from localhost ([127.0.0.1]:60105 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jSLQM-0001Nj-Hz
	for submit <at> debbugs.gnu.org; Sat, 25 Apr 2020 10:04:54 -0400
Received: from eggs.gnu.org ([209.51.188.92]:34262)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1jSLQL-0001NX-DO
 for 40821 <at> debbugs.gnu.org; Sat, 25 Apr 2020 10:04:53 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:55163)
 by eggs.gnu.org with esmtp (Exim 4.90_1)
 (envelope-from <eliz@HIDDEN>)
 id 1jSLQF-0001po-Vs; Sat, 25 Apr 2020 10:04:48 -0400
Received: from [176.228.60.248] (port=3548 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1jSLQF-0005hB-9e; Sat, 25 Apr 2020 10:04:47 -0400
Date: Sat, 25 Apr 2020 17:04:36 +0300
Message-Id: <83sggr7jbf.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
In-Reply-To: <5da7af4f-0f8c-c79c-38d7-ed7465d9b34d@HIDDEN> (message from
 =?UTF-8?Q?Cl=C3=A9ment?= Pit-Claudel on Sat, 25 Apr 2020 09:01:07 -0400)
References: <33007735-30b9-4c52-c440-929686e1cb0e@HIDDEN>
 <83o8rg809k.fsf@HIDDEN> <5da7af4f-0f8c-c79c-38d7-ed7465d9b34d@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -2.3 (--)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> Cc: 40821 <at> debbugs.gnu.org
> From: Clément Pit-Claudel <cpitclaudel@HIDDEN>
> Date: Sat, 25 Apr 2020 09:01:07 -0400
> 
> On 25/04/2020 03.58, Eli Zaretskii wrote:
> >> One unfortunate side effect of this is that, when margins are too narrow, low-priority margin specs are displayed before high-priority ones, and hence high-priority ones are not visible.
> > 
> > Yes, the display margins use this very simple strategy of truncating
> > the stuff that has no margin space to be displayed.  Why can't you
> > compute the width of the margins taking into consideration the size of
> > what you need to display there?
> 
> I only want/need to display one margin indicator — the highest priority one :)

Then why not have your code do that?

> Consider a line with the following contents:
> 
> eee www ewew
> 
> And let's assume that the compiler says this:
> 
> 0-3: error: …
> 4-7: warning: …
> 8-12: error: …
> 8-12: warning: …
> 
> In that case, I don't need 4 indicators in the margin, I want just one (indicating an error). But in the the buffer I'd like 4 overlays to apply error and warning faces (though, since two of them cover the same area, one will not be visible; overlay priorities are used to ensure that the error one will take precedence over the warning one).

It is your Lisp program that puts these overlays, isn't it?  Why
cannot it put only one overlay, the one you want to be displayed in
this case?

> (with-current-buffer (get-buffer-create "*fringes*")
>   (erase-buffer)
>   (delete-all-overlays)
>   (let ((beg (point))
>         (end (progn (insert "test") (point))))
>     (let ((ov-low (make-overlay beg end)))
>       (overlay-put ov-low 'before-string (propertize "low" 'display '(left-fringe right-arrow compilation-info)))
>       (overlay-put ov-low 'priority 10))
>     (let ((ov-mid (make-overlay beg end)))
>       (overlay-put ov-mid 'before-string (propertize "mid" 'display '(left-fringe compilation-warning)))
>       (overlay-put ov-mid 'priority 50))
>     (let ((ov-high (make-overlay beg end)))
>       (overlay-put ov-high 'before-string (propertize "high" 'display '(left-fringe compilation-error)))
>       (overlay-put ov-high 'priority 100)))
>   (pop-to-buffer (current-buffer)))
> 
> I thought this would show a fringe icon in compilation-error face, because of the higher priority of the corresponding overlay.  It doesn't.
> Should I report this as a separate issue?

Why is that an issue?  You in effect invoke undefined behavior, and
the result is not outlandish, IMO.

> > It should be possible to support this idea of "replacing" margin specs
> > (which seems strange to me, FWIW), given some special display spec,
> > but it would need a separate pass through the overlays, to find those
> > which draw in the margins, and mark the replaced ones as "not to be
> > processed".  But I question the need for such a complexity, when a
> > simpler solution that doesn't require any changes seems to be at hand.
> 
> Widening the margin isn't a working solution for this case, but displaying the margin specs in order of increasing priority would work.  However, wouldn't that require a second pass as well?  That is, if margin specs were sorted by priority before being inserted, it would work (it wouldn't matter that there are multiple instead of one, since the most important one would be first).

Now I'm confused: the overlays are already being sorted by the display
engine, and displayed in the order of increasing priority, as I
explained in my original message.





Last modified: Sat, 25 Apr 2020 14:15:01 UTC

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