Skip to content

Commit 7c83e60

Browse files
casourilarsmagne
authored andcommitted
Add filter to GDB's register buffer
* lisp/progmodes/gdb-mi.el (gdb-registers-enable-filter) (gdb-registers-filter-pattern-list): New custom options. (gdb-header-click-event-handler, gdb-registers-toggle-filter): New functions. (gdb-header-click-event-handler): Only add a register if it passes the filter. (gdb-registers-mode-map): New keybinding for toggling the filter. (gdb-registers-header): New buttons on the header line for the filter (bug#39179).
1 parent 42d4537 commit 7c83e60

2 files changed

Lines changed: 88 additions & 12 deletions

File tree

‎etc/NEWS‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1601,6 +1601,10 @@ See the new user options 'package-name-column-width',
16011601

16021602
** gdb-mi
16031603

1604+
*** New user option 'gdb-registers-enable-filter'.
1605+
If non-nil, apply a register filter based on
1606+
'gdb-registers-filter-pattern-list'.
1607+
16041608
+++
16051609
*** gdb-mi can now store and restore window configurations.
16061610
Use 'gdb-save-window-configuration' to save window configuration to a

‎lisp/progmodes/gdb-mi.el‎

Lines changed: 84 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,23 @@ stopped thread is already selected."
581581
:group 'gdb-buffers
582582
:version "23.2")
583583

584+
(defcustom gdb-registers-enable-filter nil
585+
"If non-nil, enable register name filter in register buffer.
586+
Use `gdb-registers-filter-pattern-list' to control what register to
587+
filter."
588+
:type 'boolean
589+
:group 'gdb-buffers
590+
:version "28.1")
591+
592+
(defcustom gdb-registers-filter-pattern-list nil
593+
"Patterns for names that are displayed in register buffer.
594+
Each pattern is a regular expression. GDB displays registers
595+
whose name matches any pattern in the list. Refresh the register
596+
buffer for the change to take effect."
597+
:type 'list
598+
:group 'gdb-buffers
599+
:version "28.1")
600+
584601
(defvar gdb-debug-log nil
585602
"List of commands sent to and replies received from GDB.
586603
Most recent commands are listed first. This list stores only the last
@@ -4393,6 +4410,26 @@ member."
43934410
'gdb-registers-mode
43944411
'gdb-invalidate-registers)
43954412

4413+
(defun gdb-header-click-event-handler (function)
4414+
"Return a function that handles clicking event on gdb header buttons.
4415+
4416+
This function switches to the window where the header locates and
4417+
executes FUNCTION."
4418+
(lambda (event)
4419+
(interactive "e")
4420+
(save-selected-window
4421+
;; Make sure we are in the right buffer.
4422+
(select-window (posn-window (event-start event)))
4423+
(funcall function))))
4424+
4425+
(defun gdb-registers-toggle-filter ()
4426+
"Toggle register filter."
4427+
(interactive)
4428+
(setq gdb-registers-enable-filter
4429+
(not gdb-registers-enable-filter))
4430+
;; Update the register buffer.
4431+
(gdb-invalidate-registers 'update))
4432+
43964433
(defun gdb-registers-handler-custom ()
43974434
(when gdb-register-names
43984435
(let ((register-values
@@ -4403,17 +4440,27 @@ member."
44034440
(value (gdb-mi--field register 'value))
44044441
(register-name (nth (string-to-number register-number)
44054442
gdb-register-names)))
4406-
(gdb-table-add-row
4407-
table
4408-
(list
4409-
(propertize register-name
4410-
'font-lock-face font-lock-variable-name-face)
4411-
(if (member register-number gdb-changed-registers)
4412-
(propertize value 'font-lock-face font-lock-warning-face)
4413-
value))
4414-
`(mouse-face highlight
4415-
help-echo "mouse-2: edit value"
4416-
gdb-register-name ,register-name))))
4443+
;; Add register if `gdb-registers-filter-pattern-list' is nil;
4444+
;; or any pattern that `gdb-registers-filter-pattern-list'
4445+
;; matches.
4446+
(when (or (null gdb-registers-enable-filter)
4447+
;; Return t if any register name matches a pattern.
4448+
(cl-loop for pattern
4449+
in gdb-registers-filter-pattern-list
4450+
if (string-match pattern register-name)
4451+
return t
4452+
finally return nil))
4453+
(gdb-table-add-row
4454+
table
4455+
(list
4456+
(propertize register-name
4457+
'font-lock-face font-lock-variable-name-face)
4458+
(if (member register-number gdb-changed-registers)
4459+
(propertize value 'font-lock-face font-lock-warning-face)
4460+
value))
4461+
`(mouse-face highlight
4462+
help-echo "mouse-2: edit value"
4463+
gdb-register-name ,register-name)))))
44174464
(insert (gdb-table-string table " ")))
44184465
(setq mode-name
44194466
(gdb-current-context-mode-name "Registers"))))
@@ -4441,6 +4488,7 @@ member."
44414488
(gdb-get-buffer-create
44424489
'gdb-locals-buffer
44434490
gdb-thread-number) t)))
4491+
(define-key map "f" #'gdb-registers-toggle-filter)
44444492
map))
44454493

44464494
(defvar gdb-registers-header
@@ -4450,7 +4498,31 @@ member."
44504498
mode-line-inactive)
44514499
" "
44524500
(gdb-propertize-header "Registers" gdb-registers-buffer
4453-
nil nil mode-line)))
4501+
nil nil mode-line)
4502+
" "
4503+
'(:eval
4504+
(format
4505+
"[filter %s %s]"
4506+
(propertize
4507+
(if gdb-registers-enable-filter "[on]" "[off]")
4508+
'face (if gdb-registers-enable-filter
4509+
'(:weight bold :inherit success)
4510+
'shadow)
4511+
'help-echo "mouse-1: toggle filter"
4512+
'mouse-face 'mode-line-highlight
4513+
'local-map (gdb-make-header-line-mouse-map
4514+
'mouse-1 (gdb-header-click-event-handler
4515+
#'gdb-registers-toggle-filter)))
4516+
(propertize
4517+
"[set]"
4518+
'face 'mode-line
4519+
'help-echo "mouse-1: Customize filter patterns"
4520+
'mouse-face 'mode-line-highlight
4521+
'local-map (gdb-make-header-line-mouse-map
4522+
'mouse-1 (lambda ()
4523+
(interactive)
4524+
(customize-variable-other-window
4525+
'gdb-registers-filter-pattern-list))))))))
44544526

44554527
(define-derived-mode gdb-registers-mode gdb-parent-mode "Registers"
44564528
"Major mode for gdb registers."

0 commit comments

Comments
 (0)