2229
|
1 ;;; etags.el --- etags facility for Emacs
|
807
|
2
|
10429
c37ee605ba79
(etags-tags-completion-table): Don't let match string contain a \177.
Roland McGrath <roland@gnu.org>
diff
changeset
|
3 ;; Copyright (C) 1985, 1986, 1988, 1989, 1992, 1993, 1994, 1995
|
1806
da47cfb7624e
(visit-tags-table-buffer): Error if called with 'same and no current table.
Roland McGrath <roland@gnu.org>
diff
changeset
|
4 ;; Free Software Foundation, Inc.
|
846
|
5
|
807
|
6 ;; Author: Roland McGrath <roland@gnu.ai.mit.edu>
|
|
7 ;; Keywords: tools
|
|
8
|
342
|
9 ;; This file is part of GNU Emacs.
|
|
10
|
|
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
|
|
12 ;; it under the terms of the GNU General Public License as published by
|
727
|
13 ;; the Free Software Foundation; either version 2, or (at your option)
|
342
|
14 ;; any later version.
|
|
15
|
|
16 ;; GNU Emacs is distributed in the hope that it will be useful,
|
|
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
19 ;; GNU General Public License for more details.
|
|
20
|
|
21 ;; You should have received a copy of the GNU General Public License
|
14169
|
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
|
|
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
24 ;; Boston, MA 02111-1307, USA.
|
342
|
25
|
807
|
26 ;;; Code:
|
|
27
|
360
|
28 ;;;###autoload
|
1696
|
29 (defvar tags-file-name nil
|
|
30 "*File name of tags table.
|
799
|
31 To switch to a new tags table, setting this variable is sufficient.
|
1696
|
32 If you set this variable, do not also set `tags-table-list'.
|
799
|
33 Use the `etags' program to make a tags table file.")
|
1696
|
34 ;; Make M-x set-variable tags-file-name like M-x visit-tags-table.
|
824
|
35 ;;;###autoload (put 'tags-file-name 'variable-interactive "fVisit tags table: ")
|
799
|
36
|
|
37 ;;;###autoload
|
1696
|
38 ;; Use `visit-tags-table-buffer' to cycle through tags tables in this list.
|
799
|
39 (defvar tags-table-list nil
|
1696
|
40 "*List of file names of tags tables to search.
|
|
41 An element that is a directory means the file \"TAGS\" in that directory.
|
|
42 To switch to a new list of tags tables, setting this variable is sufficient.
|
|
43 If you set this variable, do not also set `tags-file-name'.
|
|
44 Use the `etags' program to make a tags table file.")
|
799
|
45
|
6140
35fc497c9f4e
(tags-add-tables): Change default value to 'ask-user; update doc.
Roland McGrath <roland@gnu.org>
diff
changeset
|
46 ;;;###autoload
|
35fc497c9f4e
(tags-add-tables): Change default value to 'ask-user; update doc.
Roland McGrath <roland@gnu.org>
diff
changeset
|
47 (defvar tags-add-tables 'ask-user
|
7112
|
48 "*Control whether to add a new tags table to the current list.
|
|
49 t means do; nil means don't (always start a new list).
|
|
50 Any other value means ask the user whether to add a new tags table
|
5174
|
51 to the current list (as opposed to starting a new list).")
|
|
52
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
53 (defvar tags-table-computed-list nil
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
54 "List of tags tables to search, computed from `tags-table-list'.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
55 This includes tables implicitly included by other tables. The list is not
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
56 always complete: the included tables of a table are not known until that
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
57 table is read into core. An element that is `t' is a placeholder
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
58 indicating that the preceding element is a table that has not been read
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
59 into core and might contain included tables to search.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
60 See `tags-table-check-computed-list'.")
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
61
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
62 (defvar tags-table-computed-list-for nil
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
63 "Value of `tags-table-list' that `tags-table-computed-list' corresponds to.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
64 If `tags-table-list' changes, `tags-table-computed-list' is thrown away and
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
65 recomputed; see `tags-table-check-computed-list'.")
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
66
|
799
|
67 (defvar tags-table-list-pointer nil
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
68 "Pointer into `tags-table-computed-list' for the current state of searching.
|
1149
|
69 Use `visit-tags-table-buffer' to cycle through tags tables in this list.")
|
|
70
|
|
71 (defvar tags-table-list-started-at nil
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
72 "Pointer into `tags-table-computed-list', where the current search started.")
|
799
|
73
|
|
74 (defvar tags-table-set-list nil
|
|
75 "List of sets of tags table which have been used together in the past.
|
|
76 Each element is a list of strings which are file names.")
|
342
|
77
|
799
|
78 ;;;###autoload
|
|
79 (defvar find-tag-hook nil
|
|
80 "*Hook to be run by \\[find-tag] after finding a tag. See `run-hooks'.
|
|
81 The value in the buffer in which \\[find-tag] is done is used,
|
|
82 not the value in the buffer \\[find-tag] goes to.")
|
|
83
|
|
84 ;;;###autoload
|
|
85 (defvar find-tag-default-function nil
|
1149
|
86 "*A function of no arguments used by \\[find-tag] to pick a default tag.
|
|
87 If nil, and the symbol that is the value of `major-mode'
|
799
|
88 has a `find-tag-default-function' property (see `put'), that is used.
|
|
89 Otherwise, `find-tag-default' is used.")
|
342
|
90
|
799
|
91 (defvar default-tags-table-function nil
|
5174
|
92 "If non-nil, a function to choose a default tags file for a buffer.
|
|
93 This function receives no arguments and should return the default
|
|
94 tags table file to use for the current buffer.")
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
95
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
96 (defvar tags-location-stack nil
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
97 "List of markers which are locations visited by \\[find-tag].
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
98 Pop back to the last location with \\[negative-argument] \\[find-tag].")
|
799
|
99
|
|
100 ;; Tags table state.
|
|
101 ;; These variables are local in tags table buffers.
|
|
102
|
|
103 (defvar tags-table-files nil
|
|
104 "List of file names covered by current tags table.
|
|
105 nil means it has not yet been computed; use `tags-table-files' to do so.")
|
|
106
|
|
107 (defvar tags-completion-table nil
|
|
108 "Alist of tag names defined in current tags table.")
|
|
109
|
|
110 (defvar tags-included-tables nil
|
|
111 "List of tags tables included by the current tags table.")
|
|
112
|
|
113 (defvar next-file-list nil
|
|
114 "List of files for \\[next-file] to process.")
|
|
115
|
|
116 ;; Hooks for file formats.
|
|
117
|
|
118 (defvar tags-table-format-hooks '(etags-recognize-tags-table
|
824
|
119 recognize-empty-tags-table)
|
799
|
120 "List of functions to be called in a tags table buffer to identify
|
|
121 the type of tags table. The functions are called in order, with no arguments,
|
|
122 until one returns non-nil. The function should make buffer-local bindings
|
|
123 of the format-parsing tags function variables if successful.")
|
|
124
|
|
125 (defvar file-of-tag-function nil
|
|
126 "Function to do the work of `file-of-tag' (which see).")
|
|
127 (defvar tags-table-files-function nil
|
|
128 "Function to do the work of `tags-table-files' (which see).")
|
|
129 (defvar tags-completion-table-function nil
|
|
130 "Function to build the tags-completion-table.")
|
|
131 (defvar snarf-tag-function nil
|
|
132 "Function to get info about a matched tag for `goto-tag-location-function'.")
|
|
133 (defvar goto-tag-location-function nil
|
|
134 "Function of to go to the location in the buffer specified by a tag.
|
|
135 One argument, the tag info returned by `snarf-tag-function'.")
|
|
136 (defvar find-tag-regexp-search-function nil
|
|
137 "Search function passed to `find-tag-in-order' for finding a regexp tag.")
|
|
138 (defvar find-tag-regexp-tag-order nil
|
|
139 "Tag order passed to `find-tag-in-order' for finding a regexp tag.")
|
|
140 (defvar find-tag-regexp-next-line-after-failure-p nil
|
|
141 "Flag passed to `find-tag-in-order' for finding a regexp tag.")
|
|
142 (defvar find-tag-search-function nil
|
|
143 "Search function passed to `find-tag-in-order' for finding a tag.")
|
|
144 (defvar find-tag-tag-order nil
|
|
145 "Tag order passed to `find-tag-in-order' for finding a tag.")
|
|
146 (defvar find-tag-next-line-after-failure-p nil
|
|
147 "Flag passed to `find-tag-in-order' for finding a tag.")
|
|
148 (defvar list-tags-function nil
|
|
149 "Function to do the work of `list-tags' (which see).")
|
|
150 (defvar tags-apropos-function nil
|
|
151 "Function to do the work of `tags-apropos' (which see).")
|
|
152 (defvar tags-included-tables-function nil
|
|
153 "Function to do the work of `tags-included-tables' (which see).")
|
|
154 (defvar verify-tags-table-function nil
|
19358
|
155 "Function to return t iff current buffer contains valid tags file.")
|
799
|
156
|
1696
|
157 ;; Initialize the tags table in the current buffer.
|
|
158 ;; Returns non-nil iff it is a valid tags table. On
|
|
159 ;; non-nil return, the tags table state variable are
|
|
160 ;; made buffer-local and initialized to nil.
|
799
|
161 (defun initialize-new-tags-table ()
|
1696
|
162 (set (make-local-variable 'tags-table-files) nil)
|
|
163 (set (make-local-variable 'tags-completion-table) nil)
|
|
164 (set (make-local-variable 'tags-included-tables) nil)
|
799
|
165 ;; Value is t if we have found a valid tags table buffer.
|
|
166 (let ((hooks tags-table-format-hooks))
|
|
167 (while (and hooks
|
|
168 (not (funcall (car hooks))))
|
|
169 (setq hooks (cdr hooks)))
|
|
170 hooks))
|
|
171
|
|
172 ;;;###autoload
|
|
173 (defun visit-tags-table (file &optional local)
|
|
174 "Tell tags commands to use tags table file FILE.
|
342
|
175 FILE should be the name of a file created with the `etags' program.
|
799
|
176 A directory name is ok too; it means file TAGS in that directory.
|
|
177
|
|
178 Normally \\[visit-tags-table] sets the global value of `tags-file-name'.
|
|
179 With a prefix arg, set the buffer-local value instead.
|
|
180 When you find a tag with \\[find-tag], the buffer it finds the tag
|
|
181 in is given a local value of this variable which is the name of the tags
|
|
182 file the tag was in."
|
342
|
183 (interactive (list (read-file-name "Visit tags table: (default TAGS) "
|
|
184 default-directory
|
799
|
185 (expand-file-name "TAGS"
|
|
186 default-directory)
|
|
187 t)
|
|
188 current-prefix-arg))
|
7287
0e89007c19c6
(visit-tags-tbale-buffer): If CONT is stringp, use it for tags-file-name.
Roland McGrath <roland@gnu.org>
diff
changeset
|
189 (or (stringp file) (signal 'wrong-type-argument (list 'stringp file)))
|
0e89007c19c6
(visit-tags-tbale-buffer): If CONT is stringp, use it for tags-file-name.
Roland McGrath <roland@gnu.org>
diff
changeset
|
190 ;; Bind tags-file-name so we can control below whether the local or
|
0e89007c19c6
(visit-tags-tbale-buffer): If CONT is stringp, use it for tags-file-name.
Roland McGrath <roland@gnu.org>
diff
changeset
|
191 ;; global value gets set. Calling visit-tags-table-buffer will
|
0e89007c19c6
(visit-tags-tbale-buffer): If CONT is stringp, use it for tags-file-name.
Roland McGrath <roland@gnu.org>
diff
changeset
|
192 ;; initialize a buffer for the file and set tags-file-name to the
|
10661
|
193 ;; Calling visit-tags-table-buffer with tags-file-name set to FILE will
|
|
194 ;; initialize a buffer for FILE and set tags-file-name to the
|
1696
|
195 ;; fully-expanded name.
|
1138
|
196 (let ((tags-file-name file))
|
|
197 (save-excursion
|
7287
0e89007c19c6
(visit-tags-tbale-buffer): If CONT is stringp, use it for tags-file-name.
Roland McGrath <roland@gnu.org>
diff
changeset
|
198 (or (visit-tags-table-buffer file)
|
1138
|
199 (signal 'file-error (list "Visiting tags table"
|
|
200 "file does not exist"
|
|
201 file)))
|
1696
|
202 ;; Set FILE to the expanded name.
|
1138
|
203 (setq file tags-file-name)))
|
799
|
204 (if local
|
1696
|
205 ;; Set the local value of tags-file-name.
|
1149
|
206 (set (make-local-variable 'tags-file-name) file)
|
1696
|
207 ;; Set the global value of tags-file-name.
|
1138
|
208 (setq-default tags-file-name file)))
|
|
209
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
210 (defun tags-table-check-computed-list ()
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
211 "Compute `tags-table-computed-list' from `tags-table-list' if necessary."
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
212 (let ((expanded-list (mapcar 'tags-expand-table-name tags-table-list)))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
213 (or (equal tags-table-computed-list-for expanded-list)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
214 ;; The list (or default-directory) has changed since last computed.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
215 (let* ((compute-for (mapcar 'copy-sequence expanded-list))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
216 (tables (copy-sequence compute-for)) ;Mutated in the loop.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
217 (computed nil)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
218 table-buffer)
|
1149
|
219
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
220 (while tables
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
221 (setq computed (cons (car tables) computed)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
222 table-buffer (get-file-buffer (car tables)))
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
223 (if (and table-buffer
|
9020
857ced7767c0
(tags-table-check-computed-list): Call tags-verify-table on existing
Roland McGrath <roland@gnu.org>
diff
changeset
|
224 ;; There is a buffer visiting the file. Now make sure
|
857ced7767c0
(tags-table-check-computed-list): Call tags-verify-table on existing
Roland McGrath <roland@gnu.org>
diff
changeset
|
225 ;; it is initialized as a tag table buffer.
|
857ced7767c0
(tags-table-check-computed-list): Call tags-verify-table on existing
Roland McGrath <roland@gnu.org>
diff
changeset
|
226 (save-excursion
|
857ced7767c0
(tags-table-check-computed-list): Call tags-verify-table on existing
Roland McGrath <roland@gnu.org>
diff
changeset
|
227 (tags-verify-table (buffer-file-name table-buffer))))
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
228 (save-excursion
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
229 (set-buffer table-buffer)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
230 (if (tags-included-tables)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
231 ;; Insert the included tables into the list we
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
232 ;; are processing.
|
13165
e5431229a09f
(tags-table-check-computed-list): Map tags-expand-table-name over lists of
Roland McGrath <roland@gnu.org>
diff
changeset
|
233 (setcdr tables (nconc (mapcar 'tags-expand-table-name
|
e5431229a09f
(tags-table-check-computed-list): Map tags-expand-table-name over lists of
Roland McGrath <roland@gnu.org>
diff
changeset
|
234 (tags-included-tables))
|
e5431229a09f
(tags-table-check-computed-list): Map tags-expand-table-name over lists of
Roland McGrath <roland@gnu.org>
diff
changeset
|
235 (cdr tables)))))
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
236 ;; This table is not in core yet. Insert a placeholder
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
237 ;; saying we must read it into core to check for included
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
238 ;; tables before searching the next table in the list.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
239 (setq computed (cons t computed)))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
240 (setq tables (cdr tables)))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
241
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
242 ;; Record the tags-table-list value (and the context of the
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
243 ;; current directory) we computed from.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
244 (setq tags-table-computed-list-for compute-for
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
245 tags-table-computed-list (nreverse computed))))))
|
1149
|
246
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
247 ;; Extend `tags-table-computed-list' to remove the first `t' placeholder.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
248 ;; An element of the list that is `t' is a placeholder indicating that the
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
249 ;; preceding element is a table that has not been read into core and might
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
250 ;; contain included tables to search. On return, the first placeholder
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
251 ;; element will be gone and the element before it read into core and its
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
252 ;; included tables inserted into the list.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
253 (defun tags-table-extend-computed-list ()
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
254 (let ((list tags-table-computed-list))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
255 (while (not (eq (nth 1 list) t))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
256 (setq list (cdr list)))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
257 (save-excursion
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
258 (if (tags-verify-table (car list))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
259 ;; We are now in the buffer visiting (car LIST). Extract its
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
260 ;; list of included tables and insert it into the computed list.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
261 (let ((tables (tags-included-tables))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
262 (computed nil)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
263 table-buffer)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
264 (while tables
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
265 (setq computed (cons (car tables) computed)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
266 table-buffer (get-file-buffer (car tables)))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
267 (if table-buffer
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
268 (save-excursion
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
269 (set-buffer table-buffer)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
270 (if (tags-included-tables)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
271 ;; Insert the included tables into the list we
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
272 ;; are processing.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
273 (setcdr tables (append (tags-included-tables)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
274 tables))))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
275 ;; This table is not in core yet. Insert a placeholder
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
276 ;; saying we must read it into core to check for included
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
277 ;; tables before searching the next table in the list.
|
8623
428abda49671
(tags-table-extend-computed-list): In loop processing list of included
Roland McGrath <roland@gnu.org>
diff
changeset
|
278 (setq computed (cons t computed)))
|
428abda49671
(tags-table-extend-computed-list): In loop processing list of included
Roland McGrath <roland@gnu.org>
diff
changeset
|
279 (setq tables (cdr tables)))
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
280 (setq computed (nreverse computed))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
281 ;; COMPUTED now contains the list of included tables (and
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
282 ;; tables included by them, etc.). Now splice this into the
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
283 ;; current list.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
284 (setcdr list (nconc computed (cdr (cdr list)))))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
285 ;; It was not a valid table, so just remove the following placeholder.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
286 (setcdr list (cdr (cdr list)))))))
|
1149
|
287
|
1696
|
288 ;; Expand tags table name FILE into a complete file name.
|
1149
|
289 (defun tags-expand-table-name (file)
|
|
290 (setq file (expand-file-name file))
|
|
291 (if (file-directory-p file)
|
|
292 (expand-file-name "TAGS" file)
|
|
293 file))
|
1138
|
294
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
295 ;; Like member, but comparison is done after tags-expand-table-name on both
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
296 ;; sides and elements of LIST that are t are skipped.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
297 (defun tags-table-list-member (file list)
|
1149
|
298 (setq file (tags-expand-table-name file))
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
299 (while (and list
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
300 (or (eq (car list) t)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
301 (not (string= file (tags-expand-table-name (car list))))))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
302 (setq list (cdr list)))
|
1149
|
303 list)
|
|
304
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
305 (defun tags-verify-table (file)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
306 "Read FILE into a buffer and verify that it is a valid tags table.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
307 Sets the current buffer to one visiting FILE (if it exists).
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
308 Returns non-nil iff it is a valid table."
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
309 (if (get-file-buffer file)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
310 ;; The file is already in a buffer. Check for the visited file
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
311 ;; having changed since we last used it.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
312 (let (win)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
313 (set-buffer (get-file-buffer file))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
314 (setq win (or verify-tags-table-function (initialize-new-tags-table)))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
315 (if (or (verify-visited-file-modtime (current-buffer))
|
19358
|
316 ;; Decide whether to revert the file.
|
|
317 ;; revert-without-query can say to revert
|
|
318 ;; or the user can say to revert.
|
|
319 (not (or (let ((tail revert-without-query)
|
|
320 (found nil))
|
|
321 (while tail
|
|
322 (if (string-match (car tail) buffer-file-name)
|
|
323 (setq found t))
|
|
324 (setq tail (cdr tail)))
|
|
325 found)
|
|
326 (yes-or-no-p
|
|
327 (format "Tags file %s has changed, read new contents? "
|
|
328 file)))))
|
|
329 (and verify-tags-table-function
|
|
330 (funcall verify-tags-table-function))
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
331 (revert-buffer t t)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
332 (initialize-new-tags-table)))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
333 (and (file-exists-p file)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
334 (progn
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
335 (set-buffer (find-file-noselect file))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
336 (or (string= file buffer-file-name)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
337 ;; find-file-noselect has changed the file name.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
338 ;; Propagate the change to tags-file-name and tags-table-list.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
339 (let ((tail (member file tags-table-list)))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
340 (if tail
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
341 (setcar tail buffer-file-name))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
342 (if (eq file tags-file-name)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
343 (setq tags-file-name buffer-file-name))))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
344 (initialize-new-tags-table)))))
|
4391
|
345
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
346 ;; Subroutine of visit-tags-table-buffer. Search the current tags tables
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
347 ;; for one that has tags for THIS-FILE (or that includes a table that
|
8040
|
348 ;; does). Return the name of the first table table listing THIS-FILE; if
|
|
349 ;; the table is one included by another table, it is the master table that
|
|
350 ;; we return. If CORE-ONLY is non-nil, check only tags tables that are
|
|
351 ;; already in buffers--don't visit any new files.
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
352 (defun tags-table-including (this-file core-only)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
353 (let ((tables tags-table-computed-list)
|
7211
b2485e94101a
(tags-table-parent-pointer-list): Doc fix; elts are now 3-elt lists.
Roland McGrath <roland@gnu.org>
diff
changeset
|
354 (found nil))
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
355 ;; Loop over the list, looking for a table containing tags for THIS-FILE.
|
1149
|
356 (while (and (not found)
|
|
357 tables)
|
1138
|
358
|
8509
be778f8834a5
(tags-table-including): Inside loop: if CORE-ONLY skip all consecutive
Roland McGrath <roland@gnu.org>
diff
changeset
|
359 (if core-only
|
be778f8834a5
(tags-table-including): Inside loop: if CORE-ONLY skip all consecutive
Roland McGrath <roland@gnu.org>
diff
changeset
|
360 ;; Skip tables not in core.
|
be778f8834a5
(tags-table-including): Inside loop: if CORE-ONLY skip all consecutive
Roland McGrath <roland@gnu.org>
diff
changeset
|
361 (while (eq (nth 1 tables) t)
|
be778f8834a5
(tags-table-including): Inside loop: if CORE-ONLY skip all consecutive
Roland McGrath <roland@gnu.org>
diff
changeset
|
362 (setq tables (cdr (cdr tables))))
|
be778f8834a5
(tags-table-including): Inside loop: if CORE-ONLY skip all consecutive
Roland McGrath <roland@gnu.org>
diff
changeset
|
363 (if (eq (nth 1 tables) t)
|
be778f8834a5
(tags-table-including): Inside loop: if CORE-ONLY skip all consecutive
Roland McGrath <roland@gnu.org>
diff
changeset
|
364 ;; This table has not been read into core yet. Read it in now.
|
be778f8834a5
(tags-table-including): Inside loop: if CORE-ONLY skip all consecutive
Roland McGrath <roland@gnu.org>
diff
changeset
|
365 (tags-table-extend-computed-list)))
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
366
|
8014
0d4288705550
(tags-table-including): Don't call tags-table-check-computed-list.
Roland McGrath <roland@gnu.org>
diff
changeset
|
367 (if tables
|
0d4288705550
(tags-table-including): Don't call tags-table-check-computed-list.
Roland McGrath <roland@gnu.org>
diff
changeset
|
368 ;; Select the tags table buffer and get the file list up to date.
|
0d4288705550
(tags-table-including): Don't call tags-table-check-computed-list.
Roland McGrath <roland@gnu.org>
diff
changeset
|
369 (let ((tags-file-name (car tables)))
|
0d4288705550
(tags-table-including): Don't call tags-table-check-computed-list.
Roland McGrath <roland@gnu.org>
diff
changeset
|
370 (visit-tags-table-buffer 'same)
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
371 (if (member this-file (mapcar 'expand-file-name
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
372 (tags-table-files)))
|
8014
0d4288705550
(tags-table-including): Don't call tags-table-check-computed-list.
Roland McGrath <roland@gnu.org>
diff
changeset
|
373 ;; Found it.
|
0d4288705550
(tags-table-including): Don't call tags-table-check-computed-list.
Roland McGrath <roland@gnu.org>
diff
changeset
|
374 (setq found tables))))
|
1149
|
375 (setq tables (cdr tables)))
|
8014
0d4288705550
(tags-table-including): Don't call tags-table-check-computed-list.
Roland McGrath <roland@gnu.org>
diff
changeset
|
376 (if found
|
0d4288705550
(tags-table-including): Don't call tags-table-check-computed-list.
Roland McGrath <roland@gnu.org>
diff
changeset
|
377 ;; Now determine if the table we found was one included by another
|
9928
d49a23c098df
(tags-table-including): Don't gratuitously cons (what was I thinking?).
Roland McGrath <roland@gnu.org>
diff
changeset
|
378 ;; table, not explicitly listed. We do this by checking each
|
d49a23c098df
(tags-table-including): Don't gratuitously cons (what was I thinking?).
Roland McGrath <roland@gnu.org>
diff
changeset
|
379 ;; element of the computed list to see if it appears in the user's
|
d49a23c098df
(tags-table-including): Don't gratuitously cons (what was I thinking?).
Roland McGrath <roland@gnu.org>
diff
changeset
|
380 ;; explicit list; the last element we will check is FOUND itself.
|
d49a23c098df
(tags-table-including): Don't gratuitously cons (what was I thinking?).
Roland McGrath <roland@gnu.org>
diff
changeset
|
381 ;; Then we return the last one which did in fact appear in
|
d49a23c098df
(tags-table-including): Don't gratuitously cons (what was I thinking?).
Roland McGrath <roland@gnu.org>
diff
changeset
|
382 ;; tags-table-list.
|
8014
0d4288705550
(tags-table-including): Don't call tags-table-check-computed-list.
Roland McGrath <roland@gnu.org>
diff
changeset
|
383 (let ((could-be nil)
|
0d4288705550
(tags-table-including): Don't call tags-table-check-computed-list.
Roland McGrath <roland@gnu.org>
diff
changeset
|
384 (elt tags-table-computed-list))
|
0d4288705550
(tags-table-including): Don't call tags-table-check-computed-list.
Roland McGrath <roland@gnu.org>
diff
changeset
|
385 (while (not (eq elt (cdr found)))
|
0d4288705550
(tags-table-including): Don't call tags-table-check-computed-list.
Roland McGrath <roland@gnu.org>
diff
changeset
|
386 (if (tags-table-list-member (car elt) tags-table-list)
|
0d4288705550
(tags-table-including): Don't call tags-table-check-computed-list.
Roland McGrath <roland@gnu.org>
diff
changeset
|
387 ;; This table appears in the user's list, so it could be
|
0d4288705550
(tags-table-including): Don't call tags-table-check-computed-list.
Roland McGrath <roland@gnu.org>
diff
changeset
|
388 ;; the one which includes the table we found.
|
9928
d49a23c098df
(tags-table-including): Don't gratuitously cons (what was I thinking?).
Roland McGrath <roland@gnu.org>
diff
changeset
|
389 (setq could-be (car elt)))
|
d49a23c098df
(tags-table-including): Don't gratuitously cons (what was I thinking?).
Roland McGrath <roland@gnu.org>
diff
changeset
|
390 (setq elt (cdr elt))
|
d49a23c098df
(tags-table-including): Don't gratuitously cons (what was I thinking?).
Roland McGrath <roland@gnu.org>
diff
changeset
|
391 (if (eq t (car elt))
|
d49a23c098df
(tags-table-including): Don't gratuitously cons (what was I thinking?).
Roland McGrath <roland@gnu.org>
diff
changeset
|
392 (setq elt (cdr elt))))
|
8015
|
393 ;; The last element we found in the computed list before FOUND
|
|
394 ;; that appears in the user's list will be the table that
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
395 ;; included the one we found.
|
9928
d49a23c098df
(tags-table-including): Don't gratuitously cons (what was I thinking?).
Roland McGrath <roland@gnu.org>
diff
changeset
|
396 could-be))))
|
799
|
397
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
398 ;; Subroutine of visit-tags-table-buffer. Move tags-table-list-pointer
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
399 ;; along and set tags-file-name. Returns nil when out of tables.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
400 (defun tags-next-table ()
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
401 ;; If there is a placeholder element next, compute the list to replace it.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
402 (while (eq (nth 1 tags-table-list-pointer) t)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
403 (tags-table-extend-computed-list))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
404
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
405 ;; Go to the next table in the list.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
406 (setq tags-table-list-pointer (cdr tags-table-list-pointer))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
407 (or tags-table-list-pointer
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
408 ;; Wrap around.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
409 (setq tags-table-list-pointer tags-table-computed-list))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
410
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
411 (if (eq tags-table-list-pointer tags-table-list-started-at)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
412 ;; We have come full circle. No more tables.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
413 (setq tags-table-list-pointer nil)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
414 ;; Set tags-file-name to the name from the list. It is already expanded.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
415 (setq tags-file-name (car tags-table-list-pointer))))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
416
|
799
|
417 (defun visit-tags-table-buffer (&optional cont)
|
|
418 "Select the buffer containing the current tags table.
|
7287
0e89007c19c6
(visit-tags-tbale-buffer): If CONT is stringp, use it for tags-file-name.
Roland McGrath <roland@gnu.org>
diff
changeset
|
419 If optional arg is a string, visit that file as a tags table.
|
799
|
420 If optional arg is t, visit the next table in `tags-table-list'.
|
|
421 If optional arg is the atom `same', don't look for a new table;
|
1696
|
422 just select the buffer visiting `tags-file-name'.
|
1149
|
423 If arg is nil or absent, choose a first buffer from information in
|
1696
|
424 `tags-file-name', `tags-table-list', `tags-table-list-pointer'.
|
799
|
425 Returns t if it visits a tags table, or nil if there are no more in the list."
|
1696
|
426
|
|
427 ;; Set tags-file-name to the tags table file we want to visit.
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
428 (cond ((eq cont 'same)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
429 ;; Use the ambient value of tags-file-name.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
430 (or tags-file-name
|
14420
071f9717597f
(visit-tags-table-buffer, tags-loop-scan, complete-tag): Fix error format
Karl Heuer <kwzh@gnu.org>
diff
changeset
|
431 (error "%s"
|
071f9717597f
(visit-tags-table-buffer, tags-loop-scan, complete-tag): Fix error format
Karl Heuer <kwzh@gnu.org>
diff
changeset
|
432 (substitute-command-keys
|
18623
|
433 (concat "No tags table in use; "
|
|
434 "use \\[visit-tags-table] to select one")))))
|
1138
|
435
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
436 ((eq t cont)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
437 ;; Find the next table.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
438 (if (tags-next-table)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
439 ;; Skip over nonexistent files.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
440 (while (and (not (or (get-file-buffer tags-file-name)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
441 (file-exists-p tags-file-name)))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
442 (tags-next-table)))))
|
7211
b2485e94101a
(tags-table-parent-pointer-list): Doc fix; elts are now 3-elt lists.
Roland McGrath <roland@gnu.org>
diff
changeset
|
443
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
444 (t
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
445 ;; Pick a table out of our hat.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
446 (tags-table-check-computed-list) ;Get it up to date, we might use it.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
447 (setq tags-file-name
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
448 (or
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
449 ;; If passed a string, use that.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
450 (if (stringp cont)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
451 (prog1 cont
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
452 (setq cont nil)))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
453 ;; First, try a local variable.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
454 (cdr (assq 'tags-file-name (buffer-local-variables)))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
455 ;; Second, try a user-specified function to guess.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
456 (and default-tags-table-function
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
457 (funcall default-tags-table-function))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
458 ;; Third, look for a tags table that contains tags for the
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
459 ;; current buffer's file. If one is found, the lists will
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
460 ;; be frobnicated, and CONT will be set non-nil so we don't
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
461 ;; do it below.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
462 (and buffer-file-name
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
463 (or
|
8040
|
464 ;; First check only tables already in buffers.
|
|
465 (tags-table-including buffer-file-name t)
|
|
466 ;; Since that didn't find any, now do the
|
|
467 ;; expensive version: reading new files.
|
|
468 (tags-table-including buffer-file-name nil)))
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
469 ;; Fourth, use the user variable tags-file-name, if it is
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
470 ;; not already in the current list.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
471 (and tags-file-name
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
472 (not (tags-table-list-member tags-file-name
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
473 tags-table-computed-list))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
474 tags-file-name)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
475 ;; Fifth, use the user variable giving the table list.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
476 ;; Find the first element of the list that actually exists.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
477 (let ((list tags-table-list)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
478 file)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
479 (while (and list
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
480 (setq file (tags-expand-table-name (car list)))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
481 (not (get-file-buffer file))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
482 (not (file-exists-p file)))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
483 (setq list (cdr list)))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
484 (car list))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
485 ;; Finally, prompt the user for a file name.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
486 (expand-file-name
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
487 (read-file-name "Visit tags table: (default TAGS) "
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
488 default-directory
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
489 "TAGS"
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
490 t))))))
|
1138
|
491
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
492 ;; Expand the table name into a full file name.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
493 (setq tags-file-name (tags-expand-table-name tags-file-name))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
494
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
495 (if (and (eq cont t)
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
496 (null tags-table-list-pointer))
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
497 ;; All out of tables.
|
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
498 nil
|
1149
|
499
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
500 ;; Verify that tags-file-name names a valid tags table.
|
8297
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
501 ;; Bind another variable with the value of tags-file-name
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
502 ;; before we switch buffers, in case tags-file-name is buffer-local.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
503 (let ((curbuf (current-buffer))
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
504 (local-tags-file-name tags-file-name))
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
505 (if (tags-verify-table local-tags-file-name)
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
506
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
507 ;; We have a valid tags table.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
508 (progn
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
509 ;; Bury the tags table buffer so it
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
510 ;; doesn't get in the user's way.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
511 (bury-buffer (current-buffer))
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
512
|
8297
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
513 ;; If this was a new table selection (CONT is nil), make
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
514 ;; sure tags-table-list includes the chosen table, and
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
515 ;; update the list pointer variables.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
516 (or cont
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
517 ;; Look in the list for the table we chose.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
518 (let ((found (tags-table-list-member
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
519 local-tags-file-name
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
520 tags-table-computed-list)))
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
521 (if found
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
522 ;; There it is. Just switch to it.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
523 (setq tags-table-list-pointer found
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
524 tags-table-list-started-at found)
|
4391
|
525
|
8297
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
526 ;; The table is not in the current set.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
527 ;; Try to find it in another previously used set.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
528 (let ((sets tags-table-set-list))
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
529 (while (and sets
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
530 (not (tags-table-list-member
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
531 local-tags-file-name
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
532 (car sets))))
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
533 (setq sets (cdr sets)))
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
534 (if sets
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
535 ;; Found in some other set. Switch to that set.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
536 (progn
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
537 (or (memq tags-table-list tags-table-set-list)
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
538 ;; Save the current list.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
539 (setq tags-table-set-list
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
540 (cons tags-table-list
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
541 tags-table-set-list)))
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
542 (setq tags-table-list (car sets)))
|
1149
|
543
|
8297
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
544 ;; Not found in any existing set.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
545 (if (and tags-table-list
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
546 (or (eq t tags-add-tables)
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
547 (and tags-add-tables
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
548 (y-or-n-p
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
549 (concat "Keep current list of "
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
550 "tags tables also? ")))))
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
551 ;; Add it to the current list.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
552 (setq tags-table-list (cons local-tags-file-name
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
553 tags-table-list))
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
554
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
555 ;; Make a fresh list, and store the old one.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
556 (message "Starting a new list of tags tables")
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
557 (or (null tags-table-list)
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
558 (memq tags-table-list tags-table-set-list)
|
7211
b2485e94101a
(tags-table-parent-pointer-list): Doc fix; elts are now 3-elt lists.
Roland McGrath <roland@gnu.org>
diff
changeset
|
559 (setq tags-table-set-list
|
b2485e94101a
(tags-table-parent-pointer-list): Doc fix; elts are now 3-elt lists.
Roland McGrath <roland@gnu.org>
diff
changeset
|
560 (cons tags-table-list
|
b2485e94101a
(tags-table-parent-pointer-list): Doc fix; elts are now 3-elt lists.
Roland McGrath <roland@gnu.org>
diff
changeset
|
561 tags-table-set-list)))
|
8297
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
562 (setq tags-table-list (list local-tags-file-name))))
|
7211
b2485e94101a
(tags-table-parent-pointer-list): Doc fix; elts are now 3-elt lists.
Roland McGrath <roland@gnu.org>
diff
changeset
|
563
|
8297
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
564 ;; Recompute tags-table-computed-list.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
565 (tags-table-check-computed-list)
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
566 ;; Set the tags table list state variables to start
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
567 ;; over from tags-table-computed-list.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
568 (setq tags-table-list-started-at tags-table-computed-list
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
569 tags-table-list-pointer
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
570 tags-table-computed-list)))))
|
1156
|
571
|
8297
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
572 ;; Return of t says the tags table is valid.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
573 t)
|
1149
|
574
|
8297
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
575 ;; The buffer was not valid. Don't use it again.
|
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
576 (set-buffer curbuf)
|
7934
b5e9b6a00f5d
(tags-table-computed-list, tags-table-computed-list-for): New variables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
577 (kill-local-variable 'tags-file-name)
|
8297
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
578 (if (eq local-tags-file-name tags-file-name)
|
8116
67c8a970fd4d
(visit-tags-table-buffer): Move error call into scope of `file'.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
579 (setq tags-file-name nil))
|
8297
80d4bf018aec
(visit-tags-table-buffer): Bind a variable local-tags-file-name with the
Roland McGrath <roland@gnu.org>
diff
changeset
|
580 (error "File %s is not a valid tags table" local-tags-file-name)))))
|
9525
|
581
|
|
582 (defun tags-reset-tags-tables ()
|
|
583 "Reset tags state to cancel effect of any previous \\[visit-tags-table]
|
|
584 or \\[find-tag]."
|
|
585 (interactive)
|
|
586 (setq tags-file-name nil
|
|
587 tags-location-stack nil
|
|
588 tags-table-list nil
|
|
589 tags-table-computed-list nil
|
|
590 tags-table-computed-list-for nil
|
|
591 tags-table-list-pointer nil
|
|
592 tags-table-list-started-at nil
|
|
593 tags-table-set-list nil))
|
1397
|
594
|
342
|
595 (defun file-of-tag ()
|
|
596 "Return the file name of the file whose tags point is within.
|
799
|
597 Assumes the tags table is the current buffer.
|
|
598 File name returned is relative to tags table file's directory."
|
|
599 (funcall file-of-tag-function))
|
342
|
600
|
360
|
601 ;;;###autoload
|
799
|
602 (defun tags-table-files ()
|
|
603 "Return a list of files in the current tags table.
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
604 Assumes the tags table is the current buffer. The file names are returned
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
605 as they appeared in the `etags' command that created the table, usually
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
606 without directory names."
|
1397
|
607 (or tags-table-files
|
|
608 (setq tags-table-files
|
|
609 (funcall tags-table-files-function))))
|
799
|
610
|
|
611 (defun tags-included-tables ()
|
1696
|
612 "Return a list of tags tables included by the current table.
|
|
613 Assumes the tags table is the current buffer."
|
799
|
614 (or tags-included-tables
|
|
615 (setq tags-included-tables (funcall tags-included-tables-function))))
|
|
616
|
|
617 ;; Build tags-completion-table on demand. The single current tags table
|
|
618 ;; and its included tags tables (and their included tables, etc.) have
|
|
619 ;; their tags included in the completion table.
|
|
620 (defun tags-completion-table ()
|
|
621 (or tags-completion-table
|
|
622 (condition-case ()
|
|
623 (prog2
|
|
624 (message "Making tags completion table for %s..." buffer-file-name)
|
|
625 (let ((included (tags-included-tables))
|
|
626 (table (funcall tags-completion-table-function)))
|
|
627 (save-excursion
|
1696
|
628 ;; Iterate over the list of included tables, and combine each
|
|
629 ;; included table's completion obarray to the parent obarray.
|
799
|
630 (while included
|
1696
|
631 ;; Visit the buffer.
|
799
|
632 (let ((tags-file-name (car included)))
|
1149
|
633 (visit-tags-table-buffer 'same))
|
1696
|
634 ;; Recurse in that buffer to compute its completion table.
|
799
|
635 (if (tags-completion-table)
|
1696
|
636 ;; Combine the tables.
|
799
|
637 (mapatoms (function
|
|
638 (lambda (sym)
|
|
639 (intern (symbol-name sym) table)))
|
|
640 tags-completion-table))
|
|
641 (setq included (cdr included))))
|
|
642 (setq tags-completion-table table))
|
|
643 (message "Making tags completion table for %s...done"
|
|
644 buffer-file-name))
|
|
645 (quit (message "Tags completion table construction aborted.")
|
|
646 (setq tags-completion-table nil)))))
|
|
647
|
|
648 ;; Completion function for tags. Does normal try-completion,
|
|
649 ;; but builds tags-completion-table on demand.
|
|
650 (defun tags-complete-tag (string predicate what)
|
|
651 (save-excursion
|
5079
|
652 ;; If we need to ask for the tag table, allow that.
|
|
653 (let ((enable-recursive-minibuffers t))
|
|
654 (visit-tags-table-buffer))
|
799
|
655 (if (eq what t)
|
|
656 (all-completions string (tags-completion-table) predicate)
|
|
657 (try-completion string (tags-completion-table) predicate))))
|
1397
|
658
|
342
|
659 ;; Return a default tag to search for, based on the text at point.
|
|
660 (defun find-tag-default ()
|
|
661 (save-excursion
|
|
662 (while (looking-at "\\sw\\|\\s_")
|
|
663 (forward-char 1))
|
799
|
664 (if (or (re-search-backward "\\sw\\|\\s_"
|
|
665 (save-excursion (beginning-of-line) (point))
|
|
666 t)
|
|
667 (re-search-forward "\\(\\sw\\|\\s_\\)+"
|
|
668 (save-excursion (end-of-line) (point))
|
|
669 t))
|
|
670 (progn (goto-char (match-end 0))
|
342
|
671 (buffer-substring (point)
|
|
672 (progn (forward-sexp -1)
|
|
673 (while (looking-at "\\s'")
|
|
674 (forward-char 1))
|
|
675 (point))))
|
|
676 nil)))
|
|
677
|
799
|
678 ;; Read a tag name from the minibuffer with defaulting and completion.
|
342
|
679 (defun find-tag-tag (string)
|
799
|
680 (let* ((default (funcall (or find-tag-default-function
|
|
681 (get major-mode 'find-tag-default-function)
|
|
682 'find-tag-default)))
|
|
683 (spec (completing-read (if default
|
|
684 (format "%s(default %s) " string default)
|
|
685 string)
|
|
686 'tags-complete-tag)))
|
1696
|
687 (if (equal spec "")
|
|
688 (or default (error "There is no default tag"))
|
|
689 spec)))
|
342
|
690
|
852
|
691 (defvar last-tag nil
|
|
692 "Last tag found by \\[find-tag].")
|
|
693
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
694 ;; Get interactive args for find-tag{-noselect,-other-window,-regexp}.
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
695 (defun find-tag-interactive (prompt &optional no-default)
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
696 (if current-prefix-arg
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
697 (list nil (if (< (prefix-numeric-value current-prefix-arg) 0)
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
698 '-
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
699 t))
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
700 (list (if no-default
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
701 (read-string prompt)
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
702 (find-tag-tag prompt)))))
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
703
|
7904
|
704 (defvar find-tag-history nil)
|
|
705
|
799
|
706 ;;;###autoload
|
|
707 (defun find-tag-noselect (tagname &optional next-p regexp-p)
|
|
708 "Find tag (in current tags table) whose name contains TAGNAME.
|
1555
|
709 Returns the buffer containing the tag's definition and moves its point there,
|
799
|
710 but does not select the buffer.
|
|
711 The default for TAGNAME is the expression in the buffer near point.
|
474
|
712
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
713 If second arg NEXT-P is t (interactively, with prefix arg), search for
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
714 another tag that matches the last tagname or regexp used. When there are
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
715 multiple matches for a tag, more exact matches are found first. If NEXT-P
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
716 is the atom `-' (interactively, with prefix arg that is a negative number
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
717 or just \\[negative-argument]), pop back to the previous tag gone to.
|
450
|
718
|
799
|
719 If third arg REGEXP-P is non-nil, treat TAGNAME as a regexp.
|
342
|
720
|
799
|
721 See documentation of variable `tags-file-name'."
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
722 (interactive (find-tag-interactive "Find tag: "))
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
723
|
7904
|
724 (setq find-tag-history (cons tagname find-tag-history))
|
1696
|
725 ;; Save the current buffer's value of `find-tag-hook' before selecting the
|
|
726 ;; tags table buffer.
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
727 (let ((local-find-tag-hook find-tag-hook))
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
728 (if (eq '- next-p)
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
729 ;; Pop back to a previous location.
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
730 (if (null tags-location-stack)
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
731 (error "No previous tag locations")
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
732 (let ((marker (car tags-location-stack)))
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
733 ;; Pop the stack.
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
734 (setq tags-location-stack (cdr tags-location-stack))
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
735 (prog1
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
736 ;; Move to the saved location.
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
737 (set-buffer (marker-buffer marker))
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
738 (goto-char (marker-position marker))
|
3591
|
739 ;; Kill that marker so it doesn't slow down editing.
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
740 (set-marker marker nil nil)
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
741 ;; Run the user's hook. Do we really want to do this for pop?
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
742 (run-hooks 'local-find-tag-hook))))
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
743 (if next-p
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
744 ;; Find the same table we last used.
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
745 (visit-tags-table-buffer 'same)
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
746 ;; Pick a table to use.
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
747 (visit-tags-table-buffer)
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
748 ;; Record TAGNAME for a future call with NEXT-P non-nil.
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
749 (setq last-tag tagname))
|
8973
|
750 ;; Record the location so we can pop back to it later.
|
|
751 (let ((marker (make-marker)))
|
|
752 (save-excursion
|
|
753 (set-buffer
|
|
754 ;; find-tag-in-order does the real work.
|
|
755 (find-tag-in-order
|
|
756 (if next-p last-tag tagname)
|
|
757 (if regexp-p
|
|
758 find-tag-regexp-search-function
|
|
759 find-tag-search-function)
|
|
760 (if regexp-p
|
|
761 find-tag-regexp-tag-order
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
762 find-tag-tag-order)
|
8973
|
763 (if regexp-p
|
|
764 find-tag-regexp-next-line-after-failure-p
|
|
765 find-tag-next-line-after-failure-p)
|
|
766 (if regexp-p "matching" "containing")
|
|
767 (not next-p)))
|
|
768 (set-marker marker (point))
|
|
769 (run-hooks 'local-find-tag-hook)
|
|
770 (setq tags-location-stack
|
|
771 (cons marker tags-location-stack))
|
|
772 (current-buffer))))))
|
360
|
773
|
|
774 ;;;###autoload
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
775 (defun find-tag (tagname &optional next-p regexp-p)
|
799
|
776 "Find tag (in current tags table) whose name contains TAGNAME.
|
|
777 Select the buffer containing the tag's definition, and move point there.
|
|
778 The default for TAGNAME is the expression in the buffer around or before point.
|
342
|
779
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
780 If second arg NEXT-P is t (interactively, with prefix arg), search for
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
781 another tag that matches the last tagname or regexp used. When there are
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
782 multiple matches for a tag, more exact matches are found first. If NEXT-P
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
783 is the atom `-' (interactively, with prefix arg that is a negative number
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
784 or just \\[negative-argument]), pop back to the previous tag gone to.
|
799
|
785
|
|
786 See documentation of variable `tags-file-name'."
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
787 (interactive (find-tag-interactive "Find tag: "))
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
788 (switch-to-buffer (find-tag-noselect tagname next-p regexp-p)))
|
799
|
789 ;;;###autoload (define-key esc-map "." 'find-tag)
|
342
|
790
|
727
|
791 ;;;###autoload
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
792 (defun find-tag-other-window (tagname &optional next-p regexp-p)
|
799
|
793 "Find tag (in current tags table) whose name contains TAGNAME.
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
794 Select the buffer containing the tag's definition in another window, and
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
795 move point there. The default for TAGNAME is the expression in the buffer
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
796 around or before point.
|
799
|
797
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
798 If second arg NEXT-P is t (interactively, with prefix arg), search for
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
799 another tag that matches the last tagname or regexp used. When there are
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
800 multiple matches for a tag, more exact matches are found first. If NEXT-P
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
801 is negative (interactively, with prefix arg that is a negative number or
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
802 just \\[negative-argument]), pop back to the previous tag gone to.
|
799
|
803
|
|
804 See documentation of variable `tags-file-name'."
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
805 (interactive (find-tag-interactive "Find tag other window: "))
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
806
|
1696
|
807 ;; This hair is to deal with the case where the tag is found in the
|
|
808 ;; selected window's buffer; without the hair, point is moved in both
|
|
809 ;; windows. To prevent this, we save the selected window's point before
|
|
810 ;; doing find-tag-noselect, and restore it after.
|
|
811 (let* ((window-point (window-point (selected-window)))
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
812 (tagbuf (find-tag-noselect tagname next-p regexp-p))
|
1976
|
813 (tagpoint (progn (set-buffer tagbuf) (point))))
|
1696
|
814 (set-window-point (prog1
|
|
815 (selected-window)
|
1976
|
816 (switch-to-buffer-other-window tagbuf)
|
|
817 ;; We have to set this new window's point; it
|
|
818 ;; might already have been displaying a
|
|
819 ;; different portion of tagbuf, in which case
|
|
820 ;; switch-to-buffer-other-window doesn't set
|
|
821 ;; the window's point from the buffer.
|
|
822 (set-window-point (selected-window) tagpoint))
|
1696
|
823 window-point)))
|
799
|
824 ;;;###autoload (define-key ctl-x-4-map "." 'find-tag-other-window)
|
|
825
|
804
|
826 ;;;###autoload
|
799
|
827 (defun find-tag-other-frame (tagname &optional next-p)
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
828 "Find tag (in current tags table) whose name contains TAGNAME.
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
829 Select the buffer containing the tag's definition in another frame, and
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
830 move point there. The default for TAGNAME is the expression in the buffer
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
831 around or before point.
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
832
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
833 If second arg NEXT-P is t (interactively, with prefix arg), search for
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
834 another tag that matches the last tagname or regexp used. When there are
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
835 multiple matches for a tag, more exact matches are found first. If NEXT-P
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
836 is negative (interactively, with prefix arg that is a negative number or
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
837 just \\[negative-argument]), pop back to the previous tag gone to.
|
727
|
838
|
799
|
839 See documentation of variable `tags-file-name'."
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
840 (interactive (find-tag-interactive "Find tag other frame: "))
|
799
|
841 (let ((pop-up-frames t))
|
|
842 (find-tag-other-window tagname next-p)))
|
|
843 ;;;###autoload (define-key ctl-x-5-map "." 'find-tag-other-frame)
|
342
|
844
|
360
|
845 ;;;###autoload
|
799
|
846 (defun find-tag-regexp (regexp &optional next-p other-window)
|
|
847 "Find tag (in current tags table) whose name matches REGEXP.
|
|
848 Select the buffer containing the tag's definition and move point there.
|
|
849
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
850 If second arg NEXT-P is t (interactively, with prefix arg), search for
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
851 another tag that matches the last tagname or regexp used. When there are
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
852 multiple matches for a tag, more exact matches are found first. If NEXT-P
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
853 is negative (interactively, with prefix arg that is a negative number or
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
854 just \\[negative-argument]), pop back to the previous tag gone to.
|
799
|
855
|
|
856 If third arg OTHER-WINDOW is non-nil, select the buffer in another window.
|
|
857
|
|
858 See documentation of variable `tags-file-name'."
|
2590
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
859 (interactive (find-tag-interactive "Find tag regexp: " t))
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
860 ;; We go through find-tag-other-window to do all the display hair there.
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
861 (funcall (if other-window 'find-tag-other-window 'find-tag)
|
9dace03bd76c
(find-tag-interactive): New function to read args for find-tag et al.
Roland McGrath <roland@gnu.org>
diff
changeset
|
862 regexp next-p t))
|
8187
|
863 ;;;###autoload (define-key esc-map [?\C-.] 'find-tag-regexp)
|
799
|
864
|
|
865 ;; Internal tag finding function.
|
|
866
|
|
867 ;; PATTERN is a string to pass to second arg SEARCH-FORWARD-FUNC, and to
|
|
868 ;; any member of the function list ORDER (third arg). If ORDER is nil,
|
|
869 ;; use saved state to continue a previous search.
|
|
870
|
|
871 ;; Fourth arg MATCHING is a string, an English '-ing' word, to be used in
|
|
872 ;; an error message.
|
|
873
|
|
874 ;; Fifth arg NEXT-LINE-AFTER-FAILURE-P is non-nil if after a failed match,
|
|
875 ;; point should be moved to the next line.
|
|
876
|
|
877 ;; Algorithm is as follows. For each qualifier-func in ORDER, go to
|
|
878 ;; beginning of tags file, and perform inner loop: for each naive match for
|
|
879 ;; PATTERN found using SEARCH-FORWARD-FUNC, qualify the naive match using
|
|
880 ;; qualifier-func. If it qualifies, go to the specified line in the
|
|
881 ;; specified source file and return. Qualified matches are remembered to
|
|
882 ;; avoid repetition. State is saved so that the loop can be continued.
|
|
883
|
15352
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
884 (defvar tag-lines-already-matched nil) ;matches remembered here between calls
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
885
|
1555
|
886 (defun find-tag-in-order (pattern
|
|
887 search-forward-func
|
|
888 order
|
|
889 next-line-after-failure-p
|
|
890 matching
|
|
891 first-search)
|
799
|
892 (let (file ;name of file containing tag
|
|
893 tag-info ;where to find the tag in FILE
|
|
894 (first-table t)
|
|
895 (tag-order order)
|
15352
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
896 (match-marker (make-marker))
|
799
|
897 goto-func
|
|
898 )
|
|
899 (save-excursion
|
15352
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
900
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
901 (if first-search
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
902 ;; This is the start of a search for a fresh tag.
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
903 ;; Clear the list of tags matched by the previous search.
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
904 ;; find-tag-noselect has already put us in the first tags table
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
905 ;; buffer before we got called.
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
906 (setq tag-lines-already-matched nil)
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
907 ;; Continuing to search for the tag specified last time.
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
908 ;; tag-lines-already-matched lists locations matched in previous
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
909 ;; calls so we don't visit the same tag twice if it matches twice
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
910 ;; during two passes with different qualification predicates.
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
911 ;; Switch to the current tags table buffer.
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
912 (visit-tags-table-buffer 'same))
|
1149
|
913
|
799
|
914 ;; Get a qualified match.
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
915 (catch 'qualified-match-found
|
1149
|
916
|
1696
|
917 ;; Iterate over the list of tags tables.
|
799
|
918 (while (or first-table
|
|
919 (visit-tags-table-buffer t))
|
|
920
|
884
|
921 (and first-search first-table
|
|
922 ;; Start at beginning of tags file.
|
|
923 (goto-char (point-min)))
|
10661
|
924
|
884
|
925 (setq first-table nil)
|
799
|
926
|
1696
|
927 ;; Iterate over the list of ordering predicates.
|
799
|
928 (while order
|
|
929 (while (funcall search-forward-func pattern nil t)
|
|
930 ;; Naive match found. Qualify the match.
|
|
931 (and (funcall (car order) pattern)
|
|
932 ;; Make sure it is not a previous qualified match.
|
15352
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
933 (not (member (set-marker match-marker (save-excursion
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
934 (beginning-of-line)
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
935 (point)))
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
936 tag-lines-already-matched))
|
799
|
937 (throw 'qualified-match-found nil))
|
|
938 (if next-line-after-failure-p
|
|
939 (forward-line 1)))
|
|
940 ;; Try the next flavor of match.
|
|
941 (setq order (cdr order))
|
|
942 (goto-char (point-min)))
|
|
943 (setq order tag-order))
|
|
944 ;; We throw out on match, so only get here if there were no matches.
|
15352
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
945 ;; Clear out the markers we use to avoid duplicate matches so they
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
946 ;; don't slow down editting and are immediately available for GC.
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
947 (while tag-lines-already-matched
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
948 (set-marker (car tag-lines-already-matched) nil nil)
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
949 (setq tag-lines-already-matched (cdr tag-lines-already-matched)))
|
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
950 (set-marker match-marker nil nil)
|
799
|
951 (error "No %stags %s %s" (if first-search "" "more ")
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
952 matching pattern))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
953
|
799
|
954 ;; Found a tag; extract location info.
|
|
955 (beginning-of-line)
|
15352
e648211d5bac
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
diff
changeset
|
956 (setq tag-lines-already-matched (cons match-marker
|
799
|
957 tag-lines-already-matched))
|
|
958 ;; Expand the filename, using the tags table buffer's default-directory.
|
|
959 (setq file (expand-file-name (file-of-tag))
|
|
960 tag-info (funcall snarf-tag-function))
|
|
961
|
1696
|
962 ;; Get the local value in the tags table buffer before switching buffers.
|
799
|
963 (setq goto-func goto-tag-location-function)
|
|
964
|
|
965 ;; Find the right line in the specified file.
|
|
966 (set-buffer (find-file-noselect file))
|
|
967 (widen)
|
|
968 (push-mark)
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
969 (funcall goto-func tag-info)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
970
|
799
|
971 ;; Return the buffer where the tag was found.
|
|
972 (current-buffer))))
|
|
973
|
|
974 ;; `etags' TAGS file format support.
|
|
975
|
1696
|
976 ;; If the current buffer is a valid etags TAGS file, give it local values of
|
|
977 ;; the tags table format variables, and return non-nil.
|
799
|
978 (defun etags-recognize-tags-table ()
|
1696
|
979 (and (etags-verify-tags-table)
|
1136
|
980 ;; It is annoying to flash messages on the screen briefly,
|
|
981 ;; and this message is not useful. -- rms
|
|
982 ;; (message "%s is an `etags' TAGS file" buffer-file-name)
|
799
|
983 (mapcar (function (lambda (elt)
|
1696
|
984 (set (make-local-variable (car elt)) (cdr elt))))
|
799
|
985 '((file-of-tag-function . etags-file-of-tag)
|
|
986 (tags-table-files-function . etags-tags-table-files)
|
|
987 (tags-completion-table-function . etags-tags-completion-table)
|
|
988 (snarf-tag-function . etags-snarf-tag)
|
|
989 (goto-tag-location-function . etags-goto-tag-location)
|
|
990 (find-tag-regexp-search-function . re-search-forward)
|
|
991 (find-tag-regexp-tag-order . (tag-re-match-p))
|
3548
|
992 (find-tag-regexp-next-line-after-failure-p . t)
|
799
|
993 (find-tag-search-function . search-forward)
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
994 (find-tag-tag-order . (tag-exact-file-name-match-p
|
10661
|
995 tag-exact-match-p
|
9021
|
996 tag-symbol-match-p
|
|
997 tag-word-match-p
|
|
998 tag-any-match-p))
|
799
|
999 (find-tag-next-line-after-failure-p . nil)
|
|
1000 (list-tags-function . etags-list-tags)
|
|
1001 (tags-apropos-function . etags-tags-apropos)
|
|
1002 (tags-included-tables-function . etags-tags-included-tables)
|
|
1003 (verify-tags-table-function . etags-verify-tags-table)
|
|
1004 ))))
|
|
1005
|
1696
|
1006 ;; Return non-nil iff the current buffer is a valid etags TAGS file.
|
799
|
1007 (defun etags-verify-tags-table ()
|
1723
4023bea27d64
(etags-verify-tags-table): Use eq instead of = in case char-after returns
Roland McGrath <roland@gnu.org>
diff
changeset
|
1008 ;; Use eq instead of = in case char-after returns nil.
|
4023bea27d64
(etags-verify-tags-table): Use eq instead of = in case char-after returns
Roland McGrath <roland@gnu.org>
diff
changeset
|
1009 (eq (char-after 1) ?\f))
|
799
|
1010
|
|
1011 (defun etags-file-of-tag ()
|
|
1012 (save-excursion
|
16367
|
1013 (re-search-backward "\f\n\\([^\n]+\\),[0-9]*\n")
|
16625
|
1014 (expand-file-name (buffer-substring (match-beginning 1) (match-end 1))
|
|
1015 (file-truename default-directory))))
|
799
|
1016
|
10680
|
1017
|
799
|
1018 (defun etags-tags-completion-table ()
|
|
1019 (let ((table (make-vector 511 0)))
|
|
1020 (save-excursion
|
|
1021 (goto-char (point-min))
|
2448
|
1022 ;; This monster regexp matches an etags tag line.
|
|
1023 ;; \1 is the string to match;
|
|
1024 ;; \2 is not interesting;
|
|
1025 ;; \3 is the guessed tag name; XXX guess should be better eg DEFUN
|
4407
|
1026 ;; \4 is not interesting;
|
|
1027 ;; \5 is the explicitly-specified tag name.
|
|
1028 ;; \6 is the line to start searching at;
|
|
1029 ;; \7 is the char to start searching at.
|
2448
|
1030 (while (re-search-forward
|
10429
c37ee605ba79
(etags-tags-completion-table): Don't let match string contain a \177.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1031 "^\\(\\([^\177]+[^-a-zA-Z0-9_$\177]+\\)?\\([-a-zA-Z0-9_$?:]+\\)\
|
c37ee605ba79
(etags-tags-completion-table): Don't let match string contain a \177.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1032 \[^-a-zA-Z0-9_$?:\177]*\\)\177\\(\\([^\n\001]+\\)\001\\)?\
|
6244
3ad3a0150b6d
(etags-tags-completion-table): Let the line number or char pos be empty.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1033 \\([0-9]+\\)?,\\([0-9]+\\)?\n"
|
2448
|
1034 nil t)
|
4407
|
1035 (intern (if (match-beginning 5)
|
2448
|
1036 ;; There is an explicit tag name.
|
4407
|
1037 (buffer-substring (match-beginning 5) (match-end 5))
|
2448
|
1038 ;; No explicit tag name. Best guess.
|
|
1039 (buffer-substring (match-beginning 3) (match-end 3)))
|
|
1040 table)))
|
799
|
1041 table))
|
|
1042
|
|
1043 (defun etags-snarf-tag ()
|
6244
3ad3a0150b6d
(etags-tags-completion-table): Let the line number or char pos be empty.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1044 (let (tag-text line startpos)
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1045 (if (save-excursion
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1046 (forward-line -1)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1047 (looking-at "\f\n"))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1048 ;; The match was for a source file name, not any tag within a file.
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1049 ;; Give text of t, meaning to go exactly to the location we specify,
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1050 ;; the beginning of the file.
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1051 (setq tag-text t
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1052 line nil
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1053 startpos 1)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1054
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1055 ;; Find the end of the tag and record the whole tag text.
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1056 (search-forward "\177")
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1057 (setq tag-text (buffer-substring (1- (point))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1058 (save-excursion (beginning-of-line)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1059 (point))))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1060 ;; Skip explicit tag name if present.
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1061 (search-forward "\001" (save-excursion (forward-line 1) (point)) t)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1062 (if (looking-at "[0-9]")
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1063 (setq line (string-to-int (buffer-substring
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1064 (point)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1065 (progn (skip-chars-forward "0-9")
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1066 (point))))))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1067 (search-forward ",")
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1068 (if (looking-at "[0-9]")
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1069 (setq startpos (string-to-int (buffer-substring
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1070 (point)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1071 (progn (skip-chars-forward "0-9")
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1072 (point)))))))
|
799
|
1073 ;; Leave point on the next line of the tags file.
|
|
1074 (forward-line 1)
|
6244
3ad3a0150b6d
(etags-tags-completion-table): Let the line number or char pos be empty.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1075 (cons tag-text (cons line startpos))))
|
799
|
1076
|
6244
3ad3a0150b6d
(etags-tags-completion-table): Let the line number or char pos be empty.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1077 ;; TAG-INFO is a cons (TEXT LINE . POSITION) where TEXT is the initial part
|
3ad3a0150b6d
(etags-tags-completion-table): Let the line number or char pos be empty.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1078 ;; of a line containing the tag and POSITION is the character position of
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1079 ;; TEXT within the file (starting from 1); LINE is the line number. If
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1080 ;; TEXT is t, it means the tag refers to exactly LINE or POSITION
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1081 ;; (whichever is present, LINE having preference, no searching. Either
|
6244
3ad3a0150b6d
(etags-tags-completion-table): Let the line number or char pos be empty.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1082 ;; LINE or POSITION may be nil; POSITION is used if present. If the tag
|
3ad3a0150b6d
(etags-tags-completion-table): Let the line number or char pos be empty.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1083 ;; isn't exactly at the given position then look around that position using
|
3ad3a0150b6d
(etags-tags-completion-table): Let the line number or char pos be empty.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1084 ;; a search window which expands until it hits the start of file.
|
799
|
1085 (defun etags-goto-tag-location (tag-info)
|
6244
3ad3a0150b6d
(etags-tags-completion-table): Let the line number or char pos be empty.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1086 (let ((startpos (cdr (cdr tag-info)))
|
15770
|
1087 (line (car (cdr tag-info)))
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1088 offset found pat)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1089 (if (eq (car tag-info) t)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1090 ;; Direct file tag.
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1091 (cond (line (goto-line line))
|
15770
|
1092 (startpos (goto-char startpos))
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1093 (t (error "etags.el BUG: bogus direct file tag")))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1094 ;; This constant is 1/2 the initial search window.
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1095 ;; There is no sense in making it too small,
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1096 ;; since just going around the loop once probably
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1097 ;; costs about as much as searching 2000 chars.
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1098 (setq offset 1000
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1099 found nil
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1100 pat (concat (if (eq selective-display t)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1101 "\\(^\\|\^m\\)" "^")
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1102 (regexp-quote (car tag-info))))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1103 ;; The character position in the tags table is 0-origin.
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1104 ;; Convert it to a 1-origin Emacs character position.
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1105 (if startpos (setq startpos (1+ startpos)))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1106 ;; If no char pos was given, try the given line number.
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1107 (or startpos
|
15770
|
1108 (if line
|
|
1109 (setq startpos (progn (goto-line line)
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1110 (point)))))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1111 (or startpos
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1112 (setq startpos (point-min)))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1113 ;; First see if the tag is right at the specified location.
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1114 (goto-char startpos)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1115 (setq found (looking-at pat))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1116 (while (and (not found)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1117 (progn
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1118 (goto-char (- startpos offset))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1119 (not (bobp))))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1120 (setq found
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1121 (re-search-forward pat (+ startpos offset) t)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1122 offset (* 3 offset))) ; expand search window
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1123 (or found
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1124 (re-search-forward pat nil t)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1125 (error "Rerun etags: `%s' not found in %s"
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1126 pat buffer-file-name)))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1127 ;; Position point at the right place
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1128 ;; if the search string matched an extra Ctrl-m at the beginning.
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1129 (and (eq selective-display t)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1130 (looking-at "\^m")
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1131 (forward-char 1))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1132 (beginning-of-line)))
|
799
|
1133
|
|
1134 (defun etags-list-tags (file)
|
|
1135 (goto-char 1)
|
|
1136 (if (not (search-forward (concat "\f\n" file ",") nil t))
|
|
1137 nil
|
|
1138 (forward-line 1)
|
|
1139 (while (not (or (eobp) (looking-at "\f")))
|
6245
|
1140 (let ((tag (buffer-substring (point)
|
|
1141 (progn (skip-chars-forward "^\177")
|
|
1142 (point)))))
|
|
1143 (princ (if (looking-at "[^\n]+\001")
|
|
1144 ;; There is an explicit tag name; use that.
|
15360
6243be11f0e3
(etags-list-tags): When there is an explicit tag name, skip the \177 before
Roland McGrath <roland@gnu.org>
diff
changeset
|
1145 (buffer-substring (1+ (point)) ;skip \177
|
6245
|
1146 (progn (skip-chars-forward "^\001")
|
|
1147 (point)))
|
|
1148 tag)))
|
799
|
1149 (terpri)
|
4940
|
1150 (forward-line 1))
|
|
1151 t))
|
799
|
1152
|
|
1153 (defun etags-tags-apropos (string)
|
|
1154 (goto-char 1)
|
|
1155 (while (re-search-forward string nil t)
|
|
1156 (beginning-of-line)
|
|
1157 (princ (buffer-substring (point)
|
|
1158 (progn (skip-chars-forward "^\177")
|
|
1159 (point))))
|
|
1160 (terpri)
|
|
1161 (forward-line 1)))
|
|
1162
|
|
1163 (defun etags-tags-table-files ()
|
|
1164 (let ((files nil)
|
|
1165 beg)
|
|
1166 (goto-char (point-min))
|
|
1167 (while (search-forward "\f\n" nil t)
|
|
1168 (setq beg (point))
|
9579
|
1169 (end-of-line)
|
|
1170 (skip-chars-backward "^," beg)
|
|
1171 (or (looking-at "include$")
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1172 (setq files (cons (buffer-substring beg (1- (point))) files))))
|
799
|
1173 (nreverse files)))
|
|
1174
|
|
1175 (defun etags-tags-included-tables ()
|
|
1176 (let ((files nil)
|
|
1177 beg)
|
|
1178 (goto-char (point-min))
|
|
1179 (while (search-forward "\f\n" nil t)
|
|
1180 (setq beg (point))
|
9579
|
1181 (end-of-line)
|
|
1182 (skip-chars-backward "^," beg)
|
|
1183 (if (looking-at "include$")
|
799
|
1184 ;; Expand in the default-directory of the tags table buffer.
|
9579
|
1185 (setq files (cons (expand-file-name (buffer-substring beg (1- (point))))
|
799
|
1186 files))))
|
|
1187 (nreverse files)))
|
|
1188
|
|
1189 ;; Empty tags file support.
|
|
1190
|
1696
|
1191 ;; Recognize an empty file and give it local values of the tags table format
|
|
1192 ;; variables which do nothing.
|
799
|
1193 (defun recognize-empty-tags-table ()
|
|
1194 (and (zerop (buffer-size))
|
|
1195 (mapcar (function (lambda (sym)
|
1696
|
1196 (set (make-local-variable sym) 'ignore)))
|
799
|
1197 '(tags-table-files-function
|
|
1198 tags-completion-table-function
|
|
1199 find-tag-regexp-search-function
|
|
1200 find-tag-search-function
|
|
1201 tags-apropos-function
|
|
1202 tags-included-tables-function))
|
|
1203 (set (make-local-variable 'verify-tags-table-function)
|
|
1204 (function (lambda ()
|
|
1205 (zerop (buffer-size)))))))
|
|
1206
|
|
1207 ;;; Match qualifier functions for tagnames.
|
1696
|
1208 ;;; XXX these functions assume etags file format.
|
799
|
1209
|
884
|
1210 ;; This might be a neat idea, but it's too hairy at the moment.
|
|
1211 ;;(defmacro tags-with-syntax (&rest body)
|
|
1212 ;; (` (let ((current (current-buffer))
|
|
1213 ;; (otable (syntax-table))
|
|
1214 ;; (buffer (find-file-noselect (file-of-tag)))
|
|
1215 ;; table)
|
|
1216 ;; (unwind-protect
|
|
1217 ;; (progn
|
|
1218 ;; (set-buffer buffer)
|
|
1219 ;; (setq table (syntax-table))
|
|
1220 ;; (set-buffer current)
|
|
1221 ;; (set-syntax-table table)
|
|
1222 ;; (,@ body))
|
|
1223 ;; (set-syntax-table otable)))))
|
|
1224 ;;(put 'tags-with-syntax 'edebug-form-spec '(&rest form))
|
877
|
1225
|
9021
|
1226 ;; t if point is at a tag line that matches TAG exactly.
|
799
|
1227 ;; point should be just after a string that matches TAG.
|
884
|
1228 (defun tag-exact-match-p (tag)
|
4666
674082454a0c
(tag-exact-match-p): Return true if TAG is the explicit tag name.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1229 ;; The match is really exact if there is an explicit tag name.
|
8081
6099d3d43685
(tag-exact-match-p): Test for point sitting after the explicit tag name
Roland McGrath <roland@gnu.org>
diff
changeset
|
1230 (or (and (eq (char-after (point)) ?\001)
|
8082
|
1231 (eq (char-after (- (point) (length tag) 1)) ?\177))
|
8081
6099d3d43685
(tag-exact-match-p): Test for point sitting after the explicit tag name
Roland McGrath <roland@gnu.org>
diff
changeset
|
1232 ;; We are not on the explicit tag name, but perhaps it follows.
|
9021
|
1233 (looking-at (concat "[^\177\n]*\177" (regexp-quote tag) "\001"))))
|
|
1234
|
|
1235 ;; t if point is at a tag line that matches TAG as a symbol.
|
|
1236 ;; point should be just after a string that matches TAG.
|
|
1237 (defun tag-symbol-match-p (tag)
|
|
1238 (and (looking-at "\\Sw.*\177") (looking-at "\\S_.*\177")
|
|
1239 (save-excursion
|
|
1240 (backward-char (1+ (length tag)))
|
|
1241 (and (looking-at "\\Sw") (looking-at "\\S_")))))
|
799
|
1242
|
|
1243 ;; t if point is at a tag line that matches TAG as a word.
|
|
1244 ;; point should be just after a string that matches TAG.
|
|
1245 (defun tag-word-match-p (tag)
|
|
1246 (and (looking-at "\\b.*\177")
|
15770
|
1247 (save-excursion (backward-char (length tag))
|
799
|
1248 (looking-at "\\b"))))
|
|
1249
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1250 (defun tag-exact-file-name-match-p (tag)
|
10661
|
1251 (and (looking-at ",")
|
15775
|
1252 (save-excursion (backward-char (length tag))
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1253 (looking-at "\f\n"))))
|
10661
|
1254
|
799
|
1255 ;; t if point is in a tag line with a tag containing TAG as a substring.
|
|
1256 (defun tag-any-match-p (tag)
|
|
1257 (looking-at ".*\177"))
|
|
1258
|
|
1259 ;; t if point is at a tag line that matches RE as a regexp.
|
|
1260 (defun tag-re-match-p (re)
|
|
1261 (save-excursion
|
|
1262 (beginning-of-line)
|
|
1263 (let ((bol (point)))
|
|
1264 (and (search-forward "\177" (save-excursion (end-of-line) (point)) t)
|
|
1265 (re-search-backward re bol t)))))
|
|
1266
|
|
1267 ;;;###autoload
|
|
1268 (defun next-file (&optional initialize novisit)
|
|
1269 "Select next file among files in current tags table.
|
4661
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1270
|
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1271 A first argument of t (prefix arg, if interactive) initializes to the
|
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1272 beginning of the list of files in the tags table. If the argument is
|
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1273 neither nil nor t, it is evalled to initialize the list of files.
|
799
|
1274
|
|
1275 Non-nil second argument NOVISIT means use a temporary buffer
|
|
1276 to save time and avoid uninteresting warnings.
|
|
1277
|
|
1278 Value is nil if the file was already visited;
|
|
1279 if the file was newly read in, the value is the filename."
|
13576
|
1280 ;; Make the interactive arg t if there was any prefix arg.
|
|
1281 (interactive (list (if current-prefix-arg t)))
|
4661
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1282 (cond ((not initialize)
|
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1283 ;; Not the first run.
|
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1284 )
|
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1285 ((eq initialize t)
|
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1286 ;; Initialize the list from the tags table.
|
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1287 (save-excursion
|
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1288 ;; Visit the tags table buffer to get its list of files.
|
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1289 (visit-tags-table-buffer)
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1290 ;; Copy the list so we can setcdr below, and expand the file
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1291 ;; names while we are at it, in this buffer's default directory.
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1292 (setq next-file-list (mapcar 'expand-file-name (tags-table-files)))
|
9631
a5bd0b6b080e
(next-file): Initialize next-file-list all at once from all tables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1293 ;; Iterate over all the tags table files, collecting
|
a5bd0b6b080e
(next-file): Initialize next-file-list all at once from all tables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1294 ;; a complete list of referenced file names.
|
a5bd0b6b080e
(next-file): Initialize next-file-list all at once from all tables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1295 (while (visit-tags-table-buffer t)
|
a5bd0b6b080e
(next-file): Initialize next-file-list all at once from all tables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1296 ;; Find the tail of the working list and chain on the new
|
a5bd0b6b080e
(next-file): Initialize next-file-list all at once from all tables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1297 ;; sublist for this tags table.
|
a5bd0b6b080e
(next-file): Initialize next-file-list all at once from all tables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1298 (let ((tail next-file-list))
|
a5bd0b6b080e
(next-file): Initialize next-file-list all at once from all tables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1299 (while (cdr tail)
|
a5bd0b6b080e
(next-file): Initialize next-file-list all at once from all tables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1300 (setq tail (cdr tail)))
|
a5bd0b6b080e
(next-file): Initialize next-file-list all at once from all tables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1301 ;; Use a copy so the next loop iteration will not modify the
|
a5bd0b6b080e
(next-file): Initialize next-file-list all at once from all tables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1302 ;; list later returned by (tags-table-files).
|
11316
|
1303 (if tail
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1304 (setcdr tail (mapcar 'expand-file-name (tags-table-files)))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1305 (setq next-file-list (mapcar 'expand-file-name
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1306 (tags-table-files))))))))
|
4661
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1307 (t
|
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1308 ;; Initialize the list by evalling the argument.
|
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1309 (setq next-file-list (eval initialize))))
|
9631
a5bd0b6b080e
(next-file): Initialize next-file-list all at once from all tables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1310 (if next-file-list
|
a5bd0b6b080e
(next-file): Initialize next-file-list all at once from all tables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1311 ()
|
a5bd0b6b080e
(next-file): Initialize next-file-list all at once from all tables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1312 (and novisit
|
a5bd0b6b080e
(next-file): Initialize next-file-list all at once from all tables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1313 (get-buffer " *next-file*")
|
a5bd0b6b080e
(next-file): Initialize next-file-list all at once from all tables.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1314 (kill-buffer " *next-file*"))
|
18623
|
1315 (error "All files processed"))
|
12942
3685b0e52d2a
(next-file): Advance next-file-list before finding the file named in its
Roland McGrath <roland@gnu.org>
diff
changeset
|
1316 (let* ((next (car next-file-list))
|
3685b0e52d2a
(next-file): Advance next-file-list before finding the file named in its
Roland McGrath <roland@gnu.org>
diff
changeset
|
1317 (new (not (get-file-buffer next))))
|
3685b0e52d2a
(next-file): Advance next-file-list before finding the file named in its
Roland McGrath <roland@gnu.org>
diff
changeset
|
1318 ;; Advance the list before trying to find the file.
|
3685b0e52d2a
(next-file): Advance next-file-list before finding the file named in its
Roland McGrath <roland@gnu.org>
diff
changeset
|
1319 ;; If we get an error finding the file, don't get stuck on it.
|
3685b0e52d2a
(next-file): Advance next-file-list before finding the file named in its
Roland McGrath <roland@gnu.org>
diff
changeset
|
1320 (setq next-file-list (cdr next-file-list))
|
799
|
1321 (if (not (and new novisit))
|
12942
3685b0e52d2a
(next-file): Advance next-file-list before finding the file named in its
Roland McGrath <roland@gnu.org>
diff
changeset
|
1322 (set-buffer (find-file-noselect next novisit))
|
799
|
1323 ;; Like find-file, but avoids random warning messages.
|
|
1324 (set-buffer (get-buffer-create " *next-file*"))
|
|
1325 (kill-all-local-variables)
|
|
1326 (erase-buffer)
|
12942
3685b0e52d2a
(next-file): Advance next-file-list before finding the file named in its
Roland McGrath <roland@gnu.org>
diff
changeset
|
1327 (setq new next)
|
799
|
1328 (insert-file-contents new nil))
|
|
1329 new))
|
342
|
1330
|
799
|
1331 (defvar tags-loop-operate nil
|
|
1332 "Form for `tags-loop-continue' to eval to change one file.")
|
|
1333
|
1808
|
1334 (defvar tags-loop-scan
|
14420
071f9717597f
(visit-tags-table-buffer, tags-loop-scan, complete-tag): Fix error format
Karl Heuer <kwzh@gnu.org>
diff
changeset
|
1335 '(error "%s"
|
071f9717597f
(visit-tags-table-buffer, tags-loop-scan, complete-tag): Fix error format
Karl Heuer <kwzh@gnu.org>
diff
changeset
|
1336 (substitute-command-keys
|
18623
|
1337 "No \\[tags-search] or \\[tags-query-replace] in progress"))
|
799
|
1338 "Form for `tags-loop-continue' to eval to scan one file.
|
|
1339 If it returns non-nil, this file needs processing by evalling
|
|
1340 \`tags-loop-operate'. Otherwise, move on to the next file.")
|
342
|
1341
|
360
|
1342 ;;;###autoload
|
342
|
1343 (defun tags-loop-continue (&optional first-time)
|
|
1344 "Continue last \\[tags-search] or \\[tags-query-replace] command.
|
4661
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1345 Used noninteractively with non-nil argument to begin such a command (the
|
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1346 argument is passed to `next-file', which see).
|
11792
|
1347
|
|
1348 Two variables control the processing we do on each file: the value of
|
|
1349 `tags-loop-scan' is a form to be executed on each file to see if it is
|
|
1350 interesting (it returns non-nil if so) and `tags-loop-operate' is a form to
|
|
1351 evaluate to operate on an interesting file. If the latter evaluates to
|
|
1352 nil, we exit; otherwise we scan the next file."
|
342
|
1353 (interactive)
|
799
|
1354 (let (new
|
|
1355 (messaged nil))
|
|
1356 (while
|
|
1357 (progn
|
|
1358 ;; Scan files quickly for the first or next interesting one.
|
|
1359 (while (or first-time
|
|
1360 (save-restriction
|
|
1361 (widen)
|
|
1362 (not (eval tags-loop-scan))))
|
|
1363 (setq new (next-file first-time t))
|
|
1364 ;; If NEW is non-nil, we got a temp buffer,
|
|
1365 ;; and NEW is the file name.
|
|
1366 (if (or messaged
|
|
1367 (and (not first-time)
|
|
1368 (> baud-rate search-slow-speed)
|
|
1369 (setq messaged t)))
|
|
1370 (message "Scanning file %s..." (or new buffer-file-name)))
|
|
1371 (setq first-time nil)
|
|
1372 (goto-char (point-min)))
|
|
1373
|
|
1374 ;; If we visited it in a temp buffer, visit it now for real.
|
|
1375 (if new
|
|
1376 (let ((pos (point)))
|
|
1377 (erase-buffer)
|
|
1378 (set-buffer (find-file-noselect new))
|
11792
|
1379 (setq new nil) ;No longer in a temp buffer.
|
799
|
1380 (widen)
|
|
1381 (goto-char pos)))
|
|
1382
|
|
1383 (switch-to-buffer (current-buffer))
|
|
1384
|
|
1385 ;; Now operate on the file.
|
|
1386 ;; If value is non-nil, continue to scan the next file.
|
|
1387 (eval tags-loop-operate)))
|
|
1388 (and messaged
|
|
1389 (null tags-loop-operate)
|
|
1390 (message "Scanning file %s...found" buffer-file-name))))
|
|
1391 ;;;###autoload (define-key esc-map "," 'tags-loop-continue)
|
342
|
1392
|
360
|
1393 ;;;###autoload
|
4661
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1394 (defun tags-search (regexp &optional file-list-form)
|
799
|
1395 "Search through all files listed in tags table for match for REGEXP.
|
342
|
1396 Stops when a match is found.
|
|
1397 To continue searching for next match, use command \\[tags-loop-continue].
|
|
1398
|
799
|
1399 See documentation of variable `tags-file-name'."
|
342
|
1400 (interactive "sTags search (regexp): ")
|
|
1401 (if (and (equal regexp "")
|
799
|
1402 (eq (car tags-loop-scan) 're-search-forward)
|
1696
|
1403 (null tags-loop-operate))
|
799
|
1404 ;; Continue last tags-search as if by M-,.
|
342
|
1405 (tags-loop-continue nil)
|
799
|
1406 (setq tags-loop-scan
|
11482
d81023e5f033
(tags-search, tags-query-replace): Put (quote ...) around args inserted
Roland McGrath <roland@gnu.org>
diff
changeset
|
1407 (list 're-search-forward (list 'quote regexp) nil t)
|
799
|
1408 tags-loop-operate nil)
|
4661
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1409 (tags-loop-continue (or file-list-form t))))
|
342
|
1410
|
360
|
1411 ;;;###autoload
|
4661
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1412 (defun tags-query-replace (from to &optional delimited file-list-form)
|
799
|
1413 "Query-replace-regexp FROM with TO through all files listed in tags table.
|
342
|
1414 Third arg DELIMITED (prefix arg) means replace only word-delimited matches.
|
799
|
1415 If you exit (\\[keyboard-quit] or ESC), you can resume the query-replace
|
342
|
1416 with the command \\[tags-loop-continue].
|
|
1417
|
799
|
1418 See documentation of variable `tags-file-name'."
|
9941
6d82f17895cf
(tags-query-replace): Use query-replace-read-args in interactive spec.
Roland McGrath <roland@gnu.org>
diff
changeset
|
1419 (interactive (query-replace-read-args "Tags query replace (regexp)" t))
|
804
|
1420 (setq tags-loop-scan (list 'prog1
|
11482
d81023e5f033
(tags-search, tags-query-replace): Put (quote ...) around args inserted
Roland McGrath <roland@gnu.org>
diff
changeset
|
1421 (list 'if (list 're-search-forward
|
d81023e5f033
(tags-search, tags-query-replace): Put (quote ...) around args inserted
Roland McGrath <roland@gnu.org>
diff
changeset
|
1422 (list 'quote from) nil t)
|
804
|
1423 ;; When we find a match, move back
|
|
1424 ;; to the beginning of it so perform-replace
|
|
1425 ;; will see it.
|
|
1426 '(goto-char (match-beginning 0))))
|
11482
d81023e5f033
(tags-search, tags-query-replace): Put (quote ...) around args inserted
Roland McGrath <roland@gnu.org>
diff
changeset
|
1427 tags-loop-operate (list 'perform-replace
|
d81023e5f033
(tags-search, tags-query-replace): Put (quote ...) around args inserted
Roland McGrath <roland@gnu.org>
diff
changeset
|
1428 (list 'quote from) (list 'quote to)
|
d81023e5f033
(tags-search, tags-query-replace): Put (quote ...) around args inserted
Roland McGrath <roland@gnu.org>
diff
changeset
|
1429 t t (list 'quote delimited)))
|
4661
8ca17ed2aeb8
(next-file): If arg is neither t nor nil, then eval it to return initial
Roland McGrath <roland@gnu.org>
diff
changeset
|
1430 (tags-loop-continue (or file-list-form t)))
|
799
|
1431
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1432 (defun tags-complete-tags-table-file (string predicate what)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1433 (save-excursion
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1434 ;; If we need to ask for the tag table, allow that.
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1435 (let ((enable-recursive-minibuffers t))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1436 (visit-tags-table-buffer))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1437 (if (eq what t)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1438 (all-completions string (mapcar 'list (tags-table-files))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1439 predicate)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1440 (try-completion string (mapcar 'list (tags-table-files))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1441 predicate))))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1442
|
799
|
1443 ;;;###autoload
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1444 (defun list-tags (file &optional next-match)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1445 "Display list of tags in file FILE.
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1446 This searches only the first table in the list, and no included tables.
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1447 FILE should be as it appeared in the `etags' command, usually without a
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1448 directory specification."
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1449 (interactive (list (completing-read "List tags in file: "
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1450 'tags-complete-tags-table-file
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1451 nil t nil)))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1452 (with-output-to-temp-buffer "*Tags List*"
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1453 (princ "Tags in file ")
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1454 (princ file)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1455 (terpri)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1456 (save-excursion
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1457 (let ((first-time t)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1458 (gotany nil))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1459 (while (visit-tags-table-buffer (not first-time))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1460 (setq first-time nil)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1461 (if (funcall list-tags-function file)
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1462 (setq gotany t)))
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1463 (or gotany
|
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1464 (error "File %s not in current tags tables" file))))))
|
342
|
1465
|
360
|
1466 ;;;###autoload
|
799
|
1467 (defun tags-apropos (regexp)
|
|
1468 "Display list of all tags in tags table REGEXP matches."
|
|
1469 (interactive "sTags apropos (regexp): ")
|
342
|
1470 (with-output-to-temp-buffer "*Tags List*"
|
799
|
1471 (princ "Tags matching regexp ")
|
|
1472 (prin1 regexp)
|
342
|
1473 (terpri)
|
|
1474 (save-excursion
|
1149
|
1475 (let ((first-time t))
|
|
1476 (while (visit-tags-table-buffer (not first-time))
|
|
1477 (setq first-time nil)
|
1151
|
1478 (funcall tags-apropos-function regexp))))))
|
799
|
1479
|
|
1480 ;;; XXX Kludge interface.
|
342
|
1481
|
799
|
1482 ;; XXX If a file is in multiple tables, selection may get the wrong one.
|
804
|
1483 ;;;###autoload
|
799
|
1484 (defun select-tags-table ()
|
|
1485 "Select a tags table file from a menu of those you have already used.
|
8456
|
1486 The list of tags tables to select from is stored in `tags-table-set-list';
|
799
|
1487 see the doc of that variable if you want to add names to the list."
|
|
1488 (interactive)
|
|
1489 (pop-to-buffer "*Tags Table List*")
|
|
1490 (setq buffer-read-only nil)
|
|
1491 (erase-buffer)
|
|
1492 (let ((set-list tags-table-set-list)
|
|
1493 (desired-point nil))
|
|
1494 (if tags-table-list
|
|
1495 (progn
|
|
1496 (setq desired-point (point-marker))
|
|
1497 (princ tags-table-list (current-buffer))
|
|
1498 (insert "\C-m")
|
|
1499 (prin1 (car tags-table-list) (current-buffer)) ;invisible
|
|
1500 (insert "\n")))
|
|
1501 (while set-list
|
|
1502 (if (eq (car set-list) tags-table-list)
|
|
1503 ;; Already printed it.
|
|
1504 ()
|
|
1505 (princ (car set-list) (current-buffer))
|
|
1506 (insert "\C-m")
|
|
1507 (prin1 (car (car set-list)) (current-buffer)) ;invisible
|
|
1508 (insert "\n"))
|
|
1509 (setq set-list (cdr set-list)))
|
|
1510 (if tags-file-name
|
|
1511 (progn
|
|
1512 (or desired-point
|
|
1513 (setq desired-point (point-marker)))
|
|
1514 (insert tags-file-name "\C-m")
|
|
1515 (prin1 tags-file-name (current-buffer)) ;invisible
|
|
1516 (insert "\n")))
|
|
1517 (setq set-list (delete tags-file-name
|
13341
c26492df6218
(select-tags-table): Don't modify the value of tags-table-list.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1518 (apply 'nconc (cons (copy-sequence tags-table-list)
|
799
|
1519 (mapcar 'copy-sequence
|
|
1520 tags-table-set-list)))))
|
|
1521 (while set-list
|
|
1522 (insert (car set-list) "\C-m")
|
|
1523 (prin1 (car set-list) (current-buffer)) ;invisible
|
|
1524 (insert "\n")
|
|
1525 (setq set-list (delete (car set-list) set-list)))
|
|
1526 (goto-char 1)
|
|
1527 (insert-before-markers
|
|
1528 "Type `t' to select a tags table or set of tags tables:\n\n")
|
|
1529 (if desired-point
|
|
1530 (goto-char desired-point))
|
|
1531 (set-window-start (selected-window) 1 t))
|
|
1532 (set-buffer-modified-p nil)
|
7645
|
1533 (select-tags-table-mode))
|
|
1534
|
|
1535 (defvar select-tags-table-mode-map)
|
|
1536 (let ((map (make-sparse-keymap)))
|
|
1537 (define-key map "t" 'select-tags-table-select)
|
|
1538 (define-key map " " 'next-line)
|
|
1539 (define-key map "\^?" 'previous-line)
|
|
1540 (define-key map "n" 'next-line)
|
|
1541 (define-key map "p" 'previous-line)
|
|
1542 (define-key map "q" 'select-tags-table-quit)
|
|
1543 (setq select-tags-table-mode-map map))
|
|
1544
|
|
1545 (defun select-tags-table-mode ()
|
|
1546 "Major mode for choosing a current tags table among those already loaded.
|
|
1547
|
|
1548 \\{select-tags-table-mode-map}"
|
|
1549 (interactive)
|
|
1550 (kill-all-local-variables)
|
799
|
1551 (setq buffer-read-only t
|
7645
|
1552 major-mode 'select-tags-table-mode
|
799
|
1553 mode-name "Select Tags Table")
|
7645
|
1554 (use-local-map select-tags-table-mode-map)
|
|
1555 (setq selective-display t
|
|
1556 selective-display-ellipses nil))
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1557
|
799
|
1558 (defun select-tags-table-select ()
|
|
1559 "Select the tags table named on this line."
|
|
1560 (interactive)
|
|
1561 (search-forward "\C-m")
|
|
1562 (let ((name (read (current-buffer))))
|
|
1563 (visit-tags-table name)
|
|
1564 (select-tags-table-quit)
|
|
1565 (message "Tags table now %s" name)))
|
|
1566
|
|
1567 (defun select-tags-table-quit ()
|
|
1568 "Kill the buffer and delete the selected window."
|
|
1569 (interactive)
|
|
1570 (kill-buffer (current-buffer))
|
|
1571 (or (one-window-p)
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1572 (delete-window)))
|
799
|
1573
|
16281
|
1574 ;;; Note, there is another definition of this function in bindings.el.
|
360
|
1575 ;;;###autoload
|
799
|
1576 (defun complete-tag ()
|
|
1577 "Perform tags completion on the text around point.
|
13731
f9bffca29486
Fix completely broken changes of 4 Feb 95 by brat@htilbom.ernet.in,
Roland McGrath <roland@gnu.org>
diff
changeset
|
1578 Completes to the set of names listed in the current tags table.
|
799
|
1579 The string to complete is chosen in the same way as the default
|
981
|
1580 for \\[find-tag] (which see)."
|
799
|
1581 (interactive)
|
981
|
1582 (or tags-table-list
|
|
1583 tags-file-name
|
14420
071f9717597f
(visit-tags-table-buffer, tags-loop-scan, complete-tag): Fix error format
Karl Heuer <kwzh@gnu.org>
diff
changeset
|
1584 (error "%s"
|
071f9717597f
(visit-tags-table-buffer, tags-loop-scan, complete-tag): Fix error format
Karl Heuer <kwzh@gnu.org>
diff
changeset
|
1585 (substitute-command-keys
|
18623
|
1586 "No tags table loaded; try \\[visit-tags-table]")))
|
799
|
1587 (let ((pattern (funcall (or find-tag-default-function
|
|
1588 (get major-mode 'find-tag-default-function)
|
|
1589 'find-tag-default)))
|
|
1590 beg
|
|
1591 completion)
|
|
1592 (or pattern
|
|
1593 (error "Nothing to complete"))
|
|
1594 (search-backward pattern)
|
|
1595 (setq beg (point))
|
|
1596 (forward-char (length pattern))
|
|
1597 (setq completion (try-completion pattern 'tags-complete-tag nil))
|
|
1598 (cond ((eq completion t))
|
|
1599 ((null completion)
|
|
1600 (message "Can't find completion for \"%s\"" pattern)
|
|
1601 (ding))
|
|
1602 ((not (string= pattern completion))
|
|
1603 (delete-region beg (point))
|
|
1604 (insert completion))
|
|
1605 (t
|
|
1606 (message "Making completion list...")
|
7843
|
1607 (with-output-to-temp-buffer "*Completions*"
|
799
|
1608 (display-completion-list
|
|
1609 (all-completions pattern 'tags-complete-tag nil)))
|
|
1610 (message "Making completion list...%s" "done")))))
|
|
1611
|
584
|
1612 (provide 'etags)
|
807
|
1613
|
|
1614 ;;; etags.el ends here
|