X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/19bf3d3fa4b714b62170276250441bd726a3f625..1a2416ede302cdcf126c9876bdac5f4ae31fb223:/lisp/progmodes/gud.el diff --git a/lisp/progmodes/gud.el b/lisp/progmodes/gud.el index 41bb24f9e6..11259aa396 100644 --- a/lisp/progmodes/gud.el +++ b/lisp/progmodes/gud.el @@ -83,6 +83,8 @@ Supported debuggers include gdb, sdb, dbx, xdb, perldb, pdb (Python), jdb, and b (defvar gud-minor-mode nil) (put 'gud-minor-mode 'permanent-local t) +(defvar gud-comint-buffer nil) + (defvar gud-keep-buffer nil) (defun gud-symbol (sym &optional soft minor-mode) @@ -174,7 +176,7 @@ Used to grey out relevant togolbar icons.") :enable (and (not gud-running) (memq gud-minor-mode '(gdbmi gdba gdb dbx xdb jdb pdb bashdb)))) - ([pp] menu-item "Print the emacs s-expression" gud-pp + ([pp] menu-item "Print S-expression" gud-pp :enable (and (not gud-running) gdb-active-process) :visible (and (string-equal @@ -234,9 +236,6 @@ Used to grey out relevant togolbar icons.") (gud-run . "gud/run") (gud-go . "gud/go") (gud-stop-subjob . "gud/stop") - ;; gud-s, gud-si etc. instead of gud-step, - ;; gud-stepi, to avoid file-name clashes on DOS - ;; 8+3 filesystems. (gud-cont . "gud/cont") (gud-until . "gud/until") (gud-next . "gud/next") @@ -304,13 +303,15 @@ Uses `gud--directories' to find the source files." optional doc string DOC. Certain %-escapes in the string arguments are interpreted specially if present. These are: - %f name (without directory) of current source file. - %F name (without directory or extension) of current source file. - %d directory of current source file. - %l number of current source line - %e text of the C lvalue or function-call expression surrounding point. - %a text of the hexadecimal address surrounding point - %p prefix argument to the command (if any) as a number + %f -- Name (without directory) of current source file. + %F -- Name (without directory or extension) of current source file. + %d -- Directory of current source file. + %l -- Number of current source line. + %e -- Text of the C lvalue or function-call expression surrounding point. + %a -- Text of the hexadecimal address surrounding point. + %p -- Prefix argument to the command (if any) as a number. + %c -- Fully qualified class name derived from the expression + surrounding point (jdb only). The `current' source file is the file of the current buffer (if we're in a C file) or the source file current at the last break or @@ -377,8 +378,9 @@ t means that there is no stack, and we are in display-file mode.") (defun gud-speedbar-item-info () "Display the data type of the watch expression element." (let ((var (nth (- (line-number-at-pos (point)) 2) gdb-var-list))) - (if (nth 4 var) - (speedbar-message "%s" (nth 3 var))))) + (if (nth 6 var) + (speedbar-message "%s: %s" (nth 6 var) (nth 3 var)) + (speedbar-message "%s" (nth 3 var))))) (defun gud-install-speedbar-variables () "Install those variables used by speedbar to enhance gud/gdb." @@ -446,8 +448,7 @@ required by the caller." (when (or gdb-force-update (not (save-excursion (goto-char (point-min)) - (let ((case-fold-search t)) - (looking-at "Watch Expressions:"))))) + (looking-at "Watch Expressions:")))) (erase-buffer) (insert "Watch Expressions:\n") (if gdb-speedbar-auto-raise @@ -455,7 +456,7 @@ required by the caller." (let ((var-list gdb-var-list) parent) (while var-list (let* (char (depth 0) (start 0) (var (car var-list)) - (expr (car var)) (varnum (nth 1 var)) + (varnum (car var)) (expr (nth 1 var)) (type (nth 3 var)) (value (nth 4 var)) (status (nth 5 var))) (put-text-property @@ -483,9 +484,9 @@ required by the caller." t) depth) (if (eq status 'out-of-scope) (setq parent 'shadow)) - (if (and (cadr var-list) + (if (and (nth 1 var-list) (string-match (concat varnum "\\.") - (cadr (cadr var-list)))) + (car (nth 1 var-list)))) (setq char ?-) (setq char ?+)) (if (string-match "\\*$" type) @@ -686,6 +687,7 @@ To run GDB in text command mode, set `gud-gdb-command-name' to (if (and gud-comint-buffer (buffer-name gud-comint-buffer) + (get-buffer-process gud-comint-buffer) (with-current-buffer gud-comint-buffer (eq gud-minor-mode 'gdba))) (error "Multiple debugging is only supported with \"gdb --fullname\"")) @@ -741,16 +743,18 @@ To run GDB in text command mode, set `gud-gdb-command-name' to ;; The completion list is constructed by the process filter. (defvar gud-gdb-fetched-lines) -(defvar gud-comint-buffer nil) - -(defun gud-gdb-complete-command () +(defun gud-gdb-complete-command (&optional command a b) "Perform completion on the GDB command preceding point. This is implemented using the GDB `complete' command which isn't available with older versions of GDB." (interactive) - (let* ((end (point)) - (command (buffer-substring (comint-line-beginning-position) end)) - (command-word + (if command + ;; Used by gud-watch in mini-buffer. + (setq command (concat "p " command)) + ;; Used in GUD buffer. + (let ((end (point))) + (setq command (buffer-substring (comint-line-beginning-position) end)))) + (let* ((command-word ;; Find the word break. This match will always succeed. (and (string-match "\\(\\`\\| \\)\\([^ ]*\\)\\'" command) (substring command (match-beginning 2)))) @@ -869,13 +873,14 @@ It is passed through FILTER before we look at it." (defun gud-gdb-run-command-fetch-lines (command buffer &optional skip) "Run COMMAND, and return the list of lines it outputs. -BUFFER is the GUD buffer in which to run the command. +BUFFER is the current buffer which may be the GUD buffer in which to run. SKIP is the number of chars to skip on each lines, it defaults to 0." - (with-current-buffer buffer - (if (save-excursion - (goto-char (point-max)) - (forward-line 0) - (not (looking-at comint-prompt-regexp))) + (with-current-buffer gud-comint-buffer + (if (and (eq gud-comint-buffer buffer) + (save-excursion + (goto-char (point-max)) + (forward-line 0) + (not (looking-at comint-prompt-regexp)))) nil ;; Much of this copied from GDB complete, but I'm grabbing the stack ;; frame instead. @@ -884,12 +889,13 @@ SKIP is the number of chars to skip on each lines, it defaults to 0." (gud-gdb-fetch-lines-string nil) (gud-gdb-fetch-lines-break (or skip 0)) (gud-marker-filter - `(lambda (string) (gud-gdb-fetch-lines-filter string ',gud-marker-filter)))) + `(lambda (string) + (gud-gdb-fetch-lines-filter string ',gud-marker-filter)))) ;; Issue the command to GDB. (gud-basic-call command) ;; Slurp the output. (while gud-gdb-fetch-lines-in-progress - (accept-process-output (get-buffer-process buffer))) + (accept-process-output (get-buffer-process gud-comint-buffer))) (nreverse gud-gdb-fetched-lines))))) @@ -2799,7 +2805,9 @@ Obeying it means displaying in another window the specified file and line." (let ((insource (not (eq (current-buffer) gud-comint-buffer))) (frame (or gud-last-frame gud-last-last-frame)) result) - (while (and str (string-match "\\([^%]*\\)%\\([adeflpc]\\)" str)) + (while (and str + (let ((case-fold-search nil)) + (string-match "\\([^%]*\\)%\\([adefFlpc]\\)" str))) (let ((key (string-to-char (match-string 2 str))) subst) (cond @@ -2884,8 +2892,11 @@ Obeying it means displaying in another window the specified file and line." (set-buffer gud-comint-buffer) (save-restriction (widen) - (goto-char (process-mark proc)) - (forward-line 0) + (if (marker-position gud-delete-prompt-marker) + ;; We get here when printing an expression. + (goto-char gud-delete-prompt-marker) + (goto-char (process-mark proc)) + (forward-line 0)) (if (looking-at comint-prompt-regexp) (set-marker gud-delete-prompt-marker (point))) (if (memq gud-minor-mode '(gdbmi gdba)) @@ -2906,7 +2917,21 @@ Obeying it means displaying in another window the specified file and line." (defvar gud-find-expr-function 'gud-find-c-expr) (defun gud-find-expr (&rest args) - (apply gud-find-expr-function args)) + (let ((expr (if (and transient-mark-mode mark-active) + (buffer-substring (region-beginning) (region-end)) + (apply gud-find-expr-function args)))) + (save-match-data + (if (string-match "\n" expr) + (error "Expression must not include a newline")) + (with-current-buffer gud-comint-buffer + (save-excursion + (goto-char (process-mark (get-buffer-process gud-comint-buffer))) + (forward-line 0) + (when (looking-at comint-prompt-regexp) + (set-marker gud-delete-prompt-marker (point)) + (set-marker-insertion-type gud-delete-prompt-marker t)) + (insert (concat expr " = "))))) + expr)) ;; The next eight functions are hacked from gdbsrc.el by ;; Debby Ayers , @@ -3273,11 +3298,10 @@ Treats actions as defuns." (remove-hook 'tooltip-hook 'gud-tooltip-tips) (define-key global-map [mouse-movement] 'ignore))) (gud-tooltip-activate-mouse-motions-if-enabled) - (if (and - gud-comint-buffer - (buffer-name gud-comint-buffer); gud-comint-buffer might be killed - (with-current-buffer gud-comint-buffer - (memq gud-minor-mode '(gdbmi gdba)))) + (if (and gud-comint-buffer + (buffer-name gud-comint-buffer); gud-comint-buffer might be killed + (memq (buffer-local-value 'gud-minor-mode gud-comint-buffer) + '(gdbmi gdba))) (if gud-tooltip-mode (progn (dolist (buffer (buffer-list))