;;; speedbar --- quick access to files and tags in a frame
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-;; 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+;; Copyright (C) 1996-2011 Free Software Foundation, Inc.
;; Author: Eric M. Ludlam <zappo@gnu.org>
;; Keywords: file, tags, tools
:type 'hook)
(defcustom speedbar-mode-hook nil
- "Hooks called after creating a speedbar buffer."
+ "Hook run after creating a speedbar buffer."
:group 'speedbar
:type 'hook)
(defvar speedbar-update-flag-disable nil
"Permanently disable changing of the update flag.")
-(defvar speedbar-syntax-table nil
+(defvar speedbar-mode-syntax-table
+ (let ((st (make-syntax-table)))
+ ;; Turn off paren matching around here.
+ (modify-syntax-entry ?\' " " st)
+ (modify-syntax-entry ?\" " " st)
+ (modify-syntax-entry ?\( " " st)
+ (modify-syntax-entry ?\) " " st)
+ (modify-syntax-entry ?\{ " " st)
+ (modify-syntax-entry ?\} " " st)
+ (modify-syntax-entry ?\[ " " st)
+ (modify-syntax-entry ?\] " " st)
+ st)
"Syntax-table used on the speedbar.")
-
-(if speedbar-syntax-table
- nil
- (setq speedbar-syntax-table (make-syntax-table))
- ;; turn off paren matching around here.
- (modify-syntax-entry ?\' " " speedbar-syntax-table)
- (modify-syntax-entry ?\" " " speedbar-syntax-table)
- (modify-syntax-entry ?( " " speedbar-syntax-table)
- (modify-syntax-entry ?) " " speedbar-syntax-table)
- (modify-syntax-entry ?{ " " speedbar-syntax-table)
- (modify-syntax-entry ?} " " speedbar-syntax-table)
- (modify-syntax-entry ?[ " " speedbar-syntax-table)
- (modify-syntax-entry ?] " " speedbar-syntax-table))
-
-(defvar speedbar-key-map nil
+(define-obsolete-variable-alias
+ 'speedbar-syntax-table 'speedbar-mode-syntax-table "24.1")
+
+
+(defvar speedbar-mode-map
+ (let ((map (make-keymap)))
+ (suppress-keymap map t)
+
+ ;; Control.
+ (define-key map "t" 'speedbar-toggle-updates)
+ (define-key map "g" 'speedbar-refresh)
+
+ ;; Navigation.
+ (define-key map "n" 'speedbar-next)
+ (define-key map "p" 'speedbar-prev)
+ (define-key map "\M-n" 'speedbar-restricted-next)
+ (define-key map "\M-p" 'speedbar-restricted-prev)
+ (define-key map "\C-\M-n" 'speedbar-forward-list)
+ (define-key map "\C-\M-p" 'speedbar-backward-list)
+ ;; These commands never seemed useful.
+ ;; (define-key map " " 'speedbar-scroll-up)
+ ;; (define-key map [delete] 'speedbar-scroll-down)
+
+ ;; Short cuts I happen to find useful.
+ (define-key map "r"
+ (lambda () (interactive)
+ (speedbar-change-initial-expansion-list
+ speedbar-previously-used-expansion-list-name)))
+ (define-key map "b"
+ (lambda () (interactive)
+ (speedbar-change-initial-expansion-list "quick buffers")))
+ (define-key map "f"
+ (lambda () (interactive)
+ (speedbar-change-initial-expansion-list "files")))
+
+ (dframe-update-keymap map)
+ map)
"Keymap used in speedbar buffer.")
-
-(if speedbar-key-map
- nil
- (setq speedbar-key-map (make-keymap))
- (suppress-keymap speedbar-key-map t)
-
- ;; control
- (define-key speedbar-key-map "t" 'speedbar-toggle-updates)
- (define-key speedbar-key-map "g" 'speedbar-refresh)
-
- ;; navigation
- (define-key speedbar-key-map "n" 'speedbar-next)
- (define-key speedbar-key-map "p" 'speedbar-prev)
- (define-key speedbar-key-map "\M-n" 'speedbar-restricted-next)
- (define-key speedbar-key-map "\M-p" 'speedbar-restricted-prev)
- (define-key speedbar-key-map "\C-\M-n" 'speedbar-forward-list)
- (define-key speedbar-key-map "\C-\M-p" 'speedbar-backward-list)
-;; These commands never seemed useful.
-;; (define-key speedbar-key-map " " 'speedbar-scroll-up)
-;; (define-key speedbar-key-map [delete] 'speedbar-scroll-down)
-
- ;; Short cuts I happen to find useful
- (define-key speedbar-key-map "r"
- (lambda () (interactive)
- (speedbar-change-initial-expansion-list
- speedbar-previously-used-expansion-list-name)))
- (define-key speedbar-key-map "b"
- (lambda () (interactive)
- (speedbar-change-initial-expansion-list "quick buffers")))
- (define-key speedbar-key-map "f"
- (lambda () (interactive)
- (speedbar-change-initial-expansion-list "files")))
-
- (dframe-update-keymap speedbar-key-map)
-)
+(define-obsolete-variable-alias 'speedbar-key-map 'speedbar-mode-map "24.1")
(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 its parent be
-`speedbar-key-map'."
+`speedbar-mode-map'."
(let ((k (make-sparse-keymap)))
- (set-keymap-parent k speedbar-key-map)
+ (set-keymap-parent k speedbar-mode-map)
k))
-(defvar speedbar-file-key-map nil
+(defvar speedbar-file-key-map
+ (let ((map (speedbar-make-specialized-keymap)))
+
+ ;; Basic tree features.
+ (define-key map "e" 'speedbar-edit-line)
+ (define-key map "\C-m" 'speedbar-edit-line)
+ (define-key map "+" 'speedbar-expand-line)
+ (define-key map "=" 'speedbar-expand-line)
+ (define-key map "-" 'speedbar-contract-line)
+
+ (define-key map "[" 'speedbar-expand-line-descendants)
+ (define-key map "]" 'speedbar-contract-line-descendants)
+
+ (define-key map " " 'speedbar-toggle-line-expansion)
+
+ ;; File based commands.
+ (define-key map "U" 'speedbar-up-directory)
+ (define-key map "I" 'speedbar-item-info)
+ (define-key map "B" 'speedbar-item-byte-compile)
+ (define-key map "L" 'speedbar-item-load)
+ (define-key map "C" 'speedbar-item-copy)
+ (define-key map "D" 'speedbar-item-delete)
+ (define-key map "O" 'speedbar-item-object-delete)
+ (define-key map "R" 'speedbar-item-rename)
+ (define-key map "M" 'speedbar-create-directory)
+ map)
"Keymap used in speedbar buffer while files are displayed.")
-(if speedbar-file-key-map
- nil
- (setq speedbar-file-key-map (speedbar-make-specialized-keymap))
-
- ;; Basic tree features
- (define-key speedbar-file-key-map "e" 'speedbar-edit-line)
- (define-key speedbar-file-key-map "\C-m" 'speedbar-edit-line)
- (define-key speedbar-file-key-map "+" 'speedbar-expand-line)
- (define-key speedbar-file-key-map "=" 'speedbar-expand-line)
- (define-key speedbar-file-key-map "-" 'speedbar-contract-line)
-
- (define-key speedbar-file-key-map "[" 'speedbar-expand-line-descendants)
- (define-key speedbar-file-key-map "]" 'speedbar-contract-line-descendants)
-
- (define-key speedbar-file-key-map " " 'speedbar-toggle-line-expansion)
-
- ;; file based commands
- (define-key speedbar-file-key-map "U" 'speedbar-up-directory)
- (define-key speedbar-file-key-map "I" 'speedbar-item-info)
- (define-key speedbar-file-key-map "B" 'speedbar-item-byte-compile)
- (define-key speedbar-file-key-map "L" 'speedbar-item-load)
- (define-key speedbar-file-key-map "C" 'speedbar-item-copy)
- (define-key speedbar-file-key-map "D" 'speedbar-item-delete)
- (define-key speedbar-file-key-map "O" 'speedbar-item-object-delete)
- (define-key speedbar-file-key-map "R" 'speedbar-item-rename)
- (define-key speedbar-file-key-map "M" 'speedbar-create-directory)
- )
-
(defvar speedbar-easymenu-definition-base
(append
'("Speedbar"
Return nil if it doesn't exist."
(frame-width speedbar-frame))
-(defun speedbar-mode ()
+(define-derived-mode speedbar-mode fundamental-mode "Speedbar"
"Major mode for managing a display of directories and tags.
\\<speedbar-key-map>
The first line represents the default directory of the speedbar frame.
in the selected file.
\\{speedbar-key-map}"
- ;; NOT interactive
(save-excursion
- (kill-all-local-variables)
- (setq major-mode 'speedbar-mode)
- (setq mode-name "Speedbar")
- (set-syntax-table speedbar-syntax-table)
(setq font-lock-keywords nil) ;; no font-locking please
(setq truncate-lines t)
(make-local-variable 'frame-title-format)
- (setq frame-title-format (concat "Speedbar " speedbar-version))
- (setq case-fold-search nil)
- (toggle-read-only 1)
+ (setq frame-title-format (concat "Speedbar " speedbar-version)
+ case-fold-search nil
+ buffer-read-only t)
(speedbar-set-mode-line-format)
;; Add in our dframe hooks.
(if speedbar-track-mouse-flag
(setq dframe-track-mouse-function #'speedbar-track-mouse))
(setq dframe-help-echo-function #'speedbar-item-info
dframe-mouse-click-function #'speedbar-click
- dframe-mouse-position-function #'speedbar-position-cursor-on-line)
- (run-hooks 'speedbar-mode-hook))
+ dframe-mouse-position-function #'speedbar-position-cursor-on-line))
speedbar-buffer)
(defmacro speedbar-message (fmt &rest args)
(if (looking-at "\\s-*[[<({].[]>)}] ") (goto-char (match-end 0)))
;; Get the text
(speedbar-message "Text: %s" (buffer-substring-no-properties
- (point) (progn (end-of-line) (point))))))
+ (point) (line-end-position)))))
(defun speedbar-item-info ()
"Display info in the minibuffer about the button the mouse is over.
Return nil if not applicable."
(save-excursion
(beginning-of-line)
- (if (re-search-forward " [-+=]?> \\([^\n]+\\)"
- (save-excursion(end-of-line)(point)) t)
+ (if (re-search-forward " [-+=]?> \\([^\n]+\\)" (line-end-position) t)
(let* ((tag (match-string 1))
(attr (speedbar-line-token))
(item nil)
(looking-at "\\([0-9]+\\):")
(setq item (file-name-nondirectory (speedbar-line-directory)))
(speedbar-message "Tag: %s in %s" tag item)))
- (if (re-search-forward "{[+-]} \\([^\n]+\\)$"
- (save-excursion(end-of-line)(point)) t)
+ (if (re-search-forward "{[+-]} \\([^\n]+\\)$" (line-end-position) t)
(speedbar-message "Group of tags \"%s\"" (match-string 1))
(if (re-search-forward " [+-]?[()|@] \\([^\n]+\\)$" nil t)
(let* ((detailtext (match-string 1))
(if (speedbar-y-or-n-p (format "Delete %s? " f) t)
(progn
(if (file-directory-p f)
- (delete-directory f)
- (delete-file f))
+ (delete-directory f t t)
+ (delete-file f t))
(speedbar-message "Okie dokie.")
(let ((p (point)))
(speedbar-refresh)
(speedbar-enable-update)))
(defun speedbar-toggle-images ()
- "Toggle use of images in the speedbar frame.
-Images are not available in Emacs 20 or earlier."
+ "Toggle use of images in the speedbar frame."
(interactive)
(setq speedbar-use-images (not speedbar-use-images))
(speedbar-refresh))
"Change the expansion button character to CHAR for the current line."
(save-excursion
(beginning-of-line)
- (if (re-search-forward ":\\s-*.\\([-+?]\\)" (save-excursion (end-of-line)
- (point)) t)
+ (if (re-search-forward ":\\s-*.\\([-+?]\\)" (line-end-position) t)
(speedbar-with-writable
(goto-char (match-end 1))
(insert-char char 1 t)
(speedbar-with-writable
(save-excursion
(if (and replace-this
- (re-search-forward replace-this (save-excursion (end-of-line)
- (point))
- t))
+ (re-search-forward replace-this (line-end-position) t))
(delete-region (match-beginning 0) (match-end 0))))
(end-of-line)
(if (not (string= " " indicator-string))
(fn (buffer-substring-no-properties
;; Skip-chars: thanks ptype@dra.hmg.gb
(point) (progn
- (skip-chars-forward "^ "
- (save-excursion (end-of-line)
- (point)))
+ (skip-chars-forward "^ " (line-end-position))
(point))))
(fulln (concat f fn)))
(if (<= 2 speedbar-verbosity-level)
(fn (buffer-substring-no-properties
;; Skip-chars: thanks ptype@dra.hmg.gb
(point) (progn
- (skip-chars-forward "^ "
- (save-excursion (end-of-line)
- (point)))
+ (skip-chars-forward "^ " (line-end-position))
(point))))
(fulln (concat f fn)))
(if (<= 2 speedbar-verbosity-level)
;; If this fails, then it is a non-standard click, and as such,
;; perfectly allowed.
(if (re-search-forward "[]>?}] [^ ]"
- (save-excursion (end-of-line) (point))
+ (line-end-position)
t)
(progn
(forward-char -1)
(condition-case nil
(progn
(re-search-forward ":\\s-*.\\+. "
- (save-excursion (end-of-line) (point)))
+ (line-end-position))
(forward-char -2)
(speedbar-do-function-pointer))
(error (speedbar-position-cursor-on-line)))))
(condition-case nil
(progn
(re-search-forward ":\\s-*.-. "
- (save-excursion (end-of-line) (point)))
+ (line-end-position))
(forward-char -2)
(speedbar-do-function-pointer))
(error (speedbar-position-cursor-on-line))))
(condition-case nil
(progn
(re-search-forward ":\\s-*.[-+]. "
- (save-excursion (end-of-line) (point)))
+ (line-end-position))
(forward-char -2)
(speedbar-do-function-pointer))
(error (speedbar-position-cursor-on-line))))
regular expression EXPR."
(let* ((sym (if (stringp expr)
(if (save-excursion
- (re-search-forward expr (save-excursion
- (end-of-line)
- (point)) t))
+ (re-search-forward expr (line-end-position) t))
(buffer-substring-no-properties (match-beginning 1)
(match-end 1)))
(funcall expr)))
(pos (let ((j (re-search-forward "[\C-?\C-a]\\([0-9]+\\),\\([0-9]+\\)"
- (save-excursion
- (end-of-line)
- (point))
- t)))
+ (line-end-position) t)))
(if (and j sym)
(1+ (string-to-number (buffer-substring-no-properties
(match-beginning 2)
(defun speedbar-parse-c-or-c++tag ()
"Parse a C or C++ tag, which tends to be a little complex."
(save-excursion
- (let ((bound (save-excursion (end-of-line) (point))))
+ (let ((bound (line-end-position)))
(cond ((re-search-forward "\C-?\\([^\C-a]+\\)\C-a" bound t)
(buffer-substring-no-properties (match-beginning 1)
(match-end 1)))
(defun speedbar-parse-tex-string ()
"Parse a Tex string. Only find data which is relevant."
(save-excursion
- (let ((bound (save-excursion (end-of-line) (point))))
+ (let ((bound (line-end-position)))
(cond ((re-search-forward "\\(\\(sub\\)*section\\|chapter\\|cite\\)\\s-*{[^\C-?}]*}?" bound t)
(buffer-substring-no-properties (match-beginning 0)
(match-end 0)))
(let* ((bn (speedbar-line-text))
(buffer (if bn (get-buffer bn))))
(if buffer
- (if (save-excursion
- (end-of-line)
- (eq start (point)))
+ (if (eq start (line-end-position))
(or (with-current-buffer buffer default-directory)
"")
(buffer-file-name buffer))))))))
(beginning-of-line)
;; If this fails, then it is a non-standard click, and as such,
;; perfectly allowed
- (if (re-search-forward "[]>?}] [^ ]"
- (save-excursion (end-of-line) (point))
- t)
+ (if (re-search-forward "[]>?}] [^ ]" (line-end-position) t)
(let ((text (progn
(forward-char -1)
- (buffer-substring (point) (save-excursion
- (end-of-line)
- (point))))))
+ (buffer-substring (point) (line-end-position)))))
(if (get-buffer text)
(progn
(set-buffer text)
"Highlight the current line, unhighlighting a previously jumped to line."
(speedbar-unhighlight-one-tag-line)
(setq speedbar-highlight-one-tag-line
- (speedbar-make-overlay (save-excursion (beginning-of-line) (point))
- (save-excursion (end-of-line)
- (forward-char 1)
- (point))))
+ (speedbar-make-overlay (line-beginning-position)
+ (1+ (line-end-position))))
(speedbar-overlay-put speedbar-highlight-one-tag-line 'face
'speedbar-highlight-face)
- (add-hook 'pre-command-hook 'speedbar-unhighlight-one-tag-line)
- )
+ (add-hook 'pre-command-hook 'speedbar-unhighlight-one-tag-line))
(defun speedbar-unhighlight-one-tag-line ()
"Unhighlight the currently highlighted line."
;; run load-time hooks
(run-hooks 'speedbar-load-hook)
-;; arch-tag: 4477e6d1-f78c-48b9-a503-387d3c9767d5
;;; speedbar ends here