;; - A complete set of tags-like functions working on class trees
;; - An electric buffer list showing class browser buffers only
-;; Documentation is found in a separate Info file.
+;; Documentation is found in a separate Info file.
;;; Code:
;; they are defined.
member-table)
-
+
(defstruct (ebrowse-ts (:type vector) :named)
"Tree structure.
-Following the header structure, an BROWSE file contains a number
+Following the header structure, a BROWSE file contains a number
of `ebrowse-ts' structures, each one describing one root class of
the class hierarchy with all its subclasses."
;; A `ebrowse-cs' structure describing the root class.
(defvar ebrowse--frozen-flag nil
"Non-nil means an Ebrowse buffer won't be reused.
Buffer-local in Ebrowse buffers.")
-
+
(defvar ebrowse--show-file-names-flag nil
"Non-nil means show file names in a tree buffer.
"Width of a columns to display for short member display form.
Buffer-local in Ebrowse member buffers.")
-
+
(defvar ebrowse--virtual-display-flag nil
"Non-nil means display virtual members in a member buffer.
Buffer-local in Ebrowse member buffers.")
(defun ebrowse-base-classes (tree)
"Return list of base-classes of TREE by searching subclass lists.
-This function must be used instead of the struct slot
+This function must be used instead of the struct slot
`base-classes' to access the base-class list directly because it
computes this information lazily."
(or (ebrowse-ts-base-classes tree)
;;; Reading a tree from disk
(defun ebrowse-read ()
- "Read `ebrowse-hs' and `ebrowse-ts' structures in the current buffer.
+ "Read `ebrowse-hs' and `ebrowse-ts' structures in the current buffer.
Return a list (HEADER TREE) where HEADER is the file header read
and TREE is a list of `ebrowse-ts' structures forming the class tree."
(let ((header (condition-case nil
(ebrowse-tree-mode)
(current-buffer)))
-
+
(defun ebrowse-create-tree-buffer (tree tags-file header obarray pop)
"Create a new tree buffer for tree TREE.
The tree was loaded from file TAGS-FILE.
(define-key map [down-mouse-3] 'ebrowse-mouse-3-in-tree-buffer)
(define-key map [mouse-2] 'ebrowse-mouse-2-in-tree-buffer)
(define-key map [down-mouse-1] 'ebrowse-mouse-1-in-tree-buffer))
-
+
(let ((map1 (make-sparse-keymap)))
(suppress-keymap map1 t)
(define-key map "L" map1)
(interactive)
(let* ((ident (propertized-buffer-identification "C++ Tree"))
header tree buffer-read-only)
-
+
(kill-all-local-variables)
(use-local-map ebrowse-tree-mode-map)
-
+
(unless (zerop (buffer-size))
(goto-char (point-min))
(multiple-value-setq (header tree) (ebrowse-read))
(setq tree (ebrowse-sort-tree-list tree))
(erase-buffer)
(message nil))
-
+
(mapcar 'make-local-variable
'(ebrowse--tags-file-name
ebrowse--indentation
ebrowse--frozen-flag
ebrowse--tree-obarray
revert-buffer-function))
-
+
(setf ebrowse--show-file-names-flag nil
ebrowse--tree-obarray (make-vector 127 0)
ebrowse--frozen-flag nil
(ebrowse-redraw-tree)
(set-buffer-modified-p nil))
(run-hooks 'ebrowse-tree-mode-hook)))
-
+
(defun ebrowse-update-tree-buffer-mode-line ()
(condition-case error
(loop repeat (or n-times 1)
as tree = (ebrowse-tree-at-point)
- do (progn
+ do (progn
(setf (ebrowse-ts-mark tree) (not (ebrowse-ts-mark tree)))
(forward-line 1)
(push tree to-change)))
"Pop to a browser buffer from any other buffer.
Pop to member buffer if no prefix ARG, to tree buffer otherwise."
(interactive "P")
- (let ((buffer (get-buffer (if arg
+ (let ((buffer (get-buffer (if arg
ebrowse-tree-buffer-name
ebrowse-member-buffer-name))))
(unless buffer
- (setq buffer
+ (setq buffer
(get-buffer (if arg
ebrowse-member-buffer-name
ebrowse-tree-buffer-name))))
:file (ebrowse-cs-file class)
:point (ebrowse-cs-point class))))
(ebrowse-view/find-file-and-search-pattern
- browse-struct
+ browse-struct
(list ebrowse--header class nil)
file
ebrowse--tags-file-name
(make-local-variable 'ebrowse--frame-configuration)
(setq ebrowse--frame-configuration old-frame-configuration)
(make-local-variable 'ebrowse--view-exit-action)
- (setq ebrowse--view-exit-action
+ (setq ebrowse--view-exit-action
(and (not had-a-buf)
(not (buffer-modified-p buf-to-view))
'kill-buffer))
INFO is a list (HEADER MEMBER-OR-CLASS ACCESSOR). HEADER is the
header structure of a class tree. MEMBER-OR-CLASS is either an
`ebrowse-ms' or `ebrowse-cs' structure depending on what is searched.
-ACCESSOR is an accessor function for the member list of an member
+ACCESSOR is an accessor function for the member list of a member
if MEMBER-OR-CLASS is an `ebrowse-ms'.
FILE is the file to search the member in.
FILE is not taken out of STRUC here because the filename in STRUC
(defun ebrowse-class-declaration-regexp (name)
- "Construct a regexp for a declaration of class NAME."
+ "Construct a regexp for a declaration of class NAME."
(concat "^[ \t]*\\(template[ \t\n]*<.*>\\)?"
"[ \t\n]*\\(class\\|struct\\|union\\).*\\S_"
(ebrowse-symbol-regexp name)
start-of-class-name end-of-class-name)
;; Insert mark
(insert (if (ebrowse-ts-mark tree) ">" " "))
-
+
;; Indent and insert class name
(indent-to (+ (* level ebrowse--indentation)
ebrowse-tree-left-margin))
(setq start (point))
(insert (ebrowse-qualified-class-name class))
-
+
;; If template class, add <>
(when (ebrowse-template-p class)
(insert "<>"))
(define-key map1 "d" 'ebrowse-switch-member-buffer-to-derived-class)
(define-key map1 "n" 'ebrowse-switch-member-buffer-to-next-sibling-class)
(define-key map1 "p" 'ebrowse-switch-member-buffer-to-previous-sibling-class))
-
+
(let ((map1 (make-sparse-keymap)))
(suppress-keymap map1 t)
(define-key map "D" map1)
(define-key map1 "l" 'ebrowse-toggle-long-short-display)
(define-key map1 "r" 'ebrowse-toggle-regexp-display)
(define-key map1 "w" 'ebrowse-set-member-buffer-column-width))
-
+
(let ((map1 (make-sparse-keymap)))
(suppress-keymap map1 t)
(define-key map "F" map1)
(define-key map1 "p" 'ebrowse-toggle-pure-member-filter)
(define-key map1 "r" 'ebrowse-remove-all-member-filters)
(define-key map1 "v" 'ebrowse-toggle-virtual-member-filter))
-
+
(let ((map1 (make-sparse-keymap)))
(suppress-keymap map1 t)
(define-key map "L" map1)
(define-key map1 "t" 'ebrowse-display-types-member-list)
(define-key map1 "v" 'ebrowse-display-variables-member-list)
(define-key map1 "V" 'ebrowse-display-static-variables-member-list))
-
+
(let ((map1 (make-sparse-keymap)))
(suppress-keymap map1 t)
(define-key map "G" map1)
(define-key map1 "m" 'ebrowse-goto-visible-member/all-member-lists)
(define-key map1 "n" 'ebrowse-repeat-member-search)
(define-key map1 "v" 'ebrowse-goto-visible-member))
-
+
(define-key map "f" 'ebrowse-find-member-declaration)
(define-key map "m" 'ebrowse-switch-to-next-member-buffer)
(define-key map "q" 'bury-buffer)
the class cursor is on."
(let ((start (point))
(tree (or class ebrowse--displayed-class))
- class-name-start
+ class-name-start
class-name-end)
(insert "class ")
(setq class-name-start (point))
(indent-to (* i column-width))
(put-text-property start-of-column (point) 'mouse-face nil)
(setq start-of-entry (point))
- ;; Show various attributes
+ ;; Show various attributes
(when ebrowse--attributes-flag
(insert "<")
(ebrowse-draw-member-attributes member)
Prefix arg ARG says which class should be displayed. Default is
the first derived class."
(interactive "P")
- (flet ((ebrowse-tree-obarray-as-alist ()
+ (flet ((ebrowse-tree-obarray-as-alist ()
(loop for s in (ebrowse-ts-subclasses
ebrowse--displayed-class)
collect (cons (ebrowse-cs-name
["Find in Tree" ebrowse-goto-visible-member/all-member-lists
:help "Search for a member in any class"
:active t])
- ("Display"
+ ("Display"
["Inherited" ebrowse-toggle-base-class-display
:help "Toggle display of inherited members"
:style toggle
:active (eq (get-text-property (point) 'ebrowse-what) 'class-name)]))
-(easy-menu-define
+(easy-menu-define
ebrowse-member-name-object-menu ebrowse-member-mode-map
"Object menu for member names"
'("Ebrowse"
NAME is the name of the member.
Value is an alist of elements (CLASS-NAME . (CLASS LIST NAME)),
where each element describes one occurrence of member NAME in the tree.
-CLASS-NAME is the qualified name of the class in which the
+CLASS-NAME is the qualified name of the class in which the
member was found. The CDR of the acons is described in function
`ebrowse-class/index/member-for-member'."
(let ((table (ebrowse-member-table tree-header))
;; matches! It returns the name as a string.
(unless (setq member-info (gethash name members))
(if (y-or-n-p "No exact match found. Try substrings? ")
- (setq name
- (or (first (ebrowse-list-of-matching-members
+ (setq name
+ (or (first (ebrowse-list-of-matching-members
members (regexp-quote name) name))
(error "Sorry, nothing found")))
(error "Canceled")))
TREE is the class of the member to display.
ACCESSOR is the accessor symbol of its member list.
MEMBER is the member structure.
-KIND is a an additional string printed in the buffer."
+KIND is an additional string printed in the buffer."
(let* ((tree (first info))
(globals-p (ebrowse-globals-tree-p tree)))
(unless globals-p
;;;###autoload
(defun* ebrowse-tags-complete-symbol (prefix)
"Perform completion on the C++ symbol preceding point.
-A second call of this function without changing point inserts the next match.
+A second call of this function without changing point inserts the next match.
A call with prefix PREFIX reads the symbol to insert from the minibuffer with
completion."
(interactive "P")
(t
(delete-region begin end)
(insert completion)
-
+
(setf ebrowse-last-completion-location (point)
ebrowse-last-completion-start pattern
ebrowse-last-completion completion
(defun ebrowse-tags-query-replace (from to)
"Query replace FROM with TO in all files of a class tree.
With prefix arg, process files of marked classes only."
- (interactive
+ (interactive
"sTree query replace (regexp): \nsTree query replace %s by: ")
(setq ebrowse-tags-loop-form
(list 'and (list 'save-excursion
(t
(unwind-protect
(progn
- (push (function
+ (push (function
(lambda ()
(goto-char (ebrowse-position-point position))))
view-mode-hook)
:file-name (buffer-file-name (marker-buffer marker))
:point (marker-position marker)
:target target
- :info info)
+ :info info)
ebrowse-position-stack))))
(easy-menu-define
- ebrowse-tree-buffer-class-object-menu ebrowse-tree-mode-map
+ ebrowse-tree-buffer-class-object-menu ebrowse-tree-mode-map
"Object menu for classes in the tree buffer"
'("Class"
["Functions" ebrowse-tree-command:show-member-functions
(easy-menu-define
- ebrowse-tree-buffer-object-menu ebrowse-tree-mode-map
+ ebrowse-tree-buffer-object-menu ebrowse-tree-mode-map
"Object menu for tree buffers"
'("Ebrowse"
["Filename Display" ebrowse-toggle-file-name-display