annotate lisp/etags.el @ 221:6c0ae1f9357f r20-4b9

Import from CVS: tag r20-4b9
author cvs
date Mon, 13 Aug 2007 10:10:02 +0200
parents 262b8bb4a523
children 2c611d1463a6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
217
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1 ;;; etags.el --- etags facility for Emacs
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
2
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
3 ;; Copyright 1985, 1986, 1988, 1990 Free Software Foundation, Inc.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
4
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
5 ;; Keywords: tools
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
6
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
7 ;; This file is part of XEmacs.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
8
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
9 ;; GNU Emacs is distributed in the hope that it will be useful,
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
10 ;; but WITHOUT ANY WARRANTY. No author or distributor
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
11 ;; accepts responsibility to anyone for the consequences of using it
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
12 ;; or for whether it serves any particular purpose or works at all,
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
13 ;; unless he says so in writing. Refer to the GNU Emacs General Public
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
14 ;; License for full details.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
15
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
16 ;; Everyone is granted permission to copy, modify and redistribute
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
17 ;; GNU Emacs, but only under the conditions described in the
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
18 ;; GNU Emacs General Public License. A copy of this license is
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
19 ;; supposed to have been given to you along with GNU Emacs so you
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
20 ;; can know your rights and responsibilities. It should be in a
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
21 ;; file named COPYING. Among other things, the copyright notice
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
22 ;; and this notice must be preserved on all copies.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
23
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
24 ;;; Synched up with: Not synched with FSF. (This file is almost
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
25 ;;; completely different from FSF's etags.el. It appears that an
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
26 ;;; early version of this file (tags.el) was rewritten by two
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
27 ;;; different people; we got one, FSF got the other. Various
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
28 ;;; people have said that our version is better and faster.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
29
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
30
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
31 ;; TODO:
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
32 ;; 1. place cursor in echo area while searching
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
33 ;; 2. document!
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
34 ;; 3. determine semantics of interactively setting the tags file for a buffer
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
35
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
36 ;; Comments with **** mean something is left to be done.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
37
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
38 ;; Derived from the original lisp/tags.el.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
39
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
40 ;; Ideas and code from the work of the following people:
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
41 ;; Andy Norman <ange@hplb.hpl.hp.com>, author of ange-tags.el
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
42 ;; Ramana Rao <rao@arisia.xerox.com>
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
43 ;; John Sturdy <jcgs@harlqn.co.uk>, author of tags-helper.el
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
44 ;; Henry Kautz <kautz@allegra.att.com>, author of tag-completion.el
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
45 ;; Dan LaLiberte <liberte@cs.uiuc.edu>, author of local-tags.el
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
46 ;; Tom Dietterich <tgd@turing.cs.orst.edu>, author of quest.el
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
47 ;; The author(s) of lisp/simple.el
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
48 ;; Duke Briscoe <briscoe@cs.yale.edu>
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
49 ;; Lynn Slater <lrs@indetech.com>, author of location.el
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
50 ;; Shinichirou Sugou <shin@sgtp.apple.juice.or.jp>
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
51 ;; an unidentified anonymous elisp hacker
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
52 ;; Kyle Jones <kyle_jones@wonderworks.com>
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
53 ;; added "Exact match, then inexact" code
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
54 ;; added support for include directive.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
55
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
56
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
57 ;; Auxiliary functions
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
58
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
59 (defun tags-delete (item list)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
60 "Delete the item from the list, testing with equal. Copies the list."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
61 (delete item (copy-list list)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
62
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
63 (defun tags-remove-duplicates (list)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
64 "Delete equal duplicates from the list; copies the list."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
65 (let (res)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
66 (dolist (el list)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
67 (unless (member el res)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
68 (push el res)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
69 (nreverse res)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
70
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
71
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
72 ;; Tag tables for a buffer
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
73
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
74 (defgroup etags nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
75 "Etags facility for Emacs"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
76 :prefix "tags-"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
77 :group 'tools)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
78
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
79
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
80 ;;;###autoload
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
81 (defcustom tags-build-completion-table 'ask
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
82 "*If this variable is nil, then tags completion is disabled.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
83 If this variable is t, then things which prompt for tags will do so with
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
84 completion across all known tags.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
85 If this variable is the symbol `ask', then you will be asked whether each
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
86 tags table should be added to the completion list as it is read in.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
87 (With the exception that for very small tags tables, you will not be asked,
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
88 since they can be parsed quickly.)"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
89 :type '(radio (const :tag "Disabled" nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
90 (const :tag "Complete All" t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
91 (const :tag "Ask" ask))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
92 :group 'etags)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
93
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
94 ;;;###autoload
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
95 (defcustom tags-always-exact nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
96 "*If this variable is non-nil, then tags always looks for exact matches."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
97 :type 'boolean
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
98 :group 'etags)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
99
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
100 ;;;###autoload
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
101 (defcustom tag-table-alist nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
102 "*A list which determines which tags files are active for a buffer.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
103 This is not really an association list, in that all elements are
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
104 checked. The CAR of each element of this list is a pattern against
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
105 which the buffer's file name is compared; if it matches, then the CDR
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
106 of the list should be the name of the tags table to use. If more than
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
107 one element of this list matches the buffer's file name, then all of
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
108 the associated tags tables will be used. Earlier ones will be
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
109 searched first.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
110
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
111 If the CAR of elements of this list are strings, then they are treated
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
112 as regular-expressions against which the file is compared (like the
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
113 auto-mode-alist). If they are not strings, then they are evaluated.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
114 If they evaluate to non-nil, then the current buffer is considered to
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
115 match.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
116
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
117 If the CDR of the elements of this list are strings, then they are
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
118 assumed to name a TAGS file. If they name a directory, then the string
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
119 \"TAGS\" is appended to them to get the file name. If they are not
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
120 strings, then they are evaluated, and must return an appropriate string.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
121
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
122 For example:
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
123 (setq tag-table-alist
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
124 '((\"/usr/src/public/perl/\" . \"/usr/src/public/perl/perl-3.0/\")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
125 (\"\\\\.el$\" . \"/usr/local/emacs/src/\")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
126 (\"/jbw/gnu/\" . \"/usr15/degree/stud/jbw/gnu/\")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
127 (\"\" . \"/usr/local/emacs/src/\")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
128 ))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
129
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
130 This means that anything in the /usr/src/public/perl/ directory should use
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
131 the TAGS file /usr/src/public/perl/perl-3.0/TAGS; and file ending in .el should
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
132 use the TAGS file /usr/local/emacs/src/TAGS; and anything in or below the
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
133 directory /jbw/gnu/ should use the TAGS file /usr15/degree/stud/jbw/gnu/TAGS.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
134 A file called something like \"/usr/jbw/foo.el\" would use both the TAGS files
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
135 /usr/local/emacs/src/TAGS and /usr15/degree/stud/jbw/gnu/TAGS (in that order)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
136 because it matches both patterns.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
137
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
138 If the buffer-local variable `buffer-tag-table' is set, then it names a tags
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
139 table that is searched before all others when find-tag is executed from this
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
140 buffer.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
141
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
142 If there is a file called \"TAGS\" in the same directory as the file in
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
143 question, then that tags file will always be used as well (after the
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
144 `buffer-tag-table' but before the tables specified by this list.)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
145
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
146 If the variable tags-file-name is set, then the tags file it names will apply
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
147 to all buffers (for backwards compatibility.) It is searched first.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
148 "
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
149 :type '(repeat (cons (choice :value ""
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
150 (regexp :tag "Buffer regexp")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
151 (function :tag "Expression"))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
152 (string :tag "Tag file or directory")))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
153 :group 'etags)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
154
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
155 (defvar buffer-tag-table nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
156 "*The additional name of one TAGS table to be used for this buffer.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
157 You can set this with meta-x set-buffer-tag-table. See the documentation
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
158 for the variable `tag-table-alist' for more information.")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
159 (make-variable-buffer-local 'buffer-tag-table)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
160
219
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
161 (defvar tags-file-name nil
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
162 "The name of the tags-table used by all buffers.
217
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
163 This is for backwards compatibility, and is largely supplanted by the
219
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
164 variable tag-table-alist.")
217
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
165
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
166
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
167 ;; XEmacs change: added tags-auto-read-changed-tag-files
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
168 (defcustom tags-auto-read-changed-tag-files nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
169 "*If non-nil, always re-read changed TAGS file without prompting, if nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
170 then prompt if changed TAGS file should be re-read."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
171 :type 'boolean
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
172 :group 'etags)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
173
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
174 (defun buffer-tag-table-list ()
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
175 "Returns a list (ordered) of the tags tables which should be used for
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
176 the current buffer."
219
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
177 (let (result)
217
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
178 (when buffer-tag-table
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
179 (push buffer-tag-table result))
219
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
180 ;; Current directory
217
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
181 (when (file-readable-p (concat default-directory "TAGS"))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
182 (push (concat default-directory "TAGS") result))
219
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
183 ;; Parent directory
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
184 (let ((parent-tag-file (expand-file-name "../TAGS" default-directory)))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
185 (when (file-readable-p parent-tag-file)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
186 (push parent-tag-file result)))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
187 ;; tag-table-alist
217
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
188 (let ((key (or buffer-file-name
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
189 (concat default-directory (buffer-name))))
219
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
190 expression)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
191 (dolist (item tag-table-alist)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
192 (setq expression (car item))
217
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
193 ;; If the car of the alist item is a string, apply it as a regexp
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
194 ;; to the buffer-file-name. Otherwise, evaluate it. If the
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
195 ;; regexp matches, or the expression evaluates non-nil, then this
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
196 ;; item in tag-table-alist applies to this buffer.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
197 (when (if (stringp expression)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
198 (string-match expression key)
219
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
199 (ignore-errors
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
200 (eval expression)))
217
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
201 ;; Now evaluate the cdr of the alist item to get the name of
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
202 ;; the tag table file.
219
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
203 (setq expression (ignore-errors
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
204 (eval (cdr item))))
217
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
205 (if (stringp expression)
219
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
206 (push expression result)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
207 (error "Expression in tag-table-alist evaluated to non-string")))))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
208 (setq result
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
209 (mapcar
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
210 (lambda (name)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
211 (when (file-directory-p name)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
212 (setq name (concat (file-name-as-directory name) "TAGS")))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
213 (and (file-readable-p name)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
214 ;; get-tag-table-buffer has side-effects
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
215 (symbol-value-in-buffer 'buffer-file-name
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
216 (get-tag-table-buffer name))))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
217 result))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
218 (setq result (delq nil result))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
219 ;; #### tags-file-name is *evil*.
217
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
220 (or result tags-file-name
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
221 (call-interactively 'visit-tags-table))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
222 (when tags-file-name
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
223 (setq result (nconc result (list tags-file-name))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
224 (or result (error "Buffer has no associated tag tables"))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
225 (tags-remove-duplicates (nreverse result))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
226
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
227 ;;;###autoload
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
228 (defun visit-tags-table (file)
219
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
229 "Tell tags commands to use tags table file FILE when all else fails.
217
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
230 FILE should be the name of a file created with the `etags' program.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
231 A directory name is ok too; it means file TAGS in that directory."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
232 (interactive (list (read-file-name "Visit tags table: (default TAGS) "
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
233 default-directory
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
234 (expand-file-name "TAGS" default-directory)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
235 t)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
236 (if (string-equal file "")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
237 (setq tags-file-name nil)
219
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
238 (setq file (expand-file-name file))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
239 (when (file-directory-p file)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
240 (setq file (expand-file-name "TAGS" file)))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
241 ;; It used to be that, if a user pressed RET by mistake, the bogus
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
242 ;; `tags-file-name' would remain, causing the error at
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
243 ;; `buffer-tag-table'.
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
244 (when (file-readable-p file)
217
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
245 (setq tags-file-name file))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
246
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
247 (defun set-buffer-tag-table (file)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
248 "In addition to the tags tables specified by the variable `tag-table-alist',
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
249 each buffer can have one additional table. This command sets that.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
250 See the documentation for the variable `tag-table-alist' for more information."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
251 (interactive
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
252 (list
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
253 (read-file-name "Visit tags table: (directory sufficient) "
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
254 nil default-directory t)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
255 (or file (error "No TAGS file name supplied"))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
256 (setq file (expand-file-name file))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
257 (when (file-directory-p file)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
258 (setq file (concat file "TAGS")))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
259 (or (file-exists-p file) (error "TAGS file missing: %s" file))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
260 (setq buffer-tag-table file))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
261
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
262
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
263 ;; Manipulating the tag table buffer
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
264
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
265 (defconst tag-table-completion-status nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
266 "Indicates whether a completion table has been built, or has explicitly not
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
267 been built. this is nil, t, or 'disabled.")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
268 (make-variable-buffer-local 'tag-table-completion-status)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
269
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
270 (defcustom make-tags-files-invisible nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
271 "*If non-nil, TAGS-files will not show up in buffer-lists or be
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
272 selectable (or deletable.)"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
273 :type 'boolean
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
274 :group 'etags)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
275
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
276 (defconst tag-table-files nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
277 "If the current buffer is a TAGS table, this holds a list of the files
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
278 referenced by this file, or nil if that hasn't been computed yet.")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
279 (make-variable-buffer-local 'tag-table-files)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
280
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
281 (defun get-tag-table-buffer (tag-table)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
282 "Returns a buffer visiting the given TAGS table, reverting if appropriate,
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
283 and possibly building a completion-table."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
284 (or (stringp tag-table)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
285 (error "Bad tags file name supplied: %s" tag-table))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
286 ;; add support for removing symbolic links from name
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
287 (if (fboundp 'symlink-expand-file-name)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
288 (setq tag-table (symlink-expand-file-name tag-table)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
289 (let (buf build-completion check-name)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
290 (setq buf (get-file-buffer tag-table))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
291 (or buf
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
292 (if (file-readable-p tag-table)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
293 (setq buf (find-file-noselect tag-table)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
294 check-name t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
295 (error "No such tags file: %s" tag-table)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
296 (with-current-buffer buf
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
297 ;; make the TAGS buffer invisible
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
298 (when (and check-name
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
299 make-tags-files-invisible
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
300 (string-match "\\`[^ ]" (buffer-name)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
301 (rename-buffer (generate-new-buffer-name
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
302 (concat " " (buffer-name)))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
303 (or (verify-visited-file-modtime buf)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
304 ;; XEmacs change: added tags-auto-read-changed-tag-files
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
305 (cond ((or tags-auto-read-changed-tag-files (yes-or-no-p
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
306 (format "Tags file %s has changed, read new contents? "
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
307 tag-table)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
308 (when tags-auto-read-changed-tag-files
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
309 (message "Tags file %s has changed, reading new contents..."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
310 tag-table))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
311 (revert-buffer t t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
312 (if (eq tag-table-completion-status t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
313 (setq tag-table-completion-status nil))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
314 (setq tag-table-files nil))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
315 (or (eq (char-after 1) ?\f)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
316 (error "File %s not a valid tags file" tag-table))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
317 (or (memq tag-table-completion-status '(t disabled))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
318 (setq build-completion t))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
319 (and build-completion
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
320 (if (cond
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
321 ((eq tags-build-completion-table nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
322 nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
323 ((eq tags-build-completion-table t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
324 t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
325 ((eq tags-build-completion-table 'ask)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
326 ;; don't bother asking for small ones
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
327 (or (< (buffer-size) 20000)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
328 (y-or-n-p
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
329 (format "Build tag completion table for %s? "
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
330 tag-table))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
331 (t (error
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
332 "tags-build-completion-table is not t, nil, or ask.")))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
333 (condition-case nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
334 (progn
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
335 (add-to-tag-completion-table)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
336 (setq tag-table-completion-status t))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
337 ;; Allow user to C-g out correctly
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
338 (quit
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
339 (setq tag-table-completion-status nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
340 (setq quit-flag t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
341 (eval t)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
342 (setq tag-table-completion-status 'disabled))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
343 buf))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
344
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
345 (defun file-of-tag ()
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
346 "Return the file name of the file whose tags point is within.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
347 Assumes the tag table is the current buffer.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
348 File name returned is relative to tag table file's directory."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
349 (let ((opoint (point))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
350 prev size)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
351 (save-excursion
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
352 (goto-char (point-min))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
353 (while (< (point) opoint)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
354 (forward-line 1)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
355 (end-of-line)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
356 (skip-chars-backward "^,\n")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
357 (setq prev (point)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
358 size (read (current-buffer)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
359 (goto-char prev)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
360 (forward-line 1)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
361 ;; New include syntax
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
362 ;; filename,include
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
363 ;; tacked on to the end of a tag file means use filename
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
364 ;; as a tag file before giving up.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
365 ;; Skip it here.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
366 (if (not (eq size 'include))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
367 (forward-char size)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
368 (goto-char (1- prev))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
369 (buffer-substring (point) (point-at-bol)))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
370
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
371 (defun tag-table-include-files ()
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
372 "Return all file names associated with `include' directives in a tag buffer."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
373 ;; New include syntax
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
374 ;; filename,include
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
375 ;; tacked on to the end of a tag file means use filename as a
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
376 ;; tag file before giving up.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
377 (let ((files nil))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
378 (save-excursion
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
379 (goto-char (point-min))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
380 (while (re-search-forward "\f\n\\(.*\\),include$" nil t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
381 (setq files (cons (match-string 1) files))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
382 files ))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
383
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
384 (defun tag-table-files (tag-table)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
385 "Returns a list of the files referenced by the named TAGS table."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
386 (with-current-buffer (get-tag-table-buffer tag-table)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
387 (or tag-table-files
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
388 (let (files prev size)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
389 (goto-char (point-min))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
390 (while (not (eobp))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
391 (forward-line 1)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
392 (end-of-line)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
393 (skip-chars-backward "^,\n")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
394 (setq prev (point)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
395 size (read (current-buffer)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
396 (goto-char prev)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
397 (push (expand-file-name (buffer-substring (1- (point))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
398 (point-at-bol))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
399 default-directory)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
400 files)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
401 (forward-line 1)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
402 (forward-char size))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
403 (setq tag-table-files (nreverse files))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
404 tag-table-files))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
405
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
406 ;; **** should this be on previous page?
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
407 (defun buffer-tag-table-files ()
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
408 "Returns a list of all files referenced by all TAGS tables that
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
409 this buffer uses."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
410 (apply #'nconc
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
411 (mapcar #'tag-table-files (buffer-tag-table-list))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
412
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
413
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
414 ;; Building the completion table
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
415
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
416 ;; Test cases for building completion table; must handle these properly:
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
417 ;; Lisp_Int, XSETINT, current_column 60,2282
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
418 ;; Lisp_Int, XSETINT, point>NumCharacters ? 0 : CharAt(363,9935
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
419 ;; Lisp_Int, XSETINT, point<=FirstCharacter ? 0 : CharAt(366,10108
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
420 ;; point<=FirstCharacter || CharAt(378,10630
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
421 ;; point>NumCharacters || CharAt(382,10825
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
422 ;; DEFUN ("x-set-foreground-color", Fx_set_foreground_color,191,4562
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
423 ;; DEFUN ("x-set-foreground-color", Fx_set_foreground_color,191,4562
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
424 ;; DEFUN ("*", Ftimes,1172,32079
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
425 ;; DEFUN ("/=", Fneq,1035,28839
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
426 ;; defun_internal 4199,101362
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
427 ;; int pure[PURESIZE / sizeof 53,1564
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
428 ;; char staticvec1[NSTATICS * sizeof 667,17608
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
429 ;; Date: 04 May 87 23:53:11 PDT 26,1077
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
430 ;; #define anymacroname(324,4344
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
431 ;; (define-key ctl-x-map 311,11784
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
432 ;; (define-abbrev-table 'c-mode-abbrev-table 24,1016
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
433 ;; static char *skip_white(116,3443
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
434 ;; static foo 348,11643
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
435 ;; (defun texinfo-insert-@code 91,3358
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
436 ;; (defvar texinfo-kindex)29,1105
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
437 ;; (defun texinfo-format-\. 548,18376
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
438 ;; (defvar sm::menu-kludge-y 621,22726
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
439 ;; (defvar *mouse-drag-window* 103,3642
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
440 ;; (defun simula-back-level(317,11263
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
441 ;; } DPxAC,380,14024
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
442 ;; } BM_QCB;69,2990
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
443 ;; #define MTOS_DONE\t
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
444
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
445 ;; "^[^ ]+ +\\([^ ]+\\) "
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
446
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
447 ;; void *find_cactus_segment(116,2444
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
448 ;; void *find_pdb_segment(162,3688
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
449 ;; void init_dclpool(410,10739
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
450 ;; WORD insert_draw_command(342,8881
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
451 ;; void *req_pdbmem(579,15574
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
452
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
453 (defvar tag-completion-table (make-vector 511 0))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
454
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
455 (defvar tag-symbol)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
456 (defvar tag-table-symbol)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
457 (defvar tag-symbol-tables)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
458 (defvar buffer-tag-table-list)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
459
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
460 (defmacro intern-tag-symbol (tag)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
461 `(progn
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
462 (setq tag-symbol (intern ,tag tag-completion-table)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
463 tag-symbol-tables (and (boundp tag-symbol)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
464 (symbol-value tag-symbol)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
465 (or (memq tag-table-symbol tag-symbol-tables)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
466 (set tag-symbol (cons tag-table-symbol tag-symbol-tables)))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
467
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
468 ;; Can't use "\\s " in these patterns because that will include newline
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
469 (defconst tags-DEFUN-pattern
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
470 "DEFUN[ \t]*(\"\\([^\"]+\\)\",[ \t]*\\(\\(\\sw\\|\\s_\\)+\\),\C-?")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
471 (defconst tags-array-pattern ".*[ \t]+\\([^ \[]+\\)\\[")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
472 (defconst tags-def-pattern
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
473 "\\(.*[ \t]+\\)?\\**\\(\\(\\sw\\|\\s_\\)+\\)[ ();,\t]*\C-?"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
474 ;; "\\(.*[ \t]+\\)?\\(\\(\\sw\\|\\s_\\)+\\)[ ()]*\C-?"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
475 ;; "\\(\\sw\\|\\s_\\)+[ ()]*\C-?"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
476 )
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
477 (defconst tags-file-pattern "^\f\n\\(.+\\),[0-9]+\n")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
478
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
479 (defun add-to-tag-completion-table ()
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
480 "Sucks the current buffer (a TAGS table) into the completion-table."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
481 (message "Adding %s to tags completion table..."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
482 buffer-file-name)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
483 (goto-char (point-min))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
484 (let ((tag-table-symbol (intern buffer-file-name tag-completion-table))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
485 ;; tag-table-symbol is used by intern-tag-symbol
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
486 filename file-type name name2 tag-symbol
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
487 tag-symbol-tables
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
488 (case-fold-search nil))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
489 ;; loop over the files mentioned in the TAGS file
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
490 ;; for each file, try to find its major-mode,
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
491 ;; then process tags appropriately
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
492 (while (looking-at tags-file-pattern)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
493 (goto-char (match-end 0))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
494 (setq filename (file-name-sans-versions
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
495 (buffer-substring (match-beginning 1)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
496 (match-end 1)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
497 ;; Old code used to check auto-mode-alist for the proper
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
498 ;; file-type. This is too slow, as it breaks the
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
499 ;; compiled-regexp caching, and slows the whole thing
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
500 ;; down. We'll use the shotgun approach with only two
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
501 ;; regexps.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
502 file-type (cond ((string-match "\\.\\([cC]\\|cc\\|cxx\\)\\'"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
503 filename)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
504 'c-mode)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
505 ((string-match "\\.\\(el\\|cl\\|lisp\\)\\'"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
506 filename)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
507 'lisp-mode)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
508 ((string-match "\\.scm\\'" filename)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
509 'scheme-mode)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
510 (t nil)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
511 (cond ((and (eq file-type 'c-mode)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
512 c-mode-syntax-table)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
513 (set-syntax-table c-mode-syntax-table))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
514 ((eq file-type 'lisp-mode)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
515 (set-syntax-table lisp-mode-syntax-table))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
516 (t
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
517 (set-syntax-table (standard-syntax-table))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
518 ;; clear loop variables
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
519 (setq name nil name2 nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
520 (message "%s..." filename)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
521 ;; loop over the individual tag lines
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
522 (while (not (or (eobp) (eq (following-char) ?\f)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
523 (cond ((and (eq file-type 'c-mode)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
524 (looking-at "DEFUN[ \t]"))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
525 (or (looking-at tags-DEFUN-pattern)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
526 (error "DEFUN doesn't fit pattern"))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
527 (setq name (buffer-substring (match-beginning 1)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
528 (match-end 1))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
529 name2 (buffer-substring (match-beginning 2)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
530 (match-end 2))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
531 ;;; ((looking-at "\\s ")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
532 ;;; ;; skip probably bogus entry:
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
533 ;;; )
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
534 ((and (eq file-type 'c-mode)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
535 (looking-at ".*\\["))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
536 (cond ((not (looking-at tags-array-pattern))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
537 (message "array definition doesn't fit pattern")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
538 (setq name nil))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
539 (t
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
540 (setq name (buffer-substring (match-beginning 1)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
541 (match-end 1))))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
542 ((and (eq file-type 'scheme-mode)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
543 (looking-at "\\s-*(\\s-*def\\sw*\\s-*(?\\s-*\\(\\(\\sw\\|\\s_\\|:\\)+\\))?\\s-*\C-?"))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
544 (setq name (buffer-substring (match-beginning 1)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
545 (match-end 1))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
546 ((looking-at tags-def-pattern)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
547 (setq name (buffer-substring (match-beginning 2)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
548 (match-end 2)))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
549 ;; add the tags we found to the completion table
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
550 (and name (intern-tag-symbol name))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
551 (and name2 (intern-tag-symbol name2))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
552 (forward-line 1)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
553 (or (eobp) (error "Bad TAGS file")))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
554 (message "Adding %s to tags completion table...done"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
555 buffer-file-name))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
556
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
557
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
558 ;; Interactive find-tag
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
559
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
560 (defvar find-tag-default-hook nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
561 "Function to call to create a default tag.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
562 Make it buffer-local in a mode hook. The function is called with no
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
563 arguments.")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
564
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
565 (defvar find-tag-hook nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
566 "Function to call after a hook is found.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
567 Make it buffer-local in a mode hook. The function is called with no
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
568 argsuments.")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
569
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
570 ;; Return a default tag to search for, based on the text at point.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
571 (defun find-tag-default ()
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
572 (or (and (not (memq find-tag-default-hook '(nil find-tag-default)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
573 (condition-case data
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
574 (funcall find-tag-default-hook)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
575 (error
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
576 (warn "Error in find-tag-default-hook signalled error: %s"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
577 (error-message-string data))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
578 nil)))
219
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents: 217
diff changeset
579 (symbol-near-point)))
217
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
580
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
581 ;; This function depends on the following symbols being bound properly:
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
582 ;; buffer-tag-table-list,
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
583 ;; tag-symbol-tables (value irrelevant, bound outside for efficiency)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
584 (defun tag-completion-predicate (tag-symbol)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
585 (and (boundp tag-symbol)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
586 (setq tag-symbol-tables (symbol-value tag-symbol))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
587 (catch 'found
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
588 (while tag-symbol-tables
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
589 (when (memq (car tag-symbol-tables) buffer-tag-table-list)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
590 (throw 'found t))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
591 (setq tag-symbol-tables (cdr tag-symbol-tables))))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
592
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
593 (defun buffer-tag-table-symbol-list ()
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
594 (mapcar (lambda (table-name)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
595 (intern table-name tag-completion-table))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
596 (buffer-tag-table-list)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
597
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
598 (defvar find-tag-history nil "History list for find-tag-tag")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
599
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
600 (defun find-tag-tag (prompt)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
601 (let* ((default (find-tag-default))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
602 (buffer-tag-table-list (buffer-tag-table-symbol-list))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
603 tag-symbol-tables tag-name)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
604 (setq tag-name
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
605 (completing-read
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
606 (if default
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
607 (format "%s(default %s) " prompt default)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
608 prompt)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
609 tag-completion-table 'tag-completion-predicate nil nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
610 'find-tag-history))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
611 (if (string-equal tag-name "")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
612 ;; #### - This is a really LAME way of doing it! --Stig
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
613 default ;indicate exact symbol match
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
614 tag-name)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
615
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
616 (defvar last-tag-data nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
617 "Information for continuing a tag search.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
618 Is of the form (TAG POINT MATCHING-EXACT TAG-TABLE TAG-TABLE ...).")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
619
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
620 (defvar tags-loop-operate nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
621 "Form for `tags-loop-continue' to eval to change one file.")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
622
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
623 (defvar tags-loop-scan
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
624 '(error "%s" (substitute-command-keys
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
625 "No \\[tags-search] or \\[tags-query-replace] in progress."))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
626 "Form for `tags-loop-continue' to eval to scan one file.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
627 If it returns non-nil, this file needs processing by evalling
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
628 \`tags-loop-operate'. Otherwise, move on to the next file.")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
629
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
630 (autoload 'get-symbol-syntax-table "symbol-syntax")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
631
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
632 (defun find-tag-internal (tagname)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
633 (let ((next (null tagname))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
634 (tmpnext (null tagname))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
635 ;; If tagname is a list: (TAGNAME), this indicates
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
636 ;; requiring an exact symbol match.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
637 (exact (or tags-always-exact (consp tagname)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
638 (normal-syntax-table (syntax-table))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
639 (exact-syntax-table (get-symbol-syntax-table (syntax-table)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
640 tag-table-currently-matching-exact
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
641 tag-target exact-tagname
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
642 tag-tables tag-table-point file linebeg startpos buf
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
643 offset found pat syn-tab)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
644 (if (consp tagname) (setq tagname (car tagname)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
645 (cond (next
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
646 (setq tagname (car last-tag-data))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
647 (setq tag-table-currently-matching-exact
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
648 (car (cdr (cdr last-tag-data)))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
649 (t
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
650 (setq tag-table-currently-matching-exact t)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
651 ;; \_ in the tagname is used to indicate a symbol boundary.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
652 (setq exact-tagname (concat "\\_" tagname "\\_"))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
653 (while (string-match "\\\\_" exact-tagname)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
654 (aset exact-tagname (1- (match-end 0)) ?b))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
655 (save-excursion
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
656 (catch 'found
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
657 ;; loop searching for exact matches and then inexact matches.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
658 (while (not (eq tag-table-currently-matching-exact 'neither))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
659 (cond (tmpnext
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
660 (setq tag-tables (cdr (cdr (cdr last-tag-data))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
661 (setq tag-table-point (car (cdr last-tag-data)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
662 ;; start from the beginning of the table list
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
663 ;; on the next iteration of the loop.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
664 (setq tmpnext nil))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
665 (t
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
666 (setq tag-tables (buffer-tag-table-list))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
667 (setq tag-table-point 1)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
668 (if tag-table-currently-matching-exact
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
669 (progn
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
670 (setq tag-target exact-tagname)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
671 (setq syn-tab exact-syntax-table))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
672 (setq tag-target tagname)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
673 (setq syn-tab normal-syntax-table))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
674 (with-caps-disable-folding tag-target
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
675 (while tag-tables
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
676 (set-buffer (get-tag-table-buffer (car tag-tables)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
677 (bury-buffer (current-buffer))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
678 (goto-char (or tag-table-point (point-min)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
679 (setq tag-table-point nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
680 (let ((osyn (syntax-table))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
681 case-fold-search)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
682 (unwind-protect
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
683 (progn
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
684 (set-syntax-table syn-tab)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
685 ;; **** should there be support for non-regexp
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
686 ;; tag searches?
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
687 (while (re-search-forward tag-target nil t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
688 (if (and (save-match-data
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
689 (looking-at "[^\n\C-?]*\C-?"))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
690 ;; if we're looking for inexact
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
691 ;; matches, skip exact matches
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
692 ;; since we've visited them
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
693 ;; already.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
694 (or tag-table-currently-matching-exact
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
695 (unwind-protect
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
696 (save-excursion
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
697 (set-syntax-table
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
698 exact-syntax-table)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
699 (goto-char (match-beginning 0))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
700 (not (looking-at exact-tagname)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
701 (set-syntax-table syn-tab))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
702 (throw 'found t))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
703 (set-syntax-table osyn)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
704 (setq tag-tables
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
705 (nconc (tag-table-include-files) (cdr tag-tables)))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
706 (if (and (not exact) (eq tag-table-currently-matching-exact t))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
707 (setq tag-table-currently-matching-exact nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
708 (setq tag-table-currently-matching-exact 'neither)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
709 (error "No %sentries %s %s"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
710 (if next "more " "")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
711 (if exact "matching" "containing")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
712 tagname))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
713 (search-forward "\C-?")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
714 (setq file (expand-file-name (file-of-tag)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
715 ;; XEmacs change: this needs to be
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
716 ;; relative to the
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
717 (or (file-name-directory (car tag-tables))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
718 "./")))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
719 (setq linebeg (buffer-substring (1- (point)) (point-at-bol)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
720 (search-forward ",")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
721 (setq startpos (read (current-buffer)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
722 (setq last-tag-data
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
723 (nconc (list tagname (point) tag-table-currently-matching-exact)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
724 tag-tables))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
725 (setq buf (find-file-noselect file))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
726 (with-current-buffer buf
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
727 (save-excursion
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
728 (save-restriction
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
729 (widen)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
730 (setq offset 1000)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
731 (setq pat (concat "^" (regexp-quote linebeg)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
732 (or startpos (setq startpos (point-min)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
733 (while (and (not found)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
734 (progn
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
735 (goto-char (- startpos offset))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
736 (not (bobp))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
737 (setq found (re-search-forward pat (+ startpos offset) t))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
738 (setq offset (* 3 offset)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
739 (or found
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
740 (re-search-forward pat nil t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
741 (error "%s not found in %s" pat file))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
742 (beginning-of-line)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
743 (setq startpos (point)))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
744 (cons buf startpos))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
745
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
746 ;;;###autoload
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
747 (defun find-tag (tagname &optional other-window)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
748 "*Find tag whose name contains TAGNAME.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
749 Selects the buffer that the tag is contained in
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
750 and puts point at its definition.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
751 If TAGNAME is a null string, the expression in the buffer
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
752 around or before point is used as the tag name.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
753 If called interactively with a numeric argument, searches for the next tag
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
754 in the tag table that matches the tagname used in the previous find-tag.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
755 If second arg OTHER-WINDOW is non-nil, uses another window to display
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
756 the tag.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
757
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
758 This version of this function supports multiple active tags tables,
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
759 and completion.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
760
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
761 Variables of note:
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
762
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
763 tag-table-alist controls which tables apply to which buffers
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
764 tags-file-name a default tags table
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
765 tags-build-completion-table controls completion behavior
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
766 buffer-tag-table another way of specifying a buffer-local table
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
767 make-tags-files-invisible whether tags tables should be very hidden
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
768 tag-mark-stack-max how many tags-based hops to remember"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
769 (interactive (if current-prefix-arg
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
770 '(nil nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
771 (list (find-tag-tag "Find tag: ") nil)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
772 (let* ((local-find-tag-hook find-tag-hook)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
773 (next (null tagname))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
774 (result (find-tag-internal tagname))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
775 (tag-buf (car result))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
776 (tag-point (cdr result)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
777 ;; push old position
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
778 (if (or (not next)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
779 (not (memq last-command
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
780 '(find-tag find-tag-other-window tags-loop-continue))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
781 (push-tag-mark))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
782 (if other-window
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
783 (pop-to-buffer tag-buf)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
784 (switch-to-buffer tag-buf))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
785 (widen)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
786 (push-mark)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
787 (goto-char tag-point)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
788 (if find-tag-hook
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
789 (funcall find-tag-hook)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
790 (if local-find-tag-hook
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
791 (funcall local-find-tag-hook))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
792 (setq tags-loop-scan (list 'find-tag nil nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
793 tags-loop-operate nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
794 ;; Return t in case used as the tags-loop-scan.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
795 t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
796
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
797 ;; This function is unchanged from lisp/tags.el:
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
798 ;;;###autoload
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
799 (defun find-tag-other-window (tagname &optional next)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
800 "*Find tag whose name contains TAGNAME.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
801 Selects the buffer that the tag is contained in in another window
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
802 and puts point at its definition.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
803 If TAGNAME is a null string, the expression in the buffer
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
804 around or before point is used as the tag name.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
805 If second arg NEXT is non-nil (interactively, with prefix arg),
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
806 searches for the next tag in the tag table
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
807 that matches the tagname used in the previous find-tag.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
808
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
809 This version of this function supports multiple active tags tables,
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
810 and completion.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
811
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
812 Variables of note:
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
813
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
814 tag-table-alist controls which tables apply to which buffers
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
815 tags-file-name a default tags table
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
816 tags-build-completion-table controls completion behavior
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
817 buffer-tag-table another way of specifying a buffer-local table
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
818 make-tags-files-invisible whether tags tables should be very hidden
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
819 tag-mark-stack-max how many tags-based hops to remember"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
820 (interactive (if current-prefix-arg
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
821 '(nil t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
822 (list (find-tag-tag "Find tag other window: "))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
823 (if next
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
824 (find-tag nil t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
825 (find-tag tagname t)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
826
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
827
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
828 ;; Completion on tags in the buffer
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
829
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
830 (defun complete-symbol (&optional table predicate prettify)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
831 (let* ((end (point))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
832 (beg (save-excursion
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
833 (backward-sexp 1)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
834 (while (= (char-syntax (following-char)) ?\')
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
835 (forward-char 1))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
836 (point)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
837 (pattern (buffer-substring beg end))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
838 (table (or table obarray))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
839 (completion (try-completion pattern table predicate)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
840 (cond ((eq completion t))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
841 ((null completion)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
842 (message "Can't find completion for \"%s\"" pattern)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
843 (ding))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
844 ((not (string-equal pattern completion))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
845 (delete-region beg end)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
846 (insert completion))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
847 (t
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
848 (message "Making completion list...")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
849 (let ((list (all-completions pattern table predicate)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
850 (if prettify
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
851 (setq list (funcall prettify list)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
852 (with-output-to-temp-buffer "*Help*"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
853 (display-completion-list list)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
854 (message "Making completion list...%s" "done")))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
855
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
856 (defun tag-complete-symbol ()
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
857 "The function used to do tags-completion (using 'tag-completion-predicate)."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
858 (interactive)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
859 (let* ((buffer-tag-table-list (buffer-tag-table-symbol-list))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
860 tag-symbol-tables)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
861 (complete-symbol tag-completion-table 'tag-completion-predicate)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
862
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
863
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
864 ;; Applying a command to files mentioned in tag tables
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
865
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
866 (defvar next-file-list nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
867 "List of files for next-file to process.")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
868
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
869 ;;;###autoload
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
870 (defun next-file (&optional initialize novisit)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
871 "Select next file among files in current tag table(s).
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
872
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
873 A first argument of t (prefix arg, if interactive) initializes to the
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
874 beginning of the list of files in the (first) tags table. If the argument
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
875 is neither nil nor t, it is evalled to initialize the list of files.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
876
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
877 Non-nil second argument NOVISIT means use a temporary buffer
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
878 to save time and avoid uninteresting warnings.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
879
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
880 Value is nil if the file was already visited;
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
881 if the file was newly read in, the value is the filename."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
882 (interactive "P")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
883 (cond ((not initialize)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
884 ;; Not the first run.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
885 )
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
886 ((eq initialize t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
887 ;; Initialize the list from the tags table.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
888 (setq next-file-list (buffer-tag-table-files)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
889 (t
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
890 ;; Initialize the list by evalling the argument.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
891 (setq next-file-list (eval initialize))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
892 (if (null next-file-list)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
893 (progn
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
894 (and novisit
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
895 (get-buffer " *next-file*")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
896 (kill-buffer " *next-file*"))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
897 (error "All files processed.")))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
898 (let* ((file (car next-file-list))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
899 (buf (get-file-buffer file))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
900 (new (not buf)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
901 (setq next-file-list (cdr next-file-list))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
902
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
903 (if (not (and new novisit))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
904 (switch-to-buffer (find-file-noselect file novisit) t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
905 ;; Like find-file, but avoids random warning messages.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
906 (set-buffer (get-buffer-create " *next-file*"))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
907 (kill-all-local-variables)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
908 (erase-buffer)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
909 (insert-file-contents file nil))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
910 (widen)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
911 (cond ((> (point) (point-min))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
912 (push-mark nil t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
913 (goto-char (point-min))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
914 (and new file)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
915
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
916 (defcustom tags-search-nuke-uninteresting-buffers t
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
917 "*If t (the default), tags-search and tags-query-replace will only
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
918 keep newly-visited buffers if they contain the search target."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
919 :type 'boolean
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
920 :group 'etags)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
921
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
922 ;;;###autoload
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
923 (defun tags-loop-continue (&optional first-time)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
924 "Continue last \\[tags-search] or \\[tags-query-replace] command.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
925 Used noninteractively with non-nil argument to begin such a command (the
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
926 argument is passed to `next-file', which see).
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
927 Two variables control the processing we do on each file:
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
928 the value of `tags-loop-scan' is a form to be executed on each file
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
929 to see if it is interesting (it returns non-nil if so)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
930 and `tags-loop-operate' is a form to execute to operate on an interesting file
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
931 If the latter returns non-nil, we exit; otherwise we scan the next file."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
932 (interactive)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
933 (let (new
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
934 (messaged nil))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
935 (while
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
936 (progn
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
937 ;; Scan files quickly for the first or next interesting one.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
938 (while (or first-time
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
939 (save-restriction
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
940 (widen)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
941 (not (eval tags-loop-scan))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
942 (setq new (next-file first-time
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
943 tags-search-nuke-uninteresting-buffers))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
944 ;; If NEW is non-nil, we got a temp buffer,
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
945 ;; and NEW is the file name.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
946 (if (or messaged
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
947 (and (not first-time)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
948 (> (device-baud-rate) search-slow-speed)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
949 (setq messaged t)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
950 (message "Scanning file %s..." (or new buffer-file-name)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
951 (setq first-time nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
952 (goto-char (point-min)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
953
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
954 ;; If we visited it in a temp buffer, visit it now for real.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
955 (if (and new tags-search-nuke-uninteresting-buffers)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
956 (let ((pos (point)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
957 (erase-buffer)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
958 (set-buffer (find-file-noselect new))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
959 (widen)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
960 (goto-char pos)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
961
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
962 (switch-to-buffer (current-buffer))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
963
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
964 ;; Now operate on the file.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
965 ;; If value is non-nil, continue to scan the next file.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
966 (eval tags-loop-operate)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
967 (and messaged
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
968 (null tags-loop-operate)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
969 (message "Scanning file %s...found" buffer-file-name))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
970
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
971
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
972 ;;;###autoload
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
973 (defun tags-search (regexp &optional file-list-form)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
974 "Search through all files listed in tags table for match for REGEXP.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
975 Stops when a match is found.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
976 To continue searching for next match, use command \\[tags-loop-continue].
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
977
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
978 See documentation of variable `tag-table-alist'."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
979 (interactive "sTags search (regexp): ")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
980 (if (and (equal regexp "")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
981 (eq (car tags-loop-scan) 'with-caps-disable-folding)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
982 (null tags-loop-operate))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
983 ;; Continue last tags-search as if by M-,.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
984 (tags-loop-continue nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
985 (setq tags-loop-scan `(with-caps-disable-folding ,regexp
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
986 (re-search-forward ,regexp nil t))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
987 tags-loop-operate nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
988 (tags-loop-continue (or file-list-form t))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
989
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
990 ;;;###autoload
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
991 (defun tags-query-replace (from to &optional delimited file-list-form)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
992 "Query-replace-regexp FROM with TO through all files listed in tags table.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
993 Third arg DELIMITED (prefix arg) means replace only word-delimited matches.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
994 If you exit (\\[keyboard-quit] or ESC), you can resume the query-replace
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
995 with the command \\[tags-loop-continue].
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
996
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
997 See documentation of variable `tag-table-alist'."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
998 (interactive
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
999 "sTags query replace (regexp): \nsTags query replace %s by: \nP")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1000 (setq tags-loop-scan `(with-caps-disable-folding ,from
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1001 (if (re-search-forward ,from nil t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1002 ;; When we find a match, move back
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1003 ;; to the beginning of it so perform-replace
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1004 ;; will see it.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1005 (progn (goto-char (match-beginning 0)) t)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1006 tags-loop-operate (list 'perform-replace from to t t
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1007 (not (null delimited))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1008 (tags-loop-continue (or file-list-form t)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1009
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1010 ;; Miscellaneous
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1011
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1012 ;; **** need to alter
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1013 ;; This function is unchanged from lisp/tags.el:
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1014 ;;;###autoload
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1015 (defun list-tags (string)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1016 "Display list of tags in file FILE.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1017 FILE should not contain a directory spec
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1018 unless it has one in the tag table."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1019 (interactive "fList tags (in file): ")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1020 (setq string (expand-file-name string))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1021 (with-output-to-temp-buffer "*Tags List*"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1022 (princ "Tags in file ")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1023 (princ string)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1024 (terpri)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1025 (save-excursion
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1026 (visit-tags-table-buffer)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1027 (goto-char 1)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1028 (search-forward (concat "\f\n" string ","))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1029 (forward-line 1)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1030 (while (not (or (eobp) (looking-at "\f")))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1031 (princ (buffer-substring (point)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1032 (progn (skip-chars-forward "^\C-?")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1033 (point))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1034 (terpri)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1035 (forward-line 1)))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1036
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1037 ;; **** need to alter
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1038 ;; This function is unchanged from lisp/tags.el:
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1039 ;;;###autoload
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1040 (defun tags-apropos (string)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1041 "Display list of all tags in tag table REGEXP matches."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1042 (interactive "sTag apropos (regexp): ")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1043 (with-output-to-temp-buffer "*Tags List*"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1044 (princ "Tags matching regexp ")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1045 (prin1 string)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1046 (terpri)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1047 (save-excursion
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1048 (visit-tags-table-buffer)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1049 (goto-char 1)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1050 (while (re-search-forward string nil t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1051 (beginning-of-line)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1052 (princ (buffer-substring (point)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1053 (progn (skip-chars-forward "^\C-?")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1054 (point))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1055 (terpri)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1056 (forward-line 1)))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1057
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1058 ;; **** copied from tags.el
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1059 (defun visit-tags-table-buffer ()
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1060 "Select the buffer containing the current tag table.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1061 This is a file whose name is in the variable tags-file-name."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1062 (or tags-file-name
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1063 (call-interactively 'visit-tags-table))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1064 (set-buffer (or (get-file-buffer tags-file-name)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1065 (progn
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1066 (setq tag-table-files nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1067 (find-file-noselect tags-file-name))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1068 (or (verify-visited-file-modtime (get-file-buffer tags-file-name))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1069 (cond ((yes-or-no-p "Tags file has changed, read new contents? ")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1070 (revert-buffer t t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1071 (setq tag-table-files nil))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1072 (or (eq (char-after 1) ?\^L)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1073 (error "File %s not a valid tag table" tags-file-name)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1074
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1075
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1076 ;; Sample uses of find-tag-hook and find-tag-default-hook
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1077
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1078 ;; Example buffer-local tag finding
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1079
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1080 (or (boundp 'emacs-lisp-mode-hook)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1081 (setq emacs-lisp-mode-hook nil))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1082 (if (eq (car-safe emacs-lisp-mode-hook) 'lambda)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1083 (setq emacs-lisp-mode-hook (list emacs-lisp-mode-hook)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1084 (or (memq 'setup-emacs-lisp-default-tag-hook emacs-lisp-mode-hook)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1085 (setq emacs-lisp-mode-hook
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1086 (cons 'setup-emacs-lisp-default-tag-hook emacs-lisp-mode-hook)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1087
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1088 (defun setup-emacs-lisp-default-tag-hook ()
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1089 (cond ((eq major-mode 'emacs-lisp-mode)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1090 (make-variable-buffer-local 'find-tag-default-hook)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1091 (setq find-tag-default-hook 'emacs-lisp-default-tag))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1092 ;; Run it once immediately
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1093 (setup-emacs-lisp-default-tag-hook)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1094 (when (get-buffer "*scratch*")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1095 (with-current-buffer "*scratch*"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1096 (setup-emacs-lisp-default-tag-hook)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1097
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1098 (defun emacs-lisp-default-tag ()
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1099 "Function to return a default tag for Emacs-Lisp mode."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1100 (let ((tag (or (variable-at-point)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1101 (function-at-point))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1102 (if tag (symbol-name tag))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1103
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1104
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1105 ;; Display short info on tag in minibuffer
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1106
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1107 (if (null (lookup-key esc-map "?"))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1108 (define-key esc-map "?" 'display-tag-info))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1109
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1110 (defun display-tag-info (tagname)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1111 "Prints a description of the first tag matching TAGNAME in the echo area.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1112 If this is an elisp function, prints something like \"(defun foo (x y z)\".
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1113 That is, is prints the first line of the definition of the form.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1114 If this is a C-defined elisp function, it does something more clever."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1115 (interactive (if current-prefix-arg
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1116 '(nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1117 (list (find-tag-tag "Display tag info: "))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1118 (let* ((results (find-tag-internal tagname))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1119 (tag-buf (car results))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1120 (tag-point (cdr results))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1121 info lname min max fname args)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1122 (with-current-buffer tag-buf
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1123 (save-excursion
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1124 (save-restriction
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1125 (widen)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1126 (goto-char tag-point)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1127 (cond ((let ((case-fold-search nil))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1128 (looking-at "^DEFUN[ \t]"))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1129 (forward-sexp 1)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1130 (down-list 1)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1131 (setq lname (read (current-buffer))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1132 fname (buffer-substring
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1133 (progn (forward-sexp 1) (point))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1134 (progn (backward-sexp 1) (point)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1135 min (buffer-substring
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1136 (progn (forward-sexp 3) (point))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1137 (progn (backward-sexp 1) (point)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1138 max (buffer-substring
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1139 (progn (forward-sexp 2) (point))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1140 (progn (backward-sexp 1) (point))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1141 (backward-up-list 1)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1142 (setq args (buffer-substring
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1143 (progn (forward-sexp 2) (point))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1144 (progn (backward-sexp 1) (point))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1145 (setq info (format "Elisp: %s, C: %s %s, #args: %s"
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1146 lname
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1147 fname args
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1148 (if (string-equal min max)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1149 min
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1150 (format "from %s to %s" min max)))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1151 (t
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1152 (setq info
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1153 (buffer-substring
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1154 (progn (beginning-of-line) (point))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1155 (progn (end-of-line) (point)))))))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1156 (message "%s" info))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1157 (setq tags-loop-scan '(display-tag-info nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1158 tags-loop-operate nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1159 ;; Always return non-nil
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1160 t)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1161
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1162
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1163 ;; Keep track of old locations before finding tags
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1164
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1165 (defvar tag-mark-stack1 nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1166 (defvar tag-mark-stack2 nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1167 (defcustom tag-mark-stack-max 16
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1168 "*The maximum number of elements kept on the mark-stack used
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1169 by tags-search. See also the commands push-tag-mark (\\[push-tag-mark])
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1170 and pop-tag-mark. (\\[pop-tag-mark])."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1171 :type 'integer
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1172 :group 'etags)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1173
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1174 (defun push-mark-on-stack (stack-symbol &optional max-size)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1175 (let ((stack (symbol-value stack-symbol)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1176 (push (point-marker) stack)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1177 (cond ((and max-size
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1178 (> (length stack) max-size))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1179 (set-marker (car (nthcdr max-size stack)) nil)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1180 (setcdr (nthcdr (1- max-size) stack) nil)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1181 (set stack-symbol stack)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1182
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1183 (defun pop-mark-from-stack (stack-symbol1 stack-symbol2 &optional max-size)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1184 (let* ((stack (or (symbol-value stack-symbol1)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1185 (error "No more tag marks on stack")))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1186 (marker (car stack))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1187 (m-buf (marker-buffer marker)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1188 (set stack-symbol1 (cdr stack))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1189 (or m-buf
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1190 (error "Marker has no buffer"))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1191 (if (null (buffer-name m-buf))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1192 (error "Buffer has been killed"))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1193 (push-mark-on-stack stack-symbol2 max-size)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1194 (switch-to-buffer m-buf)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1195 (widen)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1196 (goto-char (marker-position marker))))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1197
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1198 (defun push-tag-mark ()
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1199 (push-mark-on-stack 'tag-mark-stack1 tag-mark-stack-max))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1200
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1201 (if (memq (lookup-key esc-map "*") '(nil undefined))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1202 (define-key esc-map "*" 'pop-tag-mark))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1203
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1204 (defun pop-tag-mark (arg)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1205 "find-tag maintains a mark-stack seperate from the \\[set-mark-command] mark-stack.
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1206 This function pops (and moves to) the tag at the top of this stack."
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1207 (interactive "P")
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1208 (if (not arg)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1209 (pop-mark-from-stack
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1210 'tag-mark-stack1 'tag-mark-stack2 tag-mark-stack-max)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1211 (pop-mark-from-stack
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1212 'tag-mark-stack2 'tag-mark-stack1 tag-mark-stack-max)))
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1213
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1214
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1215 (provide 'etags)
d44af0c54775 Import from CVS: tag r20-4b7
cvs
parents:
diff changeset
1216 (provide 'tags)