all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Shynur Xie <one.last.kiss@outlook.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: "63089@debbugs.gnu.org" <63089@debbugs.gnu.org>
Subject: bug#63089: [PATCH] Display offscreen matched openparen
Date: Mon, 1 May 2023 17:52:44 +0000	[thread overview]
Message-ID: <SA0PR04MB74335C8576E465517BFFA504D76E9@SA0PR04MB7433.namprd04.prod.outlook.com> (raw)
In-Reply-To: <83sfcgnqbr.fsf@gnu.org>

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

>    From: Eli Zaretskii
> Subject: Re: bug#63089
>    Date: Mon, 01 May 2023 16:17:44 +0300
>      To: Shynur Xie
>
> I think we should move the option to simple.el, and rename it to
> blink-paren-SOMETHING.

There're several blink-matching-paren-* options in file <simple.el>,
but no option's name is blink-paren-*.  So I think perhaps it's better
to rename it to blink-matching-paren-highlight-offscreen.

> Also, it is unusual to have a defcustom that names a face without a
> corresponding defface that can be used to customize the face.  So I
> think we should add a defface for the face used when the user option
> is non-nil.

Following your instruction, I defface blink-matching-paren-offscreen.

> Also, the lines in the log message are too long, please make them at
> most 70 column long.

Got it.  It seems that <www.gnu.org/software/emacs/CONTRIBUTE> need to
be changed; it said "Limit lines in commit messages to 78 characters".

____________________

New patch is attached.  I have checked that there's no conflict
between the 2 newly introduced names and the original names.

--
shynur

[-- Attachment #2: 0001-Display-matched-offscreen-openparen.patch --]
[-- Type: application/octet-stream, Size: 6518 bytes --]

From e29c92ae8137daf12a87c1ed213cbca6667ea7f1 Mon Sep 17 00:00:00 2001
From: Shynur <one.last.kiss@outlook.com>
Date: Tue, 2 May 2023 01:32:44 +0800
Subject: [PATCH] Display matched offscreen openparen

Propertize matched offscreen openparen that is showing in the echo
area in order to make it prominent; use shadow face for non-context
characters (i.e., 'Matches') for the same purpose.
* lisp/simple.el (blink-matching-paren-offscreen): Add this face for
highlighting.
* lisp/simple.el (blink-matching-paren-highlight-offscreen): Add this
option to toggle face `blink-matching-paren-offscreen'.
* lisp/simple.el (blink-paren-open-paren-line-string): Propertize the
matched offscreen openparen with a face conditionally.
---
 lisp/simple.el | 87 ++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 67 insertions(+), 20 deletions(-)

diff --git a/lisp/simple.el b/lisp/simple.el
index b621e1603bd..e4a0b9549e0 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -9215,6 +9215,21 @@ blink-matching-paren-dont-ignore-comments
   :type 'boolean
   :group 'paren-blinking)
 
+(defcustom blink-matching-paren-highlight-offscreen nil
+  "If non-nil, highlight showing in the echo area matched off-screen open paren.
+This highlighting uses face `blink-matching-paren-offscreen'."
+  :type 'boolean
+  :version "30.1"
+  :group 'paren-blinking)
+
+(defface blink-matching-paren-offscreen
+  '((t :foreground "green"))
+  "Face for showing in the echo area matched open paren that is off-screen.
+This face will not be used when `blink-matching-paren-highlight-offscreen'
+is nil."
+  :version "30.1"
+  :group 'paren-blinking)
+
 (defun blink-matching-check-mismatch (start end)
   "Return whether or not START...END are matching parens.
 END is the current point and START is the blink position.
@@ -9312,47 +9327,79 @@ blink-matching-open
                  (delete-overlay blink-matching--overlay)))))
        ((not show-paren-context-when-offscreen)
         (minibuffer-message
-         "Matches %s"
-         (substring-no-properties
-          (blink-paren-open-paren-line-string blinkpos))))))))
+         #("Matches %s"
+           ;; Make the following text (i.e., %s) prominent.
+           0 7 (face shadow))
+         (blink-paren-open-paren-line-string blinkpos)))))))
 
 (defun blink-paren-open-paren-line-string (pos)
-  "Return the line string that contains the openparen at POS."
+  "Return the line string that contains the openparen at POS.
+Remove the line string's properties but give the openparen a
+face if `blink-matching-paren-highlight-offscreen' is non-nil."
   (save-excursion
     (goto-char pos)
     ;; Capture the regions in terms of (beg . end) conses whose
     ;; buffer-substrings we want to show as a context string.  Ensure
     ;; they are font-locked (bug#59527).
-    (let (regions)
-      ;; Show what precedes the open in its line, if anything.
+    (let (regions
+          openparen-idx)
       (cond
+       ;; Show what precedes the open in its line, if anything.
        ((save-excursion (skip-chars-backward " \t") (not (bolp)))
-        (setq regions (list (cons (line-beginning-position)
-                                  (1+ pos)))))
+        (let ((bol (line-beginning-position)))
+          (setq regions (list (cons bol (1+ pos)))
+                openparen-idx (- pos bol))))
        ;; Show what follows the open in its line, if anything.
        ((save-excursion
           (forward-char 1)
           (skip-chars-forward " \t")
           (not (eolp)))
-        (setq regions (list (cons pos (line-end-position)))))
+        (setq regions (list (cons pos (line-end-position)))
+              openparen-idx 0))
        ;; Otherwise show the previous nonblank line,
        ;; if there is one.
        ((save-excursion (skip-chars-backward "\n \t") (not (bobp)))
-        (setq regions (list (cons (progn
-                                    (skip-chars-backward "\n \t")
-                                    (line-beginning-position))
-                                  (progn (end-of-line)
-                                         (skip-chars-backward " \t")
-                                         (point)))
+        (setq regions (list (cons
+                             (let (bol)
+                               (skip-chars-backward "\n \t")
+                               (setq bol (line-beginning-position)
+                                     openparen-idx (- bol))
+                               bol)
+                             (let (eol)
+                               (end-of-line)
+                               (skip-chars-backward " \t")
+                               (setq eol (point)
+                                     openparen-idx (+ openparen-idx
+                                                      eol
+                                                      ;; (length "...")
+                                                      3))
+                               eol))
                             (cons pos (1+ pos)))))
        ;; There is nothing to show except the char itself.
-       (t (setq regions (list (cons pos (1+ pos))))))
+       (t (setq regions (list (cons pos (1+ pos)))
+                openparen-idx 0)))
       ;; Ensure we've font-locked the context region.
       (font-lock-ensure (caar regions) (cdar (last regions)))
-      (mapconcat (lambda (region)
-                   (buffer-substring (car region) (cdr region)))
-                 regions
-                 "..."))))
+      (let ((line-string
+             (mapconcat
+              (lambda (region)
+                (buffer-substring (car region) (cdr region)))
+              regions
+              "..."))
+            (openparen-next-char-idx (1+ openparen-idx)))
+        (setq line-string (substring-no-properties line-string))
+        (concat
+         (substring line-string
+                    0 openparen-idx)
+         (let ((matched-offscreen-openparen
+                (substring line-string
+                           openparen-idx openparen-next-char-idx)))
+           (if blink-matching-paren-highlight-offscreen
+               (propertize matched-offscreen-openparen
+                           'face 'blink-matching-paren-offscreen)
+             matched-offscreen-openparen))
+         (substring line-string
+                    openparen-next-char-idx))))))
 
 (defvar blink-paren-function 'blink-matching-open
   "Function called, if non-nil, whenever a close parenthesis is inserted.
-- 
2.34.1


  reply	other threads:[~2023-05-01 17:52 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-26 13:39 bug#63089: [PATCH] Display offscreen matched openparen Shynur Xie
2023-04-28  6:28 ` Eli Zaretskii
2023-04-28 12:36   ` Shynur Xie
2023-04-29 11:05     ` Eli Zaretskii
2023-04-30 10:09       ` Shynur Xie
2023-05-01 13:17         ` Eli Zaretskii
2023-05-01 17:52           ` Shynur Xie [this message]
2023-05-02 18:38             ` Eli Zaretskii

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

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

  git send-email \
    --in-reply-to=SA0PR04MB74335C8576E465517BFFA504D76E9@SA0PR04MB7433.namprd04.prod.outlook.com \
    --to=one.last.kiss@outlook.com \
    --cc=63089@debbugs.gnu.org \
    --cc=eliz@gnu.org \
    /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 external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.