(vc-fetch-master-properties): For RCS file,
[bpt/emacs.git] / lisp / gud.el
index 3dff754..58e2670 100644 (file)
@@ -5,7 +5,7 @@
 ;; Maintainer: FSF
 ;; Keywords: unix, tools
 
-;; Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
+;; Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
 
 ;; This file is part of GNU Emacs.
 
 (global-set-key (concat gud-key-prefix "\C-l") 'gud-refresh)
 (define-key ctl-x-map " " 'gud-break)  ;; backward compatibility hack
 
-(defvar gud-massage-args nil)
-(put 'gud-massage-args 'permanent-local t)
 (defvar gud-marker-filter nil)
 (put 'gud-marker-filter 'permanent-local t)
 (defvar gud-find-file nil)
 (put 'gud-find-file 'permanent-local t)
 
-(defun gud-massage-args (&rest args)
-  (apply gud-massage-args args))
-
 (defun gud-marker-filter (&rest args)
   (apply gud-marker-filter args))
 
 ;; before use.)
 (defvar gud-menu-map (make-sparse-keymap "Gud") nil)
 (define-key gud-menu-map [refresh] '("Refresh" . gud-refresh))
-(define-key gud-menu-map [remove] '("Remove breakpoint" . gud-remove))
+(define-key gud-menu-map [remove] '("Remove Breakpoint" . gud-remove))
 (define-key gud-menu-map [tbreak] nil) ; gdb, sdb and xdb
-(define-key gud-menu-map [break] '("Set breakpoint" . gud-break))
+(define-key gud-menu-map [break] '("Set Breakpoint" . gud-break))
 (define-key gud-menu-map [up] nil)     ; gdb, dbx, and xdb
 (define-key gud-menu-map [down] nil)   ; gdb, dbx, and xdb
-(define-key gud-menu-map [print] '("Print expression" . gud-print))
+(define-key gud-menu-map [print] '("Print Expression" . gud-print))
 (define-key gud-menu-map [finish] nil) ; gdb or xdb
-(define-key gud-menu-map [stepi] '("Step instruction" . gud-stepi))
-(define-key gud-menu-map [step] '("Step line" . gud-step))
-(define-key gud-menu-map [next] '("Next line" . gud-next))
+(define-key gud-menu-map [stepi] '("Step Instruction" . gud-stepi))
+(define-key gud-menu-map [step] '("Step Line" . gud-step))
+(define-key gud-menu-map [next] '("Next Line" . gud-next))
 (define-key gud-menu-map [cont] '("Continue" . gud-cont))
 \f
 ;; ======================================================================
@@ -175,6 +170,10 @@ we're in the GUD buffer)."
 (defun gud-gdb-massage-args (file args)
   (cons "-fullname" args))
 
+(defvar gud-gdb-marker-regexp
+  (concat "\032\032\\([^" path-separator "\n]*\\)" path-separator
+         "\\([0-9]*\\)" path-separator ".*\n"))
+
 ;; There's no guarantee that Emacs will hand the filter the entire
 ;; marker at once; it could be broken up across several strings.  We
 ;; might even receive a big chunk with several markers in it.  If we
@@ -189,8 +188,7 @@ we're in the GUD buffer)."
   (let ((output ""))
 
     ;; Process all the complete markers in this chunk.
-    (while (string-match "\032\032\\([^:\n]*\\):\\([0-9]*\\):.*\n"
-                        gud-marker-acc)
+    (while (string-match gud-gdb-marker-regexp gud-marker-acc)
       (setq
 
        ;; Extract the frame position from the marker.
@@ -232,18 +230,26 @@ we're in the GUD buffer)."
   "Return a new keymap which inherits from MAP and has name `Gud'."
   (nconc (make-sparse-keymap "Gud") map))
 
+(defun gud-make-debug-menu ()
+  "Make sure the current local map has a [menu-bar debug] submap.
+If it doesn't, replace it with a new map that inherits it,
+and create such a submap in that new map."
+  (if (lookup-key (current-local-map) [menu-bar debug])
+      nil
+    (use-local-map (gud-new-keymap (current-local-map)))
+    (define-key (current-local-map) [menu-bar debug]
+      (cons "Gud" (gud-new-keymap gud-menu-map)))))
+
 (defun gud-gdb-find-file (f)
   (save-excursion
     (let ((buf (find-file-noselect f)))
       (set-buffer buf)
-      (use-local-map (gud-new-keymap (current-local-map)))
-      (define-key (current-local-map) [menu-bar debug]
-       (cons "Gud" (gud-new-keymap gud-menu-map)))
+      (gud-make-debug-menu)
       (local-set-key [menu-bar debug tbreak]
-                    '("Temporary breakpoint" . gud-tbreak))
-      (local-set-key [menu-bar debug finish] '("Finish function" . gud-finish))
-      (local-set-key [menu-bar debug up] '("Up stack" . gud-up))
-      (local-set-key [menu-bar debug down] '("Down stack" . gud-down))
+                    '("Temporary Breakpoint" . gud-tbreak))
+      (local-set-key [menu-bar debug finish] '("Finish Function" . gud-finish))
+      (local-set-key [menu-bar debug up] '("Up Stack" . gud-up))
+      (local-set-key [menu-bar debug down] '("Down Stack" . gud-down))
       buf)))
 
 (defvar gdb-minibuffer-local-map nil
@@ -283,10 +289,10 @@ and source-file directory for your debugger."
   (gud-def gud-print  "print %e"     "\C-p" "Evaluate C expression at point.")
 
   (local-set-key "\C-i" 'gud-gdb-complete-command)
-  (local-set-key [menu-bar debug tbreak] '("Temporary breakpoint" . gud-tbreak))
-  (local-set-key [menu-bar debug finish] '("Finish function" . gud-finish))
-  (local-set-key [menu-bar debug up] '("Up stack" . gud-up))
-  (local-set-key [menu-bar debug down] '("Down stack" . gud-down))
+  (local-set-key [menu-bar debug tbreak] '("Temporary Breakpoint" . gud-tbreak))
+  (local-set-key [menu-bar debug finish] '("Finish Function" . gud-finish))
+  (local-set-key [menu-bar debug up] '("Up Stack" . gud-up))
+  (local-set-key [menu-bar debug down] '("Down Stack" . gud-down))
   (setq comint-prompt-regexp "^(.*gdb[+]?) *")
   (setq paragraph-start comint-prompt-regexp)
   (run-hooks 'gdb-mode-hook)
@@ -457,10 +463,8 @@ available with older versions of GDB."
                   (find-tag-noselect f)
                 (find-file-noselect f))))
       (set-buffer buf)
-      (use-local-map (gud-new-keymap (current-local-map)))
-      (define-key (current-local-map) [menu-bar debug]
-       (cons "Gud" (gud-new-keymap gud-menu-map)))
-      (local-set-key [menu-bar debug tbreak] '("Temporary breakpoint" . gud-tbreak))
+      (gud-make-debug-menu)
+      (local-set-key [menu-bar debug tbreak] '("Temporary Breakpoint" . gud-tbreak))
       buf)))
 
 ;;;###autoload
@@ -496,7 +500,7 @@ and source-file directory for your debugger."
   (setq comint-prompt-regexp  "\\(^\\|\n\\)\\*")
   (setq paragraph-start comint-prompt-regexp)
   (local-set-key [menu-bar debug tbreak]
-    '("Temporary breakpoint" . gud-tbreak))
+    '("Temporary Breakpoint" . gud-tbreak))
   (run-hooks 'sdb-mode-hook)
   )
 \f
@@ -690,11 +694,9 @@ This works in IRIX 4, 5 and 6.")
   (save-excursion
     (let ((buf (find-file-noselect f)))
       (set-buffer buf)
-      (use-local-map (gud-new-keymap (current-local-map)))
-      (define-key (current-local-map) [menu-bar debug]
-       (cons "Gud" (gud-new-keymap gud-menu-map)))
-      (local-set-key [menu-bar debug up] '("Up stack" . gud-up))
-      (local-set-key [menu-bar debug down] '("Down stack" . gud-down))
+      (gud-make-debug-menu)
+      (local-set-key [menu-bar debug up] '("Up Stack" . gud-up))
+      (local-set-key [menu-bar debug down] '("Down Stack" . gud-down))
       buf)))
 
 ;;;###autoload
@@ -754,8 +756,8 @@ and source-file directory for your debugger."
 
   (setq comint-prompt-regexp  "^[^)\n]*dbx) *")
   (setq paragraph-start comint-prompt-regexp)
-  (local-set-key [menu-bar debug up] '("Up stack" . gud-up))
-  (local-set-key [menu-bar debug down] '("Down stack" . gud-down))
+  (local-set-key [menu-bar debug up] '("Up Stack" . gud-up))
+  (local-set-key [menu-bar debug down] '("Down Stack" . gud-down))
   (run-hooks 'dbx-mode-hook)
   )
 \f
@@ -822,16 +824,13 @@ containing the executable being debugged.")
       (if realf
          (let ((buf (find-file-noselect realf)))
            (set-buffer buf)
-           (use-local-map (gud-new-keymap (current-local-map)))
-           (define-key (current-local-map) [menu-bar debug]
-             (cons "Gud" (gud-new-keymap gud-menu-map)))
+           (gud-make-debug-menu)
            (local-set-key [menu-bar debug tbreak]
-                          '("Temporary breakpoint" . gud-tbreak))
+                          '("Temporary Breakpoint" . gud-tbreak))
            (local-set-key [menu-bar debug finish]
-                          '("Finish function" . gud-finish))
-           (local-set-key [menu-bar debug up] '("Up stack" . gud-up))
-           (local-set-key [menu-bar debug up] '("Up stack" . gud-up))
-           (local-set-key [menu-bar debug down] '("Down stack" . gud-down))
+                          '("Finish Function" . gud-finish))
+           (local-set-key [menu-bar debug up] '("Up Stack" . gud-up))
+           (local-set-key [menu-bar debug down] '("Down Stack" . gud-down))
            buf)
        nil))))
 
@@ -868,10 +867,10 @@ directories if your program contains sources from more than one directory."
 
   (setq comint-prompt-regexp  "^>")
   (setq paragraph-start comint-prompt-regexp)
-  (local-set-key [menu-bar debug tbreak] '("Temporary breakpoint" . gud-tbreak))
-  (local-set-key [menu-bar debug finish] '("Finish function" . gud-finish))
-  (local-set-key [menu-bar debug up] '("Up stack" . gud-up))
-  (local-set-key [menu-bar debug down] '("Down stack" . gud-down))
+  (local-set-key [menu-bar debug tbreak] '("Temporary Breakpoint" . gud-tbreak))
+  (local-set-key [menu-bar debug finish] '("Finish Function" . gud-finish))
+  (local-set-key [menu-bar debug up] '("Up Stack" . gud-up))
+  (local-set-key [menu-bar debug down] '("Down Stack" . gud-down))
   (run-hooks 'xdb-mode-hook))
 \f
 ;; ======================================================================
@@ -881,7 +880,7 @@ directories if your program contains sources from more than one directory."
 (defvar gud-perldb-history nil)
 
 (defun gud-perldb-massage-args (file args)
-  (cons "-d" (cons "-emacs" args)))
+  (cons "-d" (cons (car args) (cons "-emacs" (cdr args)))))
 
 ;; There's no guarantee that Emacs will hand the filter the entire
 ;; marker at once; it could be broken up across several strings.  We
@@ -939,7 +938,7 @@ directories if your program contains sources from more than one directory."
   (save-excursion
     (let ((buf (find-file-noselect f)))
       (set-buffer buf)
-      (define-key (current-local-map) [menu-bar debug] (cons "Gud" (copy-keymap gud-menu-map)))
+      (gud-make-debug-menu)
       buf)))
 
 ;;;###autoload
@@ -1079,10 +1078,9 @@ comint mode, which see."
   (setq major-mode 'gud-mode)
   (setq mode-name "Debugger")
   (setq mode-line-process '(":%s"))
-  (use-local-map (gud-new-keymap comint-mode-map))
+  (use-local-map comint-mode-map)
+  (gud-make-debug-menu)
   (define-key (current-local-map) "\C-c\C-l" 'gud-refresh)
-  (define-key (current-local-map) [menu-bar debug]
-    (cons "Gud" (gud-new-keymap gud-menu-map)))
   (make-local-variable 'gud-last-frame)
   (setq gud-last-frame nil)
   (make-local-variable 'comint-prompt-regexp)
@@ -1123,8 +1121,9 @@ comint mode, which see."
         (file-word (let ((w (cdr words)))
                      (while (and w (= ?- (aref (car w) 0)))
                        (setq w (cdr w)))
-                     (prog1 (car w)
-                       (setcar w t))))
+                     (and w
+                          (prog1 (car w)
+                            (setcar w t)))))
         (file-subst
          (and file-word (substitute-in-file-name file-word)))
         (args (cdr words))
@@ -1137,8 +1136,8 @@ comint mode, which see."
                    (if (file-name-directory file-subst)
                        (expand-file-name file-subst)
                      file-subst)))
-        (filepart (and file-word (file-name-nondirectory file))))
-    (switch-to-buffer (concat "*gud-" filepart "*"))
+        (filepart (and file-word (concat "-" (file-name-nondirectory file)))))
+    (switch-to-buffer (concat "*gud" filepart "*"))
     ;; Set default-directory to the file's directory.
     (and file-word
         ;; Don't set default-directory if no directory was specified.
@@ -1154,13 +1153,12 @@ comint mode, which see."
     (let ((w args))
       (while (and w (not (eq (car w) t)))
        (setq w (cdr w)))
-      (setcar w file))
-    (apply 'make-comint (concat "gud-" filepart) program nil
-          (if file-word (funcall massage-args file args) args)))
+      (if w
+         (setcar w file)))
+    (apply 'make-comint (concat "gud" filepart) program nil
+          (funcall massage-args file args)))
   ;; Since comint clobbered the mode, we don't set it until now.
   (gud-mode)
-  (make-local-variable 'gud-massage-args)
-  (setq gud-massage-args massage-args)
   (make-local-variable 'gud-marker-filter)
   (setq gud-marker-filter marker-filter)
   (make-local-variable 'gud-find-file)
@@ -1224,8 +1222,7 @@ comint mode, which see."
               (progn
                 ;; Write something in *compilation* and hack its mode line,
                 (set-buffer (process-buffer proc))
-                ;; Force mode line redisplay soon
-                (set-buffer-modified-p (buffer-modified-p))
+                (force-mode-line-update)
                 (if (eobp)
                     (insert ?\n mode-name " " msg)
                   (save-excursion