From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Alan Mackenzie Newsgroups: gmane.emacs.devel Subject: Re: [Emacs-diffs] master 29d1c72: Introduce new value t for compilation-context-lines to eliminate scrolling Date: Tue, 27 Aug 2019 19:36:52 +0000 Message-ID: <20190827193652.GA20676@ACM> References: <20190825102322.19558.22771@vcs0.savannah.gnu.org> <20190825102323.5080620CD5@vcs0.savannah.gnu.org> <20190825190637.GE4724@ACM> <838srhghoc.fsf@gnu.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="128384"; mail-complaints-to="usenet@blaine.gmane.org" User-Agent: Mutt/1.10.1 (2018-07-13) Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Aug 27 21:37:08 2019 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1i2hHA-000XDq-2n for ged-emacs-devel@m.gmane.org; Tue, 27 Aug 2019 21:37:08 +0200 Original-Received: from localhost ([::1]:56308 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i2hH7-0003Fu-Rr for ged-emacs-devel@m.gmane.org; Tue, 27 Aug 2019 15:37:05 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:38458) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i2hH1-0003Fo-37 for emacs-devel@gnu.org; Tue, 27 Aug 2019 15:37:00 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i2hGz-0002ro-Ik for emacs-devel@gnu.org; Tue, 27 Aug 2019 15:36:58 -0400 Original-Received: from colin.muc.de ([193.149.48.1]:37028 helo=mail.muc.de) by eggs.gnu.org with smtp (Exim 4.71) (envelope-from ) id 1i2hGz-0002pk-8I for emacs-devel@gnu.org; Tue, 27 Aug 2019 15:36:57 -0400 Original-Received: (qmail 11678 invoked by uid 3782); 27 Aug 2019 18:44:05 -0000 Original-Received: from acm.muc.de (p4FE15C47.dip0.t-ipconnect.de [79.225.92.71]) by colin.muc.de (tmda-ofmipd) with ESMTP; Tue, 27 Aug 2019 20:44:03 +0200 Original-Received: (qmail 20793 invoked by uid 1000); 27 Aug 2019 19:36:52 -0000 Content-Disposition: inline In-Reply-To: <838srhghoc.fsf@gnu.org> X-Delivery-Agent: TMDA/1.1.12 (Macallan) X-Primary-Address: acm@muc.de X-detected-operating-system: by eggs.gnu.org: FreeBSD 9.x [fuzzy] X-Received-From: 193.149.48.1 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:239622 Archived-At: Hello, Eli and Stefan. On Sun, Aug 25, 2019 at 22:37:39 +0300, Eli Zaretskii wrote: > > Date: Sun, 25 Aug 2019 19:06:37 +0000 > > From: Alan Mackenzie > > Cc: emacs-devel@gnu.org > > > 2- Why insert a prefix string (an "inserted arrow") instead of using > > > a "regular overwriting arrow"? > > Because the overwriting arrow would obliterate the first two characters > > of the file name. I actually tried this first, and it wasn't > > satisfactory. This contrasts with another use of the overwriting arrow > > in edebug, where (usually) only WS gets overwritten, and it is important > > not to disturb the visible indentation. > Did you consider to use the display margin instead? You can have an > overlay display in the margin by putting a 'display' property on the > overlay string. The advantage of using the margin is that it will > keep the buffer text aligned. OK, thanks for telling me about this. I propose installing the following patch which implements the arrow in the margin (and supplements my earlier commit) into master. Criticism, as always, will be welcomed. diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el index 09188dc14b..931f66ef03 100644 --- a/lisp/progmodes/compile.el +++ b/lisp/progmodes/compile.el @@ -2602,45 +2602,70 @@ compilation-set-window (point))) (set-window-point w mk)))) -(defvar-local overlay-arrow-overlay nil +(defvar-local compilation-arrow-overlay nil "Overlay with the before-string property of `overlay-arrow-string'. When non-nil, this overlay causes redisplay to display `overlay-arrow-string' at the overlay's start position.") +(defvar compilation-margin-string "=>" + "The string which will appear in the margin in compilation mode. +This must be two characters long; there should be no need to +change the default.") +(put-text-property 0 2 'face 'default compilation-margin-string) + +(defvar compilation-dummy-string ">" + "A string which is only a placeholder for compilation-margin-string. +It's actual value is never used, but must be one character long.") +(put-text-property 0 1 'display + `((margin left-margin) ,compilation-margin-string) + compilation-dummy-string) + +(defun compilation-set-up-arrow-spec-in-margin () + "Set up compilation-arrow-overlay to display as an arrow in a margin." + (setq overlay-arrow-string "") + (overlay-put compilation-arrow-overlay + 'before-string compilation-dummy-string) + (set-window-margins (selected-window) 2)) + +(defun compilation-tear-down-arrow-spec-in-margin () + "Restore compilation-arrow-overlay to not using the margin, which is removed." + (overlay-put compilation-arrow-overlay 'before-string nil) + (delete-overlay compilation-arrow-overlay) + (setq compilation-arrow-overlay nil) + (set-window-margins (selected-window) 0)) + (defun compilation-set-overlay-arrow (w) "Set up, or switch off, the overlay-arrow for window W." - (with-current-buffer (window-buffer w) - (if (and (eq compilation-context-lines t) - (equal (car (window-fringes w)) 0)) ; No left fringe - ;; Insert a "=>" before-string overlay at the beginning of the - ;; line pointed to by `overlay-arrow-position'. - (cond - ((overlayp overlay-arrow-overlay) - (when (not (eq (overlay-start overlay-arrow-overlay) - overlay-arrow-position)) - (if overlay-arrow-position - (progn - (move-overlay overlay-arrow-overlay - overlay-arrow-position overlay-arrow-position) - (setq overlay-arrow-string "=>") - (overlay-put overlay-arrow-overlay - 'before-string overlay-arrow-string)) - (delete-overlay overlay-arrow-overlay) - (setq overlay-arrow-overlay nil)))) - - (overlay-arrow-position - (setq overlay-arrow-overlay - (make-overlay overlay-arrow-position overlay-arrow-position)) - (setq overlay-arrow-string "=>") - (overlay-put overlay-arrow-overlay 'before-string overlay-arrow-string))) - - ;; `compilation-context-lines' isn't t, or we've got a left - ;; fringe, so remove any overlay arrow. - (when (overlayp overlay-arrow-overlay) - (setq overlay-arrow-string "") - (delete-overlay overlay-arrow-overlay) - (setq overlay-arrow-overlay nil))))) + (with-selected-window w ; So the later `goto-char' will work. + (with-current-buffer (window-buffer w) + (if (and (eq compilation-context-lines t) + (equal (car (window-fringes w)) 0)) ; No left fringe + ;; Insert a before-string overlay at the beginning of the line + ;; pointed to by `overlay-arrow-position', such that it will + ;; display in a 2-character margin. + (progn + (cond + ((overlayp compilation-arrow-overlay) + (when (not (eq (overlay-start compilation-arrow-overlay) + overlay-arrow-position)) + (if overlay-arrow-position + (move-overlay compilation-arrow-overlay + overlay-arrow-position overlay-arrow-position) + (compilation-tear-down-arrow-spec-in-margin)))) + + (overlay-arrow-position + (setq compilation-arrow-overlay + (make-overlay overlay-arrow-position overlay-arrow-position)) + (compilation-set-up-arrow-spec-in-margin))) + ;; Ensure that the "=>" remains in the window by causing + ;; the window to be scrolled, if needed. + (goto-char (overlay-start compilation-arrow-overlay))) + + ;; `compilation-context-lines' isn't t, or we've got a left + ;; fringe, so remove any overlay arrow. + (when (overlayp compilation-arrow-overlay) + (compilation-tear-down-arrow-spec-in-margin)))))) (defvar next-error-highlight-timer) -- Alan Mackenzie (Nuremberg, Germany).