Add "forward history" support for some debuggers

* lisp/progmodes/gud.el (gud-query-cmdline): Add an optional
default-list parameter to allow passing a list of "forward
history" suggestions to the minibuffer.
(perldb, pdb, guiler): Use buffer file name to suggest a default
debugging command via "forward history".

* doc/emacs/building.texi (Starting GUD): Document the new
feature.

(Bug#77989)
This commit is contained in:
Paul Nelson
2025-04-21 22:14:53 +02:00
committed by Eli Zaretskii
parent dd3429526a
commit f808f637f5
3 changed files with 36 additions and 6 deletions

View File

@@ -674,6 +674,9 @@ Run the SDB debugger.
using the minibuffer. The minibuffer's initial contents contain the
standard executable name and options for the debugger, and sometimes
also a guess for the name of the executable file you want to debug.
For @code{pdb}, @code{perldb}, and @code{guiler}, if the current buffer
visits a file, pressing @kbd{M-n} (@code{next-history-element})
in the prompt suggests a full command line including that file name.
Shell wildcards and variables are not allowed in this command line.
Emacs assumes that the first command argument which does not start
with a @samp{-} is the executable file name.

View File

@@ -1975,6 +1975,14 @@ normal file name starts with "file:", you can disable the URI
recognition by invoking 'sqlite-open' with the new optional argument
DISABLE-URI non-nil.
** GUD
---
*** pdb, perldb, and guiler suggest debugging the current file via 'M-n'.
When starting these debuggers (e.g., 'M-x pdb') while visiting a file,
pressing 'M-n' in the command prompt suggests a command line including
the file name, using the minibuffer's "future history".
* New Modes and Packages in Emacs 31.1

View File

@@ -757,7 +757,11 @@ The option \"--fullname\" must be included in this value."
:parent minibuffer-local-map
"C-i" #'comint-dynamic-complete-filename)
(defun gud-query-cmdline (minor-mode &optional init)
(defun gud-query-cmdline (minor-mode &optional init default-list)
"Prompt for a command to run the debugger.
MINOR-MODE is the name of the debugger to run. INIT is the initial
command, before any history is available. DEFAULT-LIST is a list of
default commands, accessible via \\[next-history-element]."
(let* ((hist-sym (gud-symbol 'history nil minor-mode))
(cmd-name (gud-val 'command-name minor-mode)))
(unless (boundp hist-sym) (set hist-sym nil))
@@ -780,7 +784,8 @@ The option \"--fullname\" must be included in this value."
(setq file f)))
file)))))
gud-minibuffer-local-map nil
hist-sym)))
hist-sym
default-list)))
(defvar gdb-first-prompt t)
@@ -1671,8 +1676,13 @@ Noninteractively, COMMAND-LINE should be on the form
The directory containing the perl program becomes the initial
working directory and source-file directory for your debugger."
(interactive
(list (gud-query-cmdline 'perldb
(concat (or (buffer-file-name) "-E 0") " "))))
(list
(gud-query-cmdline
'perldb
(concat (or (buffer-file-name) "-E 0") " ")
(when-let* ((file (buffer-file-name)))
(list (concat gud-perldb-command-name " "
(shell-quote-argument file) " "))))))
(gud-common-init command-line 'gud-perldb-massage-args
'gud-perldb-marker-filter)
@@ -1802,7 +1812,11 @@ If called interactively, the command line will be prompted for.
The directory containing this file becomes the initial working
directory and source-file directory for your debugger."
(interactive
(list (gud-query-cmdline 'pdb)))
(list (gud-query-cmdline
'pdb nil
(when-let* ((file (buffer-file-name)))
(list (concat gud-pdb-command-name " "
(shell-quote-argument file)))))))
(gud-common-init command-line nil 'gud-pdb-marker-filter)
(setq-local gud-minor-mode 'pdb)
@@ -1889,7 +1903,12 @@ This should be an executable on your path, or an absolute file name."
The directory containing FILE becomes the initial working directory
and source-file directory for your debugger."
(interactive
(list (gud-query-cmdline 'guiler)))
(list
(gud-query-cmdline
'guiler nil
(when-let* ((file (buffer-file-name)))
(list (concat gud-guiler-command-name " "
(shell-quote-argument file)))))))
(gud-common-init command-line nil 'gud-guiler-marker-filter)
(setq-local gud-minor-mode 'guiler)