emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] find-file-noselect-1


From: Nick Roberts
Subject: Re: [PATCH] find-file-noselect-1
Date: Mon, 14 Feb 2005 09:49:57 +1300

 >                         I don't think that gud-comint-buffer should be set
 >     to nil because that would prevent the GDB session from recovering.
 > 
 > Perhaps you should add a new variable, which you can set if you catch
 > an error, to disable this hook from really doing anything once it has
 > had an error.

I have added a variable called gdb-find-file-unhook. It gets re-initialised
at the start of every gdb session because the user might conceivably use
different versions of gdb. The most likely cause of an error that I can see
is gdb giving unexpected output eg GDB developers are internationalising
the CLI output (Note: MI output should not change, however).

 >      > Why call find-file-noselect there?  If this is meant to operate on
 >      > the file that was just visited, it already has a buffer, and it is
 >      > the current buffer when gdb-find-file-hook runs.  Why not just use
 >      > that buffer?
 > 
 >     That might have been true but I'm now using this function to address
 >     Kim's point about enabling gud-minor-mode for existing buffers.
 > 
 > It sounds like you are in all cases trying to find an existing buffer.
 > So instead of using find-file-noselect, you could use
 > find-buffer-visiting.

I've not used find-buffer-visiting but I have followed Stefan's advice about
using the buffer instead of the filename. The patch is attached below. It
includes a few small unrelated changes now. Probably the best test is for it
to get some use.

Shall I install it?

Nick



*** /home/nick/emacs/lisp/progmodes/gdb-ui.el.~1.47.~   2005-02-10 
08:22:54.000000000 +1300
--- /home/nick/emacs/lisp/progmodes/gdb-ui.el   2005-02-14 09:31:05.000000000 
+1300
***************
*** 79,84 ****
--- 79,86 ----
  (defvar gdb-overlay-arrow-position nil)
  (defvar gdb-server-prefix nil)
  (defvar gdb-flush-pending-output nil)
+ (defvar gdb-location-list nil "List of directories for source files.")
+ (defvar gdb-find-file-unhook nil)
  
  (defvar gdb-buffer-type nil
    "One of the symbols bound in `gdb-buffer-rules'.")
***************
*** 191,196 ****
--- 193,227 ----
    :group 'gud
    :version "22.1")
  
+ (defun gdb-set-gud-minor-mode (buffer)
+   "Set gud-minor-mode from find-file if appropriate."
+   (goto-char (point-min))
+   (unless (search-forward "No source file named " nil t)
+     (condition-case nil
+       (gdb-enqueue-input
+        (list (concat gdb-server-prefix "info source\n")
+              `(lambda () (gdb-set-gud-minor-mode-1 ,buffer))))
+       (error (setq gdb-find-file-unhook t)))))
+ 
+ (defun gdb-set-gud-minor-mode-1 (buffer)
+   (goto-char (point-min))
+   (if (and (search-forward "Located in " nil t)
+          (looking-at "\\S-*")
+          (string-equal (buffer-file-name buffer)
+                        (match-string 0)))
+       (with-current-buffer buffer
+       (set (make-local-variable 'gud-minor-mode) 'gdba)
+       (set (make-local-variable 'tool-bar-map) gud-tool-bar-map))))
+ 
+ (defun gdb-set-gud-minor-mode-existing-buffers ()
+   (dolist (buffer (buffer-list))
+     (let ((file (buffer-file-name buffer)))
+       (if file
+       (progn
+         (gdb-enqueue-input
+          (list (concat "list " (file-name-nondirectory file) ":1\n")
+                `(lambda () (gdb-set-gud-minor-mode ,buffer)))))))))
+ 
  (defun gdb-ann3 ()
    (setq gdb-debug-log nil)
    (set (make-local-variable 'gud-minor-mode) 'gdba)
***************
*** 249,254 ****
--- 280,286 ----
    (setq gdb-server-prefix "server ")
    (setq gdb-flush-pending-output nil)
    (setq gdb-location-list nil)
+   (setq gdb-find-file-unhook nil)
    ;;
    (setq gdb-buffer-type 'gdba)
    ;;
***************
*** 263,268 ****
--- 295,301 ----
    (gdb-enqueue-input (list "server list MAIN__\n" 'ignore))   ; Fortran 
program
    (gdb-enqueue-input (list "server info source\n" 'gdb-source-info))
    ;;
+   (gdb-set-gud-minor-mode-existing-buffers)
    (run-hooks 'gdba-mode-hook))
  
  (defcustom gdb-use-colon-colon-notation nil
***************
*** 1048,1055 ****
    ;; buffer specific functions
    gdb-info-breakpoints-custom)
  
- (defvar gdb-location-list nil "List of directories for source files.")
- 
  (defconst breakpoint-xpm-data
    "/* XPM */
  static char *magick[] = {
--- 1081,1086 ----
***************
*** 1159,1171 ****
                           (setq file (cdr (assoc bptno gdb-location-list))))
                        (unless (string-equal file "File not found")
                          (if file
!                             (with-current-buffer
!                                 (find-file-noselect file)
!                               (save-current-buffer
!                                 (set (make-local-variable 'gud-minor-mode)
                                     'gdba)
!                                 (set (make-local-variable 'tool-bar-map)
!                                      gud-tool-bar-map))
                                ;; only want one breakpoint icon at each 
location
                                (save-excursion
                                  (goto-line (string-to-number line))
--- 1190,1200 ----
                           (setq file (cdr (assoc bptno gdb-location-list))))
                        (unless (string-equal file "File not found")
                          (if file
!                             (with-current-buffer (find-file-noselect file)
!                               (set (make-local-variable 'gud-minor-mode)
                                     'gdba)
!                               (set (make-local-variable 'tool-bar-map)
!                                    gud-tool-bar-map)
                                ;; only want one breakpoint icon at each 
location
                                (save-excursion
                                  (goto-line (string-to-number line))
***************
*** 2054,2068 ****
    "Find the source file where the program starts and displays it with related
  buffers."
    (goto-char (point-min))
!   (if (search-forward "Located in " nil t)
!       (if (looking-at "\\S-*")
!         (setq gdb-main-file (match-string 0))))
   (if gdb-many-windows
        (gdb-setup-windows)
     (gdb-get-create-buffer 'gdb-breakpoints-buffer)
!     (if gdb-show-main
!       (let ((pop-up-windows t))
!       (display-buffer (gud-find-file gdb-main-file))))))
  
  (defun gdb-get-location (bptno line flag)
    "Find the directory containing the relevant source file.
--- 2083,2097 ----
    "Find the source file where the program starts and displays it with related
  buffers."
    (goto-char (point-min))
!   (if (and (search-forward "Located in " nil t)
!          (looking-at "\\S-*"))
!       (setq gdb-main-file (match-string 0)))
   (if gdb-many-windows
        (gdb-setup-windows)
     (gdb-get-create-buffer 'gdb-breakpoints-buffer)
!    (if gdb-show-main
!        (let ((pop-up-windows t))
!        (display-buffer (gud-find-file gdb-main-file))))))
  
  (defun gdb-get-location (bptno line flag)
    "Find the directory containing the relevant source file.
***************
*** 2085,2090 ****
--- 2114,2135 ----
        (goto-line (string-to-number line))
        (gdb-put-breakpoint-icon (eq flag ?y) bptno))))
  
+ (add-hook 'find-file-hook 'gdb-find-file-hook)
+ 
+ (defun gdb-find-file-hook ()
+   (if (and (not gdb-find-file-unhook)
+          ;; in case gud or gdb-ui is just loaded
+          gud-comint-buffer
+          (buffer-name gud-comint-buffer)
+          (with-current-buffer gud-comint-buffer
+            (eq gud-minor-mode 'gdba)))
+       (condition-case nil
+       (gdb-enqueue-input
+        (list (concat "list " (file-name-nondirectory buffer-file-name)
+                      ":1\n")
+              `(lambda () (gdb-set-gud-minor-mode ,(current-buffer)))))
+       (error nil))))
+ 
  ;;from put-image
  (defun gdb-put-string (putstring pos &optional dprop)
    "Put string PUTSTRING in front of POS in the current buffer.







reply via email to

[Prev in Thread] Current Thread [Next in Thread]