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--
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
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).
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).
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.
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.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997 nCipher Corporation Ltd,
1994-97 Ian Jackson.