X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/68e7476278a3dc4bd13dab63cc23bc0e671e5525..58635e4de85621d4f16befe15b1df44a637bd078:/lisp/progmodes/ebrowse.el diff --git a/lisp/progmodes/ebrowse.el b/lisp/progmodes/ebrowse.el index eaeabe58aa..d674484345 100644 --- a/lisp/progmodes/ebrowse.el +++ b/lisp/progmodes/ebrowse.el @@ -1,8 +1,6 @@ ;;; ebrowse.el --- Emacs C++ class browser & tags facility -;; Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -;; 2002, 2003, 2004, 2005, 2006, 2007, 2008 -;; Free Software Foundation Inc. +;; Copyright (C) 1992-2011 Free Software Foundation, Inc. ;; Author: Gerd Moellmann ;; Maintainer: FSF @@ -10,10 +8,10 @@ ;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; 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 3, or (at your option) -;; any later version. +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -21,9 +19,7 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. +;; along with GNU Emacs. If not, see . ;;; Commentary: @@ -164,8 +160,7 @@ This space is used to display markers." (t (:foreground "red"))) "*The face used for the mark character in the tree." :group 'ebrowse-faces) -;; backward-compatibility alias -(put 'ebrowse-tree-mark-face 'face-alias 'ebrowse-tree-mark) +(define-obsolete-face-alias 'ebrowse-tree-mark-face 'ebrowse-tree-mark "22.1") (defface ebrowse-root-class @@ -173,24 +168,21 @@ This space is used to display markers." (t (:weight bold :foreground "blue"))) "*The face used for root classes in the tree." :group 'ebrowse-faces) -;; backward-compatibility alias -(put 'ebrowse-root-class-face 'face-alias 'ebrowse-root-class) +(define-obsolete-face-alias 'ebrowse-root-class-face 'ebrowse-root-class "22.1") (defface ebrowse-file-name '((t (:italic t))) "*The face for filenames displayed in the tree." :group 'ebrowse-faces) -;; backward-compatibility alias -(put 'ebrowse-file-name-face 'face-alias 'ebrowse-file-name) +(define-obsolete-face-alias 'ebrowse-file-name-face 'ebrowse-file-name "22.1") (defface ebrowse-default '((t nil)) "*Face for everything else in the tree not having other faces." :group 'ebrowse-faces) -;; backward-compatibility alias -(put 'ebrowse-default-face 'face-alias 'ebrowse-default) +(define-obsolete-face-alias 'ebrowse-default-face 'ebrowse-default "22.1") (defface ebrowse-member-attribute @@ -198,16 +190,16 @@ This space is used to display markers." (t (:foreground "red"))) "*Face used to display member attributes." :group 'ebrowse-faces) -;; backward-compatibility alias -(put 'ebrowse-member-attribute-face 'face-alias 'ebrowse-member-attribute) +(define-obsolete-face-alias 'ebrowse-member-attribute-face + 'ebrowse-member-attribute "22.1") (defface ebrowse-member-class '((t (:foreground "purple"))) "*Face used to display the class title in member buffers." :group 'ebrowse-faces) -;; backward-compatibility alias -(put 'ebrowse-member-class-face 'face-alias 'ebrowse-member-class) +(define-obsolete-face-alias 'ebrowse-member-class-face + 'ebrowse-member-class "22.1") (defface ebrowse-progress @@ -215,8 +207,7 @@ This space is used to display markers." (t (:background "blue"))) "*Face for progress indicator." :group 'ebrowse-faces) -;; backward-compatibility alias -(put 'ebrowse-progress-face 'face-alias 'ebrowse-progress) +(define-obsolete-face-alias 'ebrowse-progress-face 'ebrowse-progress "22.1") @@ -1009,8 +1000,7 @@ HEADER is the tree header structure of the class tree." (loop for buffer in (ebrowse-browser-buffer-list) until (eq header (ebrowse-value-in-buffer 'ebrowse--header buffer)) finally do - (save-excursion - (set-buffer buffer) + (with-current-buffer buffer (ebrowse-fill-member-table)))) (ebrowse-hs-member-table header)) @@ -1124,7 +1114,7 @@ if for some reason a circle is in the inheritance graph." ;;; Tree-mode - mode for tree buffers ;;;###autoload -(defun ebrowse-tree-mode () +(define-derived-mode ebrowse-tree-mode special-mode "Ebrowse-Tree" "Major mode for Ebrowse class tree buffers. Each line corresponds to a class in a class tree. Letters do not insert themselves, they are commands. @@ -1133,54 +1123,41 @@ E.g.\\[save-buffer] writes the tree to the file it was loaded from. Tree mode key bindings: \\{ebrowse-tree-mode-map}" - (interactive) (let* ((ident (propertized-buffer-identification "C++ Tree")) - header tree buffer-read-only) + (inhibit-read-only t) + header tree) - (kill-all-local-variables) - (use-local-map ebrowse-tree-mode-map) (buffer-disable-undo) (unless (zerop (buffer-size)) (goto-char (point-min)) - (multiple-value-setq (header tree) (ebrowse-read)) + (multiple-value-setq (header tree) (values-list (ebrowse-read))) (message "Sorting. Please be patient...") (setq tree (ebrowse-sort-tree-list tree)) (erase-buffer) (message nil)) - (mapc 'make-local-variable - '(ebrowse--tags-file-name - ebrowse--indentation - ebrowse--tree - ebrowse--header - ebrowse--show-file-names-flag - 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 - major-mode 'ebrowse-tree-mode - mode-name "Ebrowse-Tree" - mode-line-buffer-identification ident - buffer-read-only t - selective-display t - selective-display-ellipses t - revert-buffer-function 'ebrowse-revert-tree-buffer-from-file - ebrowse--header header - ebrowse--tree tree - ebrowse--tags-file-name (buffer-file-name) - ebrowse--tree-obarray (and tree (ebrowse-build-tree-obarray tree)) - ebrowse--frozen-flag nil) - - (add-hook 'local-write-file-hooks 'ebrowse-write-file-hook-fn) + (set (make-local-variable 'ebrowse--show-file-names-flag) nil) + (set (make-local-variable 'ebrowse--tree-obarray) (make-vector 127 0)) + (set (make-local-variable 'ebrowse--frozen-flag) nil) + (setq mode-line-buffer-identification ident) + (setq buffer-read-only t) + (setq selective-display t) + (setq selective-display-ellipses t) + (set (make-local-variable 'revert-buffer-function) + #'ebrowse-revert-tree-buffer-from-file) + (set (make-local-variable 'ebrowse--header) header) + (set (make-local-variable 'ebrowse--tree) tree) + (set (make-local-variable 'ebrowse--tags-file-name) buffer-file-name) + (set (make-local-variable 'ebrowse--tree-obarray) + (and tree (ebrowse-build-tree-obarray tree))) + (set (make-local-variable 'ebrowse--frozen-flag) nil) + + (add-hook 'local-write-file-hooks 'ebrowse-write-file-hook-fn nil t) (modify-syntax-entry ?_ (char-to-string (char-syntax ?a))) (when tree (ebrowse-redraw-tree) - (set-buffer-modified-p nil)) - (run-mode-hooks 'ebrowse-tree-mode-hook))) + (set-buffer-modified-p nil)))) @@ -1321,7 +1298,7 @@ With PREFIX, insert that many filenames." (skip-chars-forward " \t*a-zA-Z0-9_") (setq start (point) file-name-existing (looking-at "(")) - (delete-region start (save-excursion (end-of-line) (point))) + (delete-region start (line-end-position)) (unless file-name-existing (indent-to ebrowse-source-file-column) (insert "(" (or (ebrowse-cs-file @@ -1339,7 +1316,8 @@ With PREFIX, insert that many filenames." (setf ebrowse--show-file-names-flag (not ebrowse--show-file-names-flag)) (let ((old-line (count-lines (point-min) (point)))) (ebrowse-redraw-tree) - (goto-line old-line))) + (goto-char (point-min)) + (forward-line (1- old-line)))) @@ -1347,6 +1325,7 @@ With PREFIX, insert that many filenames." (defun ebrowse-member-buffer-p (buffer) "Value is non-nil if BUFFER is a member buffer." + ;; FIXME: Why not (buffer-local-value 'major-mode buffer)? (eq (cdr (assoc 'major-mode (buffer-local-variables buffer))) 'ebrowse-member-mode)) @@ -1466,12 +1445,13 @@ Pop to member buffer if no prefix ARG, to tree buffer otherwise." (defun ebrowse-set-tree-indentation () "Set the indentation width of the tree display." (interactive) - (let ((width (string-to-number (read-from-minibuffer - (concat "Indentation (" + (let ((width (string-to-number (read-string + (concat "Indentation (default " (int-to-string ebrowse--indentation) - "): "))))) + "): ") + nil nil ebrowse--indentation)))) (when (plusp width) - (setf ebrowse--indentation width) + (set (make-local-variable 'ebrowse--indentation) width) (ebrowse-redraw-tree)))) @@ -1619,8 +1599,7 @@ and (b) in the directories named in `ebrowse-search-path'." Restore frame configuration active before viewing the file, and possibly kill the viewed buffer." (let (exit-action original-frame-configuration) - (save-excursion - (set-buffer buffer) + (with-current-buffer buffer (setq original-frame-configuration ebrowse--frame-configuration exit-action ebrowse--view-exit-action)) ;; Delete the frame in which we viewed. @@ -1640,13 +1619,12 @@ The new frame is deleted when you quit viewing the file in that frame." (had-a-buf (get-file-buffer file)) (buf-to-view (find-file-noselect file))) (switch-to-buffer-other-frame buf-to-view) - (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 - (and (not had-a-buf) - (not (buffer-modified-p buf-to-view)) - 'kill-buffer)) + (set (make-local-variable 'ebrowse--frame-configuration) + old-frame-configuration) + (set (make-local-variable 'ebrowse--view-exit-action) + (and (not had-a-buf) + (not (buffer-modified-p buf-to-view)) + 'kill-buffer)) (view-mode-enter (cons (selected-window) (cons (selected-window) t)) 'ebrowse-view-exit-fn))) @@ -2014,21 +1992,16 @@ COLLAPSE non-nil means collapse the branch." (put 'ebrowse-electric-list-undefined 'suppress-keymap t) -(defun ebrowse-electric-list-mode () +(define-derived-mode ebrowse-electric-list-mode + fundamental-mode "Electric Position Menu" "Mode for electric tree list mode." - (kill-all-local-variables) - (use-local-map ebrowse-electric-list-mode-map) - (setq mode-name "Electric Position Menu" - mode-line-buffer-identification "Electric Tree Menu") + (setq mode-line-buffer-identification "Electric Tree Menu") (when (memq 'mode-name mode-line-format) (setq mode-line-format (copy-sequence mode-line-format)) (setcar (memq 'mode-name mode-line-format) "Tree Buffers")) - (make-local-variable 'Helper-return-blurb) - (setq Helper-return-blurb "return to buffer editing" - truncate-lines t - buffer-read-only t - major-mode 'ebrowse-electric-list-mode) - (run-mode-hooks 'ebrowse-electric-list-mode-hook)) + (set (make-local-variable 'Helper-return-blurb) "return to buffer editing") + (setq truncate-lines t + buffer-read-only t)) (defun ebrowse-list-tree-buffers () @@ -2234,13 +2207,8 @@ See 'Electric-command-loop' for a description of STATE and CONDITION." ;;; Member mode ;;;###autoload -(defun ebrowse-member-mode () - "Major mode for Ebrowse member buffers. - -\\{ebrowse-member-mode-map}" - (kill-all-local-variables) - (use-local-map ebrowse-member-mode-map) - (setq major-mode 'ebrowse-member-mode) +(define-derived-mode ebrowse-member-mode special-mode "Ebrowse-Members" + "Major mode for Ebrowse member buffers." (mapc 'make-local-variable '(ebrowse--decl-column ;display column ebrowse--n-columns ;number of short columns @@ -2263,8 +2231,7 @@ See 'Electric-command-loop' for a description of STATE and CONDITION." ebrowse--const-display-flag ebrowse--pure-display-flag ebrowse--frozen-flag)) ;buffer not automagically reused - (setq mode-name "Ebrowse-Members" - mode-line-buffer-identification + (setq mode-line-buffer-identification (propertized-buffer-identification "C++ Members") buffer-read-only t ebrowse--long-display-flag nil @@ -2278,8 +2245,7 @@ See 'Electric-command-loop' for a description of STATE and CONDITION." ebrowse--inline-display-flag nil ebrowse--const-display-flag nil ebrowse--pure-display-flag nil) - (modify-syntax-entry ?_ (char-to-string (char-syntax ?a))) - (run-mode-hooks 'ebrowse-member-mode-hook)) + (modify-syntax-entry ?_ (char-to-string (char-syntax ?a)))) @@ -2595,7 +2561,7 @@ TAGS-FILE-NAME is the file name of the BROWSE file." accessor (second info) member (third info)) (multiple-value-setq (tree member on-class) - (ebrowse-member-info-from-point)) + (values-list (ebrowse-member-info-from-point))) (setq accessor ebrowse--accessor)) ;; View/find class if on a line containing a class name. (when on-class @@ -3315,7 +3281,7 @@ from point as default. Value is a list (CLASS-NAME MEMBER-NAME)." (save-excursion (let* (start member-info (members (ebrowse-member-table header))) (multiple-value-bind (class-name member-name) - (ebrowse-tags-read-member+class-name) + (values-list (ebrowse-tags-read-member+class-name)) (unless member-name (error "No member name at point")) (if members @@ -3380,7 +3346,7 @@ the user choose the class to use. As a last step, a tags search is performed that positions point on the member declaration or definition." (multiple-value-bind - (tree header tree-buffer) (ebrowse-choose-tree) + (tree header tree-buffer) (values-list (ebrowse-choose-tree)) (unless tree (error "No class tree")) (let* ((marker (point-marker)) class-name @@ -3388,10 +3354,11 @@ definition." info) (unless name (multiple-value-setq (class-name name) - (ebrowse-tags-read-name - header - (concat (if view "View" "Find") " member " - (if definition "definition" "declaration") ": ")))) + (values-list + (ebrowse-tags-read-name + header + (concat (if view "View" "Find") " member " + (if definition "definition" "declaration") ": "))))) (setq info (ebrowse-tags-choose-class tree header name class-name)) (ebrowse-push-position marker info) ;; Goto the occurrence of the member @@ -3509,13 +3476,14 @@ FIX-NAME non-nil means display the buffer for that member. Otherwise read a member name from point." (interactive) (multiple-value-bind - (tree header tree-buffer) (ebrowse-choose-tree) + (tree header tree-buffer) (values-list (ebrowse-choose-tree)) (unless tree (error "No class tree")) (let* ((marker (point-marker)) class-name (name fix-name) info) (unless name (multiple-value-setq (class-name name) - (ebrowse-tags-read-name header - (concat "Find member list of: ")))) + (values-list + (ebrowse-tags-read-name header + (concat "Find member list of: "))))) (setq info (ebrowse-tags-choose-class tree header name class-name)) (ebrowse-push-position marker info) (ebrowse-tags-select/create-member-buffer tree-buffer info)))) @@ -3559,7 +3527,7 @@ The file name is read from the minibuffer." (interactive) (let* ((buffer (or (ebrowse-choose-from-browser-buffers) (error "No tree buffer"))) - (files (save-excursion (set-buffer buffer) (ebrowse-files-table))) + (files (with-current-buffer buffer (ebrowse-files-table))) (file (completing-read "List members in file: " files nil t)) (header (ebrowse-value-in-buffer 'ebrowse--header buffer)) temp-buffer-setup-hook @@ -3737,8 +3705,7 @@ TREE-BUFFER specifies the class tree we operate on." ;; on which tree (s)he wants to operate. (when initialize (let ((buffer (or tree-buffer (ebrowse-choose-from-browser-buffers)))) - (save-excursion - (set-buffer buffer) + (with-current-buffer buffer (setq ebrowse-tags-next-file-list (ebrowse-files-list (ebrowse-marked-classes-p)) ebrowse-tags-loop-last-file @@ -3821,14 +3788,14 @@ looks like a function call to the member." (interactive) ;; Choose the tree to use if there is more than one. (multiple-value-bind (tree header tree-buffer) - (ebrowse-choose-tree) + (values-list (ebrowse-choose-tree)) (unless tree (error "No class tree")) ;; Get the member name NAME (class-name is ignored). (let ((name fix-name) class-name regexp) (unless name (multiple-value-setq (class-name name) - (ebrowse-tags-read-name header "Find calls of: "))) + (values-list (ebrowse-tags-read-name header "Find calls of: ")))) ;; Set tags loop form to search for member and begin loop. (setq regexp (concat "\\<" name "[ \t]*(") ebrowse-tags-loop-form (list 're-search-forward regexp nil t)) @@ -3974,22 +3941,17 @@ Prefix arg ARG says how much." (put 'ebrowse-electric-position-undefined 'suppress-keymap t) -(defun ebrowse-electric-position-mode () +(define-derived-mode ebrowse-electric-position-mode + fundamental-mode "Electric Position Menu" "Mode for electric position buffers. Runs the hook `ebrowse-electric-position-mode-hook'." - (kill-all-local-variables) - (use-local-map ebrowse-electric-position-mode-map) - (setq mode-name "Electric Position Menu" - mode-line-buffer-identification "Electric Position Menu") + (setq mode-line-buffer-identification "Electric Position Menu") (when (memq 'mode-name mode-line-format) (setq mode-line-format (copy-sequence mode-line-format)) (setcar (memq 'mode-name mode-line-format) "Positions")) - (make-local-variable 'Helper-return-blurb) - (setq Helper-return-blurb "return to buffer editing" - truncate-lines t - buffer-read-only t - major-mode 'ebrowse-electric-position-mode) - (run-mode-hooks 'ebrowse-electric-position-mode-hook)) + (set (make-local-variable 'Helper-return-blurb) "return to buffer editing") + (setq truncate-lines t + buffer-read-only t)) (defun ebrowse-draw-position-buffer () @@ -4128,8 +4090,7 @@ Otherwise, FILE-NAME specifies the file to save the tree in." (header (copy-ebrowse-hs ebrowse--header)) (tree ebrowse--tree)) (unwind-protect - (save-excursion - (set-buffer (setq standard-output temp-buffer)) + (with-current-buffer (setq standard-output temp-buffer) (erase-buffer) (setf (ebrowse-hs-member-table header) nil) (insert (prin1-to-string header) " ") @@ -4170,7 +4131,7 @@ Otherwise, FILE-NAME specifies the file to save the tree in." (with-output-to-temp-buffer "*Tree Statistics*" (multiple-value-bind (classes member-functions member-variables static-functions static-variables) - (ebrowse-gather-statistics) + (values-list (ebrowse-gather-statistics)) (set-buffer standard-output) (erase-buffer) (insert "STATISTICS FOR TREE " (or tree-file "unknown") ":\n\n") @@ -4214,8 +4175,8 @@ NUMBER-OF-STATIC-VARIABLES:" ;;; Global key bindings -;;; The following can be used to bind key sequences starting with -;;; prefix `\C-c\C-m' to browse commands. +;; The following can be used to bind key sequences starting with +;; prefix `\C-c\C-m' to browse commands. (defvar ebrowse-global-map nil "*Keymap for Ebrowse commands.") @@ -4274,14 +4235,14 @@ NUMBER-OF-STATIC-VARIABLES:" ;;; Electric C++ browser buffer menu -;;; Electric buffer menu customization to display only some buffers -;;; (in this case Tree buffers). There is only one problem with this: -;;; If the very first character typed in the buffer menu is a space, -;;; this will select the buffer from which the buffer menu was -;;; invoked. But this buffer is not displayed in the buffer list if -;;; it isn't a tree buffer. I therefore let the buffer menu command -;;; loop read the command `p' via `unread-command-char'. This command -;;; has no effect since we are on the first line of the buffer. +;; Electric buffer menu customization to display only some buffers +;; (in this case Tree buffers). There is only one problem with this: +;; If the very first character typed in the buffer menu is a space, +;; this will select the buffer from which the buffer menu was +;; invoked. But this buffer is not displayed in the buffer list if +;; it isn't a tree buffer. I therefore let the buffer menu command +;; loop read the command `p' via `unread-command-char'. This command +;; has no effect since we are on the first line of the buffer. (defvar electric-buffer-menu-mode-hook nil) @@ -4316,7 +4277,8 @@ NUMBER-OF-STATIC-VARIABLES:" (interactive) (let* ((maxlin (count-lines (point-min) (point-max))) (n (min maxlin (+ 2 (string-to-number (this-command-keys)))))) - (goto-line n) + (goto-char (point-min)) + (forward-line (1- n)) (throw 'electric-buffer-menu-select (point)))) @@ -4491,12 +4453,11 @@ EVENT is the mouse event." (provide 'ebrowse) -;;; Local variables: -;;; eval:(put 'ebrowse-output 'lisp-indent-hook 0) -;;; eval:(put 'ebrowse-ignoring-completion-case 'lisp-indent-hook 0) -;;; eval:(put 'ebrowse-save-selective 'lisp-indent-hook 0) -;;; eval:(put 'ebrowse-for-all-trees 'lisp-indent-hook 1) -;;; End: +;; Local variables: +;; eval:(put 'ebrowse-output 'lisp-indent-hook 0) +;; eval:(put 'ebrowse-ignoring-completion-case 'lisp-indent-hook 0) +;; eval:(put 'ebrowse-save-selective 'lisp-indent-hook 0) +;; eval:(put 'ebrowse-for-all-trees 'lisp-indent-hook 1) +;; End: -;;; arch-tag: 4fa3c8bf-1771-479b-bcd7-b029c7c9677b ;;; ebrowse.el ends here