unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Tassilo Horn <tsdh@gnu.org>
Cc: Po Lu <luangruo@yahoo.com>, Arash Esbati <arash@gnu.org>,
	Lars Ingebrigtsen <larsi@gnus.org>,
	emacs-devel@gnu.org
Subject: Re: master 6e5d79c048: Display show-paren-context-when-offscreen in child frame
Date: Mon, 07 Feb 2022 16:45:06 +0100	[thread overview]
Message-ID: <87y22m8yth.fsf@gnu.org> (raw)
In-Reply-To: <8735kuah78.fsf@gnu.org>

[-- Attachment #1: Type: text/plain, Size: 1431 bytes --]

Tassilo Horn <tsdh@gnu.org> writes:

> Here's a patch

As always, I've forgotten to attach the patch.  So here it is.

> which implements both showing the context in an overlay and in the
> header-line in addition to the already pushed child-frame approach
> (just set show-paren-context-when-offscreen to either 'child-frame,
> 'overlay, or 'header-line for comparison).
>
> In the overlay and header-line cases, I replace newlines in the context
> string with spaces so that the context always only takes one line.
> (Note to self: probably that should be cut to window-width, too, so that
> you don't get continuation lines which would cause the buffer text to
> "bounce down and back up again".)
>
> The overlay approach has the problem that the context text isn't
> outstanding visually.  With the child-frame approach, one can customize
> the child-frame-border face's :background to get a nice and outstanding
> look.  Is there a way to make the context text a bit more outstanding?
> Since it's a buffer-substring, it's usually font-locked already and that
> should be kept, of course.
>
> The header-line approach has the problem that the text "bounces" because
> usually there is no header-line, so its toggled on and off again.  But
> at least, the context text is immediately distinguishable.
>
> So all in all, I still like the child-frame approach best but have no
> problem with offering the other options as well.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Show-show-paren-context-in-overlay-or-header-line.patch --]
[-- Type: text/x-patch, Size: 4332 bytes --]

From e92a8d062cca54152bd816bdf88dad0bade87120 Mon Sep 17 00:00:00 2001
From: Tassilo Horn <tsdh@gnu.org>
Date: Mon, 7 Feb 2022 15:05:14 +0100
Subject: [PATCH] Show show-paren context in overlay or header-line

---
 lisp/paren.el | 66 ++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 60 insertions(+), 6 deletions(-)

diff --git a/lisp/paren.el b/lisp/paren.el
index 6de4364b4f..e0a8d6fc24 100644
--- a/lisp/paren.el
+++ b/lisp/paren.el
@@ -368,6 +368,51 @@ show-paren--show-context-in-child-frame
       (add-hook 'post-command-hook
                 #'show-paren--delete-context-child-frame))))
 
+(defvar-local show-paren--context-overlay nil)
+
+(defun show-paren--delete-context-overlay ()
+  (when show-paren--context-overlay
+    (delete-overlay show-paren--context-overlay)
+    (setq show-paren--context-overlay nil))
+  (remove-hook 'post-command-hook #'show-paren--delete-overlays
+               'local))
+
+(defun show-paren--show-context-in-overlay (text)
+  "Show TEXT in an overlay at the top-left of the current window."
+  ;; FIXME: This works pretty well but the overlay text is not
+  ;; outstanding at all.  It's good that it's the font-locked string
+  ;; but it would be good if we could place a :box or :background face
+  ;; attribute, too.
+  (setq text (replace-regexp-in-string "\n" " " text))
+  (show-paren--delete-context-overlay)
+  (let* ((beg (window-start))
+         (end (save-excursion
+                (goto-char beg)
+                (line-end-position))))
+    (setq show-paren--context-overlay (make-overlay beg end)))
+  (overlay-put show-paren--context-overlay 'display text)
+  (add-hook 'post-command-hook #'show-paren--delete-context-overlay
+            nil 'local))
+
+(defvar-local show-paren--orig-header-line-format nil)
+
+(defun show-paren--restore-orig-header-line-format ()
+  (setq header-line-format show-paren--orig-header-line-format)
+  (remove-hook 'post-command-hook
+               #'show-paren--restore-orig-header-line-format
+               'local))
+
+(defun show-paren--show-context-in-header-line (text)
+  "Show TEXT in the header-line."
+  ;; FIXME: This bounces the buffer one line down which is a bit
+  ;; annoying.  Can we do anything about it?
+  (setq text (replace-regexp-in-string "\n" " " text))
+  (setq show-paren--orig-header-line-format header-line-format)
+  (setq header-line-format text)
+  (add-hook 'post-command-hook
+            #'show-paren--restore-orig-header-line-format
+            nil 'local))
+
 (defun show-paren-function ()
   "Highlight the parentheses until the next input arrives."
   (let ((data (and show-paren-mode (funcall show-paren-data-function))))
@@ -438,12 +483,21 @@ show-paren-function
                 (let ((open-paren-line-string
                        (blink-paren-open-paren-line-string openparen))
                       (message-log-max nil))
-                  (if (and (eq show-paren-context-when-offscreen
-                               'child-frame)
-                           (display-graphic-p))
-                      (show-paren--show-context-in-child-frame
-                       open-paren-line-string)
-                    (minibuffer-message "Matches %s" open-paren-line-string)))))
+                  (cond ((and (eq show-paren-context-when-offscreen
+                                  'child-frame)
+                              (display-graphic-p))
+                         (show-paren--show-context-in-child-frame
+                          open-paren-line-string))
+                        ((eq show-paren-context-when-offscreen
+                             'overlay)
+                         (show-paren--show-context-in-overlay
+                          open-paren-line-string))
+                        ((eq show-paren-context-when-offscreen
+                             'header-line)
+                         (show-paren--show-context-in-header-line
+                          open-paren-line-string))
+                        (show-paren-context-when-offscreen
+                         (minibuffer-message "Matches %s" open-paren-line-string))))))
           ;; Always set the overlay face, since it varies.
           (overlay-put show-paren--overlay 'priority show-paren-priority)
           (overlay-put show-paren--overlay 'face face))))))
-- 
2.35.1


  reply	other threads:[~2022-02-07 15:45 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <164414267475.11015.16458968298391656164@vcs2.savannah.gnu.org>
     [not found] ` <20220206101755.0EC03C002F9@vcs2.savannah.gnu.org>
2022-02-06 21:35   ` master 6e5d79c048: Display show-paren-context-when-offscreen in child frame Lars Ingebrigtsen
2022-02-07  1:28     ` Po Lu
2022-02-07  5:52       ` Tassilo Horn
2022-02-07 13:31         ` Arash Esbati
2022-02-07 14:08           ` Tassilo Horn
2022-02-07 15:45             ` Tassilo Horn [this message]
2022-02-07 18:13             ` Arash Esbati
2022-02-07 19:30               ` Tassilo Horn
2022-02-08  8:25                 ` Arash Esbati
2022-02-08  8:55                   ` Tassilo Horn
2022-02-09 12:45                   ` Tassilo Horn
2022-02-09 13:26                     ` Po Lu
2022-02-09 13:28                       ` Tassilo Horn
2022-02-09 13:42                         ` Po Lu
2022-02-09 13:45                           ` Tassilo Horn
2022-02-09 14:16                             ` Tassilo Horn
2022-02-10  1:58                               ` Po Lu
2022-02-14 12:41                               ` Po Lu
2022-02-14 13:41                                 ` Tassilo Horn
2022-02-09 13:50                         ` Arash Esbati
2022-02-09 18:22                       ` martin rudalics
2022-02-08  0:54         ` Po Lu
2022-02-08 12:00           ` Tassilo Horn
2022-02-08  1:43         ` Po Lu
2022-02-08  6:59           ` Tassilo Horn
2022-02-08  9:01             ` martin rudalics
2022-02-08  9:21               ` Po Lu
2022-02-08 10:06               ` Tassilo Horn

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87y22m8yth.fsf@gnu.org \
    --to=tsdh@gnu.org \
    --cc=arash@gnu.org \
    --cc=emacs-devel@gnu.org \
    --cc=larsi@gnus.org \
    --cc=luangruo@yahoo.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).