]> git.eshelyaron.com Git - emacs.git/commitdiff
show-paren: Don't show context again after C-g-ing it away.
authorTassilo Horn <tsdh@gnu.org>
Wed, 9 Feb 2022 14:14:18 +0000 (15:14 +0100)
committerTassilo Horn <tsdh@gnu.org>
Wed, 9 Feb 2022 14:15:32 +0000 (15:15 +0100)
* lisp/paren.el (show-paren--last-pos): New variable.
(show-paren-function): Don't show context again after C-g-ing it away.

lisp/paren.el

index 8d45987e90cc6021a625e3b46adec359b72d9adb..4cef9756bc9b16d9568fdd67e09dfd0de06a614b 100644 (file)
@@ -398,6 +398,12 @@ It is the default value of `show-paren-data-function'."
   (add-hook 'post-command-hook #'show-paren--delete-context-overlay
             nil 'local))
 
+;; The last position of point for which `show-paren-function' was
+;; called.  We track it in order to C-g away a context overlay or
+;; child-frame without having it pop up again after
+;; `show-paren-delay'.
+(defvar-local show-paren--last-pos nil)
+
 (defun show-paren-function ()
   "Highlight the parentheses until the next input arrives."
   (let ((data (and show-paren-mode (funcall show-paren-data-function))))
@@ -462,21 +468,23 @@ It is the default value of `show-paren-data-function'."
           ;; point is at a closing paren, show the context around the
           ;; opening paren.
           (let ((openparen (min here-beg there-beg)))
-            (if (and show-paren-context-when-offscreen
-                     (< there-beg here-beg)
-                     (not (pos-visible-in-window-p openparen)))
-                (let ((context (blink-paren-open-paren-line-string
-                                openparen))
-                      (message-log-max nil))
-                  (cond
-                   ((and
-                     (eq show-paren-context-when-offscreen 'child-frame)
-                     (display-graphic-p))
-                    (show-paren--show-context-in-child-frame context))
-                   ((eq show-paren-context-when-offscreen 'overlay)
-                    (show-paren--show-context-in-overlay context))
-                   (show-paren-context-when-offscreen
-                    (minibuffer-message "Matches %s" context))))))
+            (when (and show-paren-context-when-offscreen
+                       (not (eql show-paren--last-pos (point)))
+                       (< there-beg here-beg)
+                       (not (pos-visible-in-window-p openparen)))
+              (let ((context (blink-paren-open-paren-line-string
+                              openparen))
+                    (message-log-max nil))
+                (cond
+                 ((and
+                   (eq show-paren-context-when-offscreen 'child-frame)
+                   (display-graphic-p))
+                  (show-paren--show-context-in-child-frame context))
+                 ((eq show-paren-context-when-offscreen 'overlay)
+                  (show-paren--show-context-in-overlay context))
+                 (show-paren-context-when-offscreen
+                  (minibuffer-message "Matches %s" context))))))
+          (setq show-paren--last-pos (point))
           ;; Always set the overlay face, since it varies.
           (overlay-put show-paren--overlay 'priority show-paren-priority)
           (overlay-put show-paren--overlay 'face face))))))