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
next prev parent 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).