From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Tassilo Horn Newsgroups: gmane.emacs.devel Subject: Show show-paren context in a child frame Date: Sat, 05 Feb 2022 13:33:22 +0100 Message-ID: <87fsoxlc2p.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="2985"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: mu4e 1.7.7; emacs 29.0.50 To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sat Feb 05 13:54:39 2022 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nGKaM-0000bC-UZ for ged-emacs-devel@m.gmane-mx.org; Sat, 05 Feb 2022 13:54:39 +0100 Original-Received: from localhost ([::1]:48984 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nGKaL-0003ma-Rt for ged-emacs-devel@m.gmane-mx.org; Sat, 05 Feb 2022 07:54:37 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:34674) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nGKOe-0007eS-Kl for emacs-devel@gnu.org; Sat, 05 Feb 2022 07:42:32 -0500 Original-Received: from [2001:470:142:3::e] (port=33758 helo=fencepost.gnu.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nGKOP-0005nW-F0 for emacs-devel@gnu.org; Sat, 05 Feb 2022 07:42:32 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-Version:Date:Subject:To:From:in-reply-to: references; bh=51yXVJKDwWMJFq08KrhoKC3OTYCjVgQdR3BSVuWwRKM=; b=ACsXgrhbO4IRrH pueCa3ZhGoYIjjoo/6GjDV/gGc+4gnExgJob3nZ48Zv0/WIiJMslv4yh9BTi20THuOBRWp2XeBLB6 Jut17zLZKrg8jKRbnZqflRHFr4FtBylyegj0Xc8Q+CipgssBrQulbPtiHKU3+w7sLAAYYvfiSoy1b rxCoegC3Od0NXil1EZA2ixxbEXz7kZoNj9tx4MHAvsUrQVAVe4qUDTSzxSdrYHoz4H1euYYPrTCAQ P4matixjnKvXfwEOEj7ncvE61SVN3oflSqatBddTzfAR8pJgYH9t0+jrnZrY3p3CkIDC7GGcwrr1m jIseqcI+EevYI0za6v1Q==; Original-Received: from auth1-smtp.messagingengine.com ([66.111.4.227]:37527) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nGKOH-0003C2-4X for emacs-devel@gnu.org; Sat, 05 Feb 2022 07:42:13 -0500 Original-Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailauth.nyi.internal (Postfix) with ESMTP id BD84F27C005A for ; Sat, 5 Feb 2022 07:42:08 -0500 (EST) Original-Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Sat, 05 Feb 2022 07:42:08 -0500 X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvvddrhedugdegfecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecunecujfgurhepfgfhvffufffkgggtsehmtderredtre dtnecuhfhrohhmpefvrghsshhilhhoucfjohhrnhcuoehtshguhhesghhnuhdrohhrgheq necuggftrfgrthhtvghrnhepheffkeehjeehgeeukefhveehffdvgefhffdvgfegffehke ffhfeuieffudethfdunecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghi lhhfrhhomhepthhhohhrnhdomhgvshhmthhprghuthhhphgvrhhsohhnrghlihhthidqke eijeefkeejkeegqdeifeehvdelkedqthhsughhpeepghhnuhdrohhrghesfhgrshhtmhgr ihhlrdhfmh X-ME-Proxy: Original-Received: by mail.messagingengine.com (Postfix) with ESMTPA for ; Sat, 5 Feb 2022 07:42:08 -0500 (EST) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 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-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:285899 Archived-At: --=-=-= Content-Type: text/plain Hi all, today I've discovered `show-paren-context-when-offscreen' which displays the context around the opening paren in the echo area. That's a very nice feature, however it competes with eldoc, i.e., it'll show the context in the echo area and a fraction of a second later, that's repressed by eldoc's text (or the other way round depending on the delays one uses). Therefore, I've experimented with adding a special `child-frame' value for `show-paren-context-when-offscreen' which displays the context in a child frame. This works pretty well although setting up a child frame with corresponding buffer for a kind of tooltip pane requires quite some gymnastics in frame parameters and buffer-local variables which I've copied from vertico. Comments welcome! Bye, Tassilo --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0001-Allow-showing-show-paren-context-in-child-frame.patch >From f3300f0cffd5344c013e3be0690f2ff1b50a1703 Mon Sep 17 00:00:00 2001 From: Tassilo Horn Date: Sat, 5 Feb 2022 13:22:55 +0100 Subject: [PATCH] Allow showing show-paren context in child frame --- lisp/paren.el | 91 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 87 insertions(+), 4 deletions(-) diff --git a/lisp/paren.el b/lisp/paren.el index 0065bba72e..f8a56ddf24 100644 --- a/lisp/paren.el +++ b/lisp/paren.el @@ -260,6 +260,86 @@ show-paren--default (if (= dir 1) pos (1+ pos)) mismatch))))))) +(defvar show-paren--context-child-frame nil) + +(defun show-paren--context-child-frame-buffer (text) + (with-current-buffer + (get-buffer-create " *show-paren context*") + (dolist (var '((mode-line-format . nil) + (header-line-format . nil) + (tab-line-format . nil) + (tab-bar-format . nil) ;; Emacs 28 tab-bar-format + (frame-title-format . "") + (truncate-lines . t) + (cursor-in-non-selected-windows . nil) + (cursor-type . nil) + (show-trailing-whitespace . nil) + (display-line-numbers . nil) + (left-fringe-width . nil) + (right-fringe-width . nil) + (left-margin-width . 0) + (right-margin-width . 0) + (fringes-outside-margins . 0) + (buffer-read-only . t))) + (set (make-local-variable (car var)) (cdr var))) + (let ((inhibit-modification-hooks t) + (inhibit-read-only t)) + (erase-buffer) + (insert text) + (goto-char (point-min))) + (current-buffer))) + +(defun show-paren--show-context-in-child-frame (text) + (let ((minibuffer (minibuffer-window (window-frame))) + (buffer (show-paren--context-child-frame-buffer text)) + (x (window-pixel-left)) + (y (window-pixel-top))) + (show-paren--delete-context-child-frame) + (setq show-paren--context-child-frame + (make-frame + `((parent-frame . ,(window-frame)) + (minibuffer . ,minibuffer) + (visibility . nil) + (width . 0) + (height . 0) + (no-accept-focus . t) + (no-focus-on-map . t) + (min-width . t) + (min-height . t) + (border-width . 0) + (child-frame-border-width . 1) + (left-fringe . 0) + (right-fringe . 0) + (vertical-scroll-bars . nil) + (horizontal-scroll-bars . nil) + (menu-bar-lines . 0) + (tool-bar-lines . 0) + (tab-bar-lines . 0) + (no-other-frame . t) + (no-other-window . t) + (no-delete-other-windows . t) + (unsplittable . t) + (undecorated . t) + (cursor-type . nil) + (no-special-glyphs . t) + (desktop-dont-save . t)))) + (let ((win (frame-root-window show-paren--context-child-frame)) + (window-min-height 0) + (window-min-width 0)) + (set-window-buffer win buffer) + (set-window-dedicated-p win t) + (set-frame-size show-paren--context-child-frame + (string-width text) + (length (string-lines text))) + (set-frame-position show-paren--context-child-frame x y) + (make-frame-visible show-paren--context-child-frame) + (add-hook 'post-command-hook #'show-paren--delete-context-child-frame)))) + +(defun show-paren--delete-context-child-frame () + (when show-paren--context-child-frame + (delete-frame show-paren--context-child-frame)) + (remove-hook 'post-command-hook #'show-paren--delete-context-child-frame)) + (defun show-paren-function () "Highlight the parentheses until the next input arrives." (let ((data (and show-paren-mode (funcall show-paren-data-function)))) @@ -299,8 +379,8 @@ show-paren-function ;; Otherwise, turn off any such highlighting. (if (or (not here-beg) (and (not show-paren-highlight-openparen) - (> here-end (point)) - (<= here-beg (point)) + (> here-end (point)) + (<= here-beg (point)) (integerp there-beg))) (delete-overlay show-paren--overlay-1) (move-overlay show-paren--overlay-1 @@ -315,7 +395,7 @@ show-paren-function (delete-overlay show-paren--overlay) (if highlight-expression (move-overlay show-paren--overlay - (if (< there-beg here-beg) here-end here-beg) + (if (< there-beg here-beg) here-end here-beg) (if (< there-beg here-beg) there-beg there-end) (current-buffer)) (move-overlay show-paren--overlay @@ -330,7 +410,10 @@ show-paren-function (let ((open-paren-line-string (blink-paren-open-paren-line-string openparen)) (message-log-max nil)) - (minibuffer-message "Matches %s" open-paren-line-string)))) + (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))))) ;; 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 --=-=-=--