]> code.delx.au - gnu-emacs/blobdiff - lisp/speedbar.el
(custom-theme-set-variables): Sort symbols that are
[gnu-emacs] / lisp / speedbar.el
index 2e55c4929d5626fe411a9b9caa85a2bd4345f18b..370431dc63985172b6f5d77bd70bb60a8df2603f 100644 (file)
@@ -1,7 +1,7 @@
 ;;; speedbar --- quick access to files and tags in a frame
 
 ;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-;;   2005, 2006 Free Software Foundation, Inc.
+;;   2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
 ;; Author: Eric M. Ludlam <zappo@gnu.org>
 ;; Keywords: file, tags, tools
   "The current version of speedbar.")
 (defvar speedbar-incompatible-version "0.14beta4"
   "This version of speedbar is incompatible with this version.
-Due to massive API changes (removing the use of the word PATH) 
+Due to massive API changes (removing the use of the word PATH)
 this version is not backward compatible to 0.14 or earlier.")
 
 ;; This file is part of GNU Emacs.
 
 ;; GNU Emacs is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
 ;; any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
@@ -316,7 +316,7 @@ The default buffer is the buffer in the selected window in the attached frame."
 
 (defcustom speedbar-show-unknown-files nil
   "*Non-nil show files we can't expand with a ? in the expand button.
-nil means don't show the file in the list."
+A nil value means don't show the file in the list."
   :group 'speedbar
   :type 'boolean)
 
@@ -503,7 +503,7 @@ hierarchy would be replaced with the new directory."
   :type 'hook)
 
 (defcustom speedbar-after-create-hook '(speedbar-frame-reposition-smartly)
-  "*Hooks called before popping up the speedbar frame."
+  "*Hooks called after popping up the speedbar frame."
   :group 'speedbar
   :type 'hook)
 
@@ -819,7 +819,7 @@ to toggle this value.")
 
 (defun speedbar-make-specialized-keymap ()
   "Create a keymap for use with a speedbar major or minor display mode.
-This basically creates a sparse keymap, and makes it's parent be
+This basically creates a sparse keymap, and makes its parent be
 `speedbar-key-map'."
   (let ((k (make-sparse-keymap)))
     (set-keymap-parent k speedbar-key-map)
@@ -915,14 +915,12 @@ This basically creates a sparse keymap, and makes it's parent be
                     (looking-at "[0-9]+: *\\[[+-]\\] [^ \n]+ \\*?[!#]$"))]
     )
   "Additional menu items while in file-mode.")
+
 (defvar speedbar-easymenu-definition-trailer
   (append
    (if (and (featurep 'custom) (fboundp 'custom-declare-variable))
        (list ["Customize..." speedbar-customize t]))
    (list
-    ["Detach" speedbar-detach (and speedbar-frame
-                                   (eq (selected-frame) speedbar-frame)) ]
     ["Close" dframe-close-frame t]
     ["Quit" delete-frame t] ))
   "Menu items appearing at the end of the speedbar menu.")
@@ -960,13 +958,13 @@ directories.")
 (defalias 'speedbar-make-overlay
   (if (featurep 'xemacs) 'make-extent 'make-overlay))
 
-(defalias 'speedbar-overlay-put 
+(defalias 'speedbar-overlay-put
   (if (featurep 'xemacs) 'set-extent-property 'overlay-put))
 
-(defalias 'speedbar-delete-overlay 
+(defalias 'speedbar-delete-overlay
   (if (featurep 'xemacs) 'delete-extent 'delete-overlay))
 
-(defalias 'speedbar-mode-line-update 
+(defalias 'speedbar-mode-line-update
   (if (featurep 'xemacs) 'redraw-modeline 'force-mode-line-update))
 \f
 ;;; Mode definitions/ user commands
@@ -977,7 +975,7 @@ directories.")
 ;;;###autoload
 (defun speedbar-frame-mode (&optional arg)
   "Enable or disable speedbar.  Positive ARG means turn on, negative turn off.
-nil means toggle.  Once the speedbar frame is activated, a buffer in
+A nil ARG means toggle.  Once the speedbar frame is activated, a buffer in
 `speedbar-mode' will be displayed.  Currently, only one speedbar is
 supported at a time.
 `speedbar-before-popup-hook' is called before popping up the speedbar frame.
@@ -996,7 +994,7 @@ supported at a time.
                     'speedbar-buffer
                     "Speedbar"
                     #'speedbar-frame-mode
-                    (if dframe-xemacsp
+                    (if (featurep 'xemacs)
                         (append speedbar-frame-plist
                                 ;; This is a hack to get speedbar to iconfiy
                                 ;; with the selected frame.
@@ -1022,7 +1020,7 @@ supported at a time.
 
 (defun speedbar-frame-reposition-smartly ()
   "Reposition the speedbar frame to be next to the attached frame."
-  (cond ((and dframe-xemacsp
+  (cond ((and (featurep 'xemacs)
              (or (member 'left speedbar-frame-plist)
                  (member 'top speedbar-frame-plist)))
         (dframe-reposition-frame
@@ -1031,7 +1029,7 @@ supported at a time.
          (cons (car (cdr (member 'left speedbar-frame-plist)))
                (car (cdr (member 'top speedbar-frame-plist)))))
         )
-       ((and (not dframe-xemacsp)
+       ((and (not (featurep 'xemacs))
              (or (assoc 'left speedbar-frame-parameters)
                  (assoc 'top speedbar-frame-parameters)))
         ;; if left/top were specified in the parameters, pass them
@@ -1047,21 +1045,6 @@ supported at a time.
                                  (dframe-attached-frame speedbar-frame)
                                  speedbar-default-position))))
 
-(defun speedbar-detach ()
-  "Detach the current Speedbar from auto-updating.
-Doing this allows the creation of a second speedbar."
-  (interactive)
-  (let ((buffer speedbar-buffer))
-    (dframe-detach 'speedbar-frame 'speedbar-cached-frame 'speedbar-buffer)
-    (save-excursion
-      (set-buffer buffer)
-      ;; Permanently disable auto-updating in this speedbar buffer.
-      (set (make-local-variable 'speedbar-update-flag) nil)
-      (set (make-local-variable 'speedbar-update-flag-disable) t)
-      ;; Make local copies of all the different variables to prevent
-      ;; funny stuff later...
-      )))
-
 (defsubst speedbar-current-frame ()
   "Return the frame to use for speedbar based on current context."
   (dframe-current-frame 'speedbar-frame 'speedbar-mode))
@@ -1070,10 +1053,10 @@ Doing this allows the creation of a second speedbar."
   "Handle a delete frame event E.
 If the deleted frame is the frame SPEEDBAR is attached to,
 we need to delete speedbar also."
-  (let ((frame-to-be-deleted (car (car (cdr e)))))
-    (if (eq frame-to-be-deleted dframe-attached-frame)
-       (delete-frame speedbar-frame)))
-  )
+  (when (and speedbar-frame
+            (eq (car (car (cdr e))) ;; frame to be deleted
+                dframe-attached-frame))
+    (delete-frame speedbar-frame)))
 
 ;;;###autoload
 (defun speedbar-get-focus ()
@@ -1088,7 +1071,7 @@ selected.  If the speedbar frame is active, then select the attached frame."
 
 (defsubst speedbar-frame-width ()
   "Return the width of the speedbar frame in characters.
-nil if it doesn't exist."
+Return nil if it doesn't exist."
   (frame-width speedbar-frame))
 
 (defun speedbar-mode ()
@@ -1175,13 +1158,13 @@ return true without a query."
 ;; Backwards compatibility
 (defalias 'speedbar-with-attached-buffer 'dframe-with-attached-buffer)
 (defalias 'speedbar-maybee-jump-to-attached-frame 'dframe-maybee-jump-to-attached-frame)
+
 (defun speedbar-set-mode-line-format ()
   "Set the format of the mode line based on the current speedbar environment.
 This gives visual indications of what is up.  It EXPECTS the speedbar
 frame and window to be the currently active frame and window."
   (if (and (frame-live-p (speedbar-current-frame))
-          (or (not dframe-xemacsp)
+          (or (not (featurep 'xemacs))
               (with-no-warnings
                 (specifier-instance has-modeline-p)))
           speedbar-buffer)
@@ -1224,11 +1207,8 @@ and the existence of packages."
                 (speedbar-initial-menu)
               (save-excursion
                 (dframe-select-attached-frame speedbar-frame)
-                (if (local-variable-p
-                     'speedbar-easymenu-definition-special
-                     (current-buffer))
-                    ;; If bound locally, we can use it
-                    speedbar-easymenu-definition-special)))
+                 (eval (nth 1 (assoc speedbar-initial-expansion-list-name
+                               speedbar-initial-expansion-mode-alist)))))
             ;; Dynamic menu stuff
             '("-")
            (list (cons "Displays"
@@ -1272,7 +1252,7 @@ and the existence of packages."
       (if speedbar-previous-menu (easy-menu-remove speedbar-previous-menu))
       (setq speedbar-previous-menu md)
       ;; Now add the new menu
-      (if (not dframe-xemacsp)
+      (if (not (featurep 'xemacs))
          (easy-menu-define speedbar-menu-map (current-local-map)
                            "Speedbar menu" md)
        (easy-menu-add md (current-local-map))
@@ -1502,8 +1482,8 @@ This function can be replaced in `speedbar-mode-functions-list' as
 
 (defun speedbar-item-info-file-helper (&optional filename)
   "Display info about a file that is on the current line.
-nil if not applicable.  If FILENAME, then use that instead of reading
-it from the speedbar buffer."
+Return nil if not applicable.  If FILENAME, then use that
+instead of reading it from the speedbar buffer."
   (let* ((item (or filename (speedbar-line-file)))
         (attr (if item (file-attributes item) nil)))
     (if (and item attr) (speedbar-message "%s %-6d %s" (nth 8 attr)
@@ -1512,7 +1492,7 @@ it from the speedbar buffer."
 
 (defun speedbar-item-info-tag-helper ()
   "Display info about a tag that is on the current line.
-nil if not applicable."
+Return nil if not applicable."
   (save-excursion
     (beginning-of-line)
     (if (re-search-forward " [-+=]?> \\([^\n]+\\)"
@@ -2075,7 +2055,7 @@ position to insert a new item, and that the new item will end with a CR."
                            (if tag-button-function 'speedbar-highlight-face nil)
                            tag-button-function tag-button-data))
     ))
-  
+
 (defun speedbar-change-expand-button-char (char)
   "Change the expansion button character to CHAR for the current line."
   (save-excursion
@@ -2120,7 +2100,7 @@ cell of the form ( 'DIRLIST .  'FILELIST )."
 
 (defun speedbar-default-directory-list (directory index)
   "Insert files for DIRECTORY with level INDEX at point."
-  (speedbar-insert-files-at-point 
+  (speedbar-insert-files-at-point
    (speedbar-file-lists directory) index)
   (speedbar-reset-scanners)
   (if (= index 0)
@@ -2177,7 +2157,7 @@ Groups may optionally contain a position."
             ))))
 
 (defun speedbar-generic-list-tag-p (sublst)
-  "Non nil if SUBLST is a tag."
+  "Non-nil if SUBLST is a tag."
   (and (stringp (car-safe sublst))
        (or (and (number-or-marker-p (cdr-safe sublst))
                (not (cdr-safe (cdr-safe sublst))))
@@ -2474,7 +2454,7 @@ name will have the function FIND-FUN and not token."
   (speedbar-insert-generic-list indent lst
                                'speedbar-tag-expand
                                'speedbar-tag-find))
-                               
+
 (defun speedbar-insert-etags-list (indent lst)
   "At level INDENT, insert the etags generated LST."
   (speedbar-insert-generic-list indent lst
@@ -2529,8 +2509,7 @@ name will have the function FIND-FUN and not token."
                                  default-directory)
                (speedbar-message nil))))
       ;; Else, we can do a short cut.  No text cache.
-      (let ((cbd (expand-file-name default-directory))
-           )
+      (let ((cbd (expand-file-name default-directory)))
        (set-buffer speedbar-buffer)
        (speedbar-with-writable
          (let* ((window (get-buffer-window speedbar-buffer 0))
@@ -2542,8 +2521,7 @@ name will have the function FIND-FUN and not token."
              (funcall func cbd 0))
            (speedbar-reconfigure-keymaps)
            (set-window-point window p)
-           (set-window-start window start)))
-       ))))
+           (set-window-start window start)))))))
 
 (defun speedbar-update-directory-contents ()
   "Update the contents of the speedbar buffer based on the current directory."
@@ -2677,7 +2655,6 @@ Also resets scanner functions."
               (frame-visible-p (speedbar-current-frame))
               (not (eq (frame-visible-p (speedbar-current-frame)) 'icon)))
          (let ((af (selected-frame)))
-           (save-window-excursion
              (dframe-select-attached-frame speedbar-frame)
              ;; make sure we at least choose a window to
              ;; get a good directory from
@@ -2704,14 +2681,16 @@ Also resets scanner functions."
                             "Updating speedbar to special mode: %s...done"
                             major-mode)
                            (speedbar-message nil))))
-                 ;; Update all the contents if directories change!
-                 (if (or (member major-mode speedbar-ignored-modes)
-                         (eq af (speedbar-current-frame))
-                         (not (buffer-file-name)))
-                     nil
-                   (speedbar-update-localized-contents)
-                   ))
-               (select-frame af)))
+
+                 ;; Update all the contents if directories change!
+                 (unless (and (or (member major-mode speedbar-ignored-modes)
+                                  (eq af (speedbar-current-frame))
+                                  (not (buffer-file-name)))
+                              ;; Always update for GUD.
+                              (not (string-equal "GUD"
+                                    speedbar-initial-expansion-list-name)))
+                   (speedbar-update-localized-contents)))
+               (select-frame af))
            ;; Now run stealthy updates of time-consuming items
            (speedbar-stealthy-updates)))))
   (run-hooks 'speedbar-timer-hook))
@@ -2750,7 +2729,7 @@ If new functions are added, their state needs to be updated here."
   "Go to the line where FILE is."
 
   (set-buffer speedbar-buffer)
-  
+
   (goto-char (point-min))
   (let ((m nil))
     (while (and (setq m (re-search-forward
@@ -2936,7 +2915,7 @@ to add more types of version control systems."
             (not (or (and (featurep 'ange-ftp)
                           (string-match
                            (car (symbol-value
-                                 (if dframe-xemacsp
+                                 (if (featurep 'xemacs)
                                      'ange-ftp-directory-format
                                    'ange-ftp-name-format)))
                            (expand-file-name default-directory)))
@@ -3241,7 +3220,7 @@ directory with these items.  This function is replaceable in
     (widen)
     (let ((rf (speedbar-fetch-replacement-function 'speedbar-line-directory)))
       (if rf (funcall rf depth) default-directory))))
-      
+
 (defun speedbar-files-line-directory (&optional depth)
   "Retrieve the directoryname associated with the current line.
 This may require traversing backwards from DEPTH and combining the default
@@ -3326,12 +3305,12 @@ With universal argument ARG, flush cached data."
          (forward-char -2)
          (speedbar-do-function-pointer))
       (error (speedbar-position-cursor-on-line)))))
-  
+
 (defun speedbar-flush-expand-line ()
   "Expand the line under the cursor and flush any cached information."
   (interactive)
   (speedbar-expand-line 1))
-  
+
 (defun speedbar-contract-line ()
   "Contract the line under the cursor."
   (interactive)
@@ -3580,11 +3559,11 @@ This assumes that the cursor is on a file, or tag of a file which the user is
 interested in."
 
   (save-selected-window
-  
+
     (select-window (get-buffer-window speedbar-buffer t))
-    
+
     (set-buffer speedbar-buffer)
-    
+
     (if (<= (count-lines (point-min) (point-max))
            (1- (window-height (selected-window))))
        ;; whole buffer fits