From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Yuan Fu Newsgroups: gmane.emacs.devel Subject: Re: Extend gdb to filter registers Date: Tue, 08 Oct 2019 23:44:40 -0400 Message-ID: References: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="259914"; mail-complaints-to="usenet@blaine.gmane.org" Cc: Emacs developers To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Oct 09 18:08:59 2019 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1iIEWG-0015MA-SZ for ged-emacs-devel@m.gmane.org; Wed, 09 Oct 2019 18:08:57 +0200 Original-Received: from localhost ([::1]:51968 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iIEWD-0006k5-PA for ged-emacs-devel@m.gmane.org; Wed, 09 Oct 2019 12:08:53 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:51409) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iI2u7-0001Iz-GT for emacs-devel@gnu.org; Tue, 08 Oct 2019 23:44:49 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iI2u5-000689-I5 for emacs-devel@gnu.org; Tue, 08 Oct 2019 23:44:47 -0400 Original-Received: from mail-qt1-x830.google.com ([2607:f8b0:4864:20::830]:37674) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iI2u5-00067W-As for emacs-devel@gnu.org; Tue, 08 Oct 2019 23:44:45 -0400 Original-Received: by mail-qt1-x830.google.com with SMTP id l51so1160042qtc.4 for ; Tue, 08 Oct 2019 20:44:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:in-reply-to:references:date:message-id :mime-version; bh=1NazVwKBR9i3zggR4fYf4XDGVMW1WoRAPonDOrdbyrU=; b=lf/JSxKmobx8ZkOxV14j9332m5JdLCx1x1UEUgU6qUR8jfmpoZTLoS3pwTdx7/UiWq iE5MrxsNJ5i6/CR6tsMhxr/sTtzhFwwyq+Zy74rM9V8hmUPl1H1hSwyXrOAX+ELZGI2H 4AZ2nbY3/xuc4vV/KCRxe58OQraejSUp+y9ZV0Um05+WgrqDRAPrOqTQx5LsIPPVgves Y4ByL0fLWOgIES7TRMC8YZluliUi5CDfRvlw0s8gVr2qfPx7MH/9ahmf/9cb11wC7EhH x+Lre6DglfW9jPSmBsztAFOLQm4ZkHgiuUWGsAFbbxZeQUXzGwq6fyg2cbpiXXllTJy/ JfMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:in-reply-to:references:date :message-id:mime-version; bh=1NazVwKBR9i3zggR4fYf4XDGVMW1WoRAPonDOrdbyrU=; b=Byf1Um3eqCvZqdgNcQe7t3CaEkBHBUT7zdfvnBs9MMwn06xhAyKBmTnWJ/TlEt5KVX oeAOOtzXLfj0QX/D0PWoLmIZyAXmdGG7/gyl3lEMzDqmyrXbw6iv4kMuqWYOR69q/6s+ 2B7R++wvGhMqsG+5y6dkUSdwa8lMl+63lo1ihH82qRdavY3kVQSGCvb2p+Jg66XX8sNR gt7NED/8Ureqx8CX5Fd9f2YHIo0PlPGYWtQ+I11A7NvoJynkYbRBFEd2mJn6dSthHvfI iQ/yPXaf6oxoTh3LckmBjs8p0ukqHO4NI684bsQwBWx1yDoB+lYfTWPOdURADxJzREvc H+1g== X-Gm-Message-State: APjAAAU7TXkAkB/q1dogeGv3jhkoF2UbJbUYGELgyh2T+JGvzRxucHyi DPlRVwXtEfF9mLukuvTwM2LOXC+A8z7qww== X-Google-Smtp-Source: APXvYqy9ztzF/JFrVCgDm+bG8L5oO0by/KtIwDXrxLmW7V0407sD59g9ehg3c5NP1kRXBpTyC2aL1A== X-Received: by 2002:ac8:363c:: with SMTP id m57mr1495188qtb.290.1570592683714; Tue, 08 Oct 2019 20:44:43 -0700 (PDT) Original-Received: from missSilver.localdomain (c-71-207-8-160.hsd1.pa.comcast.net. [71.207.8.160]) by smtp.gmail.com with ESMTPSA id u11sm393458qtg.11.2019.10.08.20.44.42 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 08 Oct 2019 20:44:42 -0700 (PDT) Original-Received: by missSilver.localdomain (Postfix, from userid 501) id 945B520285610F; Tue, 8 Oct 2019 23:44:40 -0400 (EDT) In-Reply-To: X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::830 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 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.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:240764 Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable > "which" =3D> "whose" Fixed > Is this expected to be set by the user via `setq`? > If so, maybe it should be a `defcustom`? Yeah, I made new variables customizable. > If gdb-display-these-registers is t this will not "add" but remove all > but `register` from the display, which might surprise the user. > Along the same lines, if gdb-display-these-registers is a function this > will either silently throw away the function (if `listp` returns nil) or > build a "broken" list (if `listp` return non-nil, which is very much > possible). > ... > This may similarly misbehave if gdb-display-these-registers is > a function represented as a list (tho most likely in that case > `register` won't be found in the list, so it will just silently do > nothing). I think I=E2=80=99ve found a good solution, please see the new patch. I rep= laced function with regexp, which is easier to use and should suffice 99% use cases since all we filtering here are just a few dozen registers. Quoting the commit message: Add filtering feature to register buffer of gdb-mi. User can add or remove registers they want to see. On startup, there will be a button =E2=80=9D[filter off]=E2=80=9D on the he= ader line of the register buffer. Clicking on it enables the register filter, changes the button to =E2=80=9D[filter on]=E2=80=9D and adds a =E2=80=9D[-|= +]=E2=80=9D button next to it. Click =E2=80=9D+=E2=80=9D to add patterns to the pattern list, click = =E2=80=9D-=E2=80=9D to remove. Register whose name matches any pattern in the list is displayed. You can also use key =E2=80=9Df=E2=80=9D for toggle, =E2=80=9D+= =E2=80=9D to add pattern, =E2=80=9D-=E2=80=9D to remove pattern. WDYT? Yuan --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: attachment; filename=0001-Add-register-filters-to-gdb-mi.patch Content-Transfer-Encoding: quoted-printable >From 11a3557d42cfad8a976e3512839e8927f94f6e5b Mon Sep 17 00:00:00 2001 From: Yuan Fu Date: Sun, 6 Oct 2019 14:10:14 -0400 Subject: [PATCH] Add register filters to gdb-mi MIME-Version: 1.0 Content-Type: text/plain; charset=3DUTF-8 Content-Transfer-Encoding: 8bit Add filtering feature to register buffer of gdb-mi. User can add or remove registers they want to see. On startup, there will be a button =E2=80=9D[filter off]=E2=80=9D on the he= ader line of the register buffer. Clicking on it enables the register filter, changes the button to =E2=80=9D[filter on]=E2=80=9D and adds a =E2=80=9D[-|= +]=E2=80=9D button next to it. Click =E2=80=9D+=E2=80=9D to add patterns to the pattern list, click = =E2=80=9D-=E2=80=9D to remove. Register whose name matches any pattern in the list is displayed. You can also use key =E2=80=9Df=E2=80=9D for toggle, =E2=80=9D+= =E2=80=9D to add pattern, =E2=80=9D-=E2=80=9D to remove pattern. * lisp/progmodes/gdb-mi.el (gdb-registers-enable-filter, gdb-registers-filter-pattern-list, gdb-header-click-event-handler, gdb-registers-add-to-display, gdb-registers-remove-from-display, gdb-registers-toggle-filter): new (gdb-registers-handler-custom): condition check before adding each register (gdb-registers-mode-map): add new keys (gdb-registers-header): add new buttons --- lisp/progmodes/gdb-mi.el | 137 +++++++++++++++++++++++++++++++++++---- 1 file changed, 125 insertions(+), 12 deletions(-) diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el index 60852e4ad6..dce6d76d1a 100644 --- a/lisp/progmodes/gdb-mi.el +++ b/lisp/progmodes/gdb-mi.el @@ -535,6 +535,24 @@ gdb-show-threads-by-default :group 'gdb-buffers :version "23.2") =20 +;; automatically local because we don't want filters persist across gdb se= ssions +(defcustom gdb-registers-enable-filter nil + "If t, enable register name filter in register buffer." + :local t + :type 'boolean + :group 'gdb-buffers + :version "27.1") + +(defcustom gdb-registers-filter-pattern-list nil + "Registers that are displayed in register buffer. + +Should be a list. Registers whose name can match +any of the regexps in the list is displayed." + :local t + :type 'list + :group 'gdb-buffers + :version "27.1") + (defvar gdb-debug-log nil "List of commands sent to and replies received from GDB. Most recent commands are listed first. This list stores only the last @@ -4238,6 +4256,53 @@ gdb-frame-locals-buffer 'gdb-registers-mode 'gdb-invalidate-registers) =20 +(defun gdb-header-click-event-handler (function) + "Return a function that handles clicking event on gdb header buttons. + +This function switches to the window where the header locates and +executes FUNCTION." + (lambda (event) + (interactive "e") + (save-selected-window + ;; make sure we are in the right buffer + (select-window (posn-window (event-start event))) + (funcall function)))) + +(defun gdb-registers-add-to-display () + "Add register to display in register buffer. + +Prompt for a register pattern. The pattern should be a regexp +pattern matching the name of the register(s) you want to +display." + (interactive) + (let ((register (completing-read "Register pattern: " + gdb-register-names))) + (cl-pushnew register gdb-registers-filter-pattern-list) + ;; update register buffer + (gdb-invalidate-registers 'update))) + +(defun gdb-registers-remove-from-display () + "Remove register from display in register buffer. + +Prompt for a register pattern. The pattern should be a pattern +you want to remove from the existing patterns." + (interactive) + (let ((register (completing-read "Register pattern: " + gdb-registers-filter-pattern-list + nil t))) ; require match + (setq gdb-registers-filter-pattern-list + (remove register gdb-registers-filter-pattern-list)) + ;; update register buffer + (gdb-invalidate-registers 'update))) + +(defun gdb-registers-toggle-filter () + "Toggle register filter." + (interactive) + (setq gdb-registers-enable-filter + (not gdb-registers-enable-filter)) + ;; update register buffer + (gdb-invalidate-registers 'update)) + (defun gdb-registers-handler-custom () (when gdb-register-names (let ((register-values @@ -4248,17 +4313,24 @@ gdb-registers-handler-custom (value (bindat-get-field register 'value)) (register-name (nth (string-to-number register-number) gdb-register-names))) - (gdb-table-add-row - table - (list - (propertize register-name - 'font-lock-face font-lock-variable-name-face) - (if (member register-number gdb-changed-registers) - (propertize value 'font-lock-face font-lock-warning-face) - value)) - `(mouse-face highlight - help-echo "mouse-2: edit value" - gdb-register-name ,register-name)))) + ;; add register if `gdb-display-these-registers' is t + ;; or any pattern in `gdb-display-these-registers' matches + (when (or (not gdb-registers-enable-filter) + (cl-loop for pattern in gdb-registers-filter-pattern-l= ist + if (string-match pattern register-name) + return t + finally return nil)) + (gdb-table-add-row + table + (list + (propertize register-name + 'font-lock-face font-lock-variable-name-face) + (if (member register-number gdb-changed-registers) + (propertize value 'font-lock-face font-lock-warning-face) + value)) + `(mouse-face highlight + help-echo "mouse-2: edit value" + gdb-register-name ,register-name))))) (insert (gdb-table-string table " "))) (setq mode-name (gdb-current-context-mode-name "Registers")))) @@ -4287,6 +4359,9 @@ gdb-registers-mode-map (gdb-get-buffer-create 'gdb-locals-buffer gdb-thread-number) t))) + (define-key map "+" #'gdb-registers-add-to-display) + (define-key map "-" #'gdb-registers-remove-from-display) + (define-key map "f" #'gdb-registers-toggle-filter) map)) =20 (defvar gdb-registers-header @@ -4296,7 +4371,45 @@ gdb-registers-header mode-line-inactive) " " (gdb-propertize-header "Registers" gdb-registers-buffer - nil nil mode-line))) + nil nil mode-line) + + '(:eval (if (not gdb-registers-enable-filter) + (propertize " [filter off]" + 'face 'shadow + 'help-echo "mouse-1: toggle filter" + 'mouse-face 'mode-line-highlight + 'local-map (gdb-make-header-line-mouse-map + 'mouse-1 + (gdb-header-click-event-handler + #'gdb-registers-toggle-filter))) + (concat ; enable filter + (propertize " [filter on]" + 'face '(:weight bold :inherit success) + 'help-echo "mouse-1: toggle filter" + 'mouse-face 'mode-line-highlight + 'local-map (gdb-make-header-line-mouse-map + 'mouse-1 + (gdb-header-click-event-handler + #'gdb-registers-toggle-filter))) + " [" + (propertize "-" + 'face 'font-lock-warning-face + 'help-echo "mouse-1: remove register pattern fro= m display filter" + 'mouse-face 'mode-line-highlight + 'local-map (gdb-make-header-line-mouse-map + 'mouse-1 + (gdb-header-click-event-handler + #'gdb-registers-remove-from-display= ))) + "|" + (propertize "+" + 'face 'font-lock-warning-face + 'help-echo "mouse-1: add register pattern to dis= play filter" + 'mouse-face 'mode-line-highlight + 'local-map (gdb-make-header-line-mouse-map + 'mouse-1 + (gdb-header-click-event-handler + #'gdb-registers-add-to-display))) + "]"))))) =20 (define-derived-mode gdb-registers-mode gdb-parent-mode "Registers" "Major mode for gdb registers." --=20 2.23.0 --=-=-=--