1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-09 21:20:45 -08:00

Enable highlighting Gud execution lines without hl-line-mode

* doc/emacs/building.texi (Debugger Operation): Mention two new
options and the relationship between Gud and HL Line Mode.

* etc/NEWS (Editing Changes in Emacs 30.1): Mention the new
option.

* lisp/progmodes/gud.el (gud-highlight-current-line-overlay):
New variable.
(gud-sentinel) <signal, exit>: Delete that overlay if set.
(gud-highlight-current-line, gud-highlight-current-line-face):
New user options.
(gud-display-line): Create and move an overlay without employing
hl-line-mode, if so enjoined by the user.
This commit is contained in:
Po Lu 2023-10-12 21:46:54 +08:00
parent 088dd67f89
commit c6f07e13ee
3 changed files with 72 additions and 8 deletions

View file

@ -698,6 +698,20 @@ which edited source line corresponds to the line reported by the
debugger subprocess. To update this information, you typically have
to recompile and restart the program.
@cindex GUD and hl-line-mode
@cindex highlighting execution lines in GUD
@vindex gud-highlight-current-line
Moreover, GUD is capable of visually demarcating the current
execution line within the window text itself in one of two fashions:
the first takes effect when the user option
@code{gud-highlight-current-line} is enabled, and displays that line
in an overlay whose appearance is provided by the face
@code{gud-highlight-current-line-face}. The other takes effect when
HL Line Mode (@pxref{Cursor Display}) is enabled, and moves the
overlay introduced by HL Line Mode briefly to the execution line,
until a subsequent editing command repositions it back beneath the
cursor.
@cindex GUD Tooltip mode
@cindex mode, GUD Tooltip
@findex gud-tooltip-mode

View file

@ -197,6 +197,12 @@ displayed on the mode line when 'appt-display-mode-line' is non-nil.
* Editing Changes in Emacs 30.1
+++
** New user option 'gud-highlight-current-line-overlay'.
When enabled, Gud will visually emphasize the line being executed upon
pauses in the debugee's execution, such as those occasioned by
breakpoints being hit.
---
** New global minor mode 'kill-ring-deindent-mode'.
When enabled, text being saved to the kill ring will be de-indented by

View file

@ -2942,6 +2942,10 @@ It is saved for when this flag is not set.")
(declare-function speedbar-change-initial-expansion-list "speedbar" (new))
(defvar speedbar-previously-used-expansion-list-name)
(defvar gud-highlight-current-line-overlay nil
"Overlay created for `gud-highlight-current-line'.
It is nil if not yet present.")
(defun gud-sentinel (proc msg)
(cond ((null (buffer-name (process-buffer proc)))
;; buffer killed
@ -2958,6 +2962,10 @@ It is saved for when this flag is not set.")
((memq (process-status proc) '(signal exit))
;; Stop displaying an arrow in a source file.
(setq gud-overlay-arrow-position nil)
;; And any highlight overlays.
(when gud-highlight-current-line-overlay
(delete-overlay gud-highlight-current-line-overlay)
(setq gud-highlight-current-line-overlay nil))
(if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
'gdbmi)
(gdb-reset)
@ -3024,6 +3032,24 @@ Obeying it means displaying in another window the specified file and line."
;; region-restriction if that's possible. We use an explicit display-buffer
;; to get around the fact that this is called inside a save-excursion.
(defcustom gud-highlight-current-line nil
"Whether Gud should highlight the source line being debugged.
If non-nil, Gud will accentuate the source code line previously
executed upon each pause in the debugee's execution with an
overlay in the face `gud-highlight-current-line-face'.
If nil, yet one of `hl-line-mode' or `global-hl-line-mode' (which
see) is enabled, then the emphasis imposed by either of those
major modes is instead momentarily moved to the aforesaid source
line, until it is displaced by subsequent cursor motion."
:version "30.1"
:type 'boolean)
(defface gud-highlight-current-line-face
'((t :inherit highlight :extend t))
"Face for highlighting the source code line being executed."
:version "30.1")
(defun gud-display-line (true-file line)
(let* ((last-nonmenu-event t) ; Prevent use of dialog box for questions.
(buffer
@ -3053,14 +3079,32 @@ Obeying it means displaying in another window the specified file and line."
(or gud-overlay-arrow-position
(setq gud-overlay-arrow-position (make-marker)))
(set-marker gud-overlay-arrow-position (point) (current-buffer))
;; If they turned on hl-line, move the hl-line highlight to
;; the arrow's line.
(when (featurep 'hl-line)
(cond
(global-hl-line-mode
(global-hl-line-highlight))
((and hl-line-mode hl-line-sticky-flag)
(hl-line-highlight)))))
(if gud-highlight-current-line
(progn
(unless gud-highlight-current-line-overlay
;; Create the highlight overlay if it does not yet
;; exist.
(let ((overlay (make-overlay (point) (point))))
(overlay-put overlay 'priority -45) ; 5 less than hl-line.
(overlay-put overlay 'face 'gud-highlight-current-line-face)
(setq gud-highlight-current-line-overlay overlay)))
;; Next, move the overlay to the current line.
(move-overlay gud-highlight-current-line-overlay
(line-beginning-position)
(line-beginning-position 2)
(current-buffer)))
;; Delete any overlay introduced if g-h-c-l-f has changed.
(when gud-highlight-current-line-overlay
(delete-overlay gud-highlight-current-line-overlay)
(setq gud-highlight-current-line-overlay nil))
;; If they turned on hl-line, move the hl-line highlight to
;; the arrow's line.
(when (featurep 'hl-line)
(cond
(global-hl-line-mode
(global-hl-line-highlight))
((and hl-line-mode hl-line-sticky-flag)
(hl-line-highlight))))))
(cond ((or (< pos (point-min)) (> pos (point-max)))
(widen)
(goto-char pos))))