annotate lisp/progmodes/etags.el @ 342:8bfd98a0dcdd

Initial revision
author Jim Blandy <jimb@redhat.com>
date Sun, 21 Jul 1991 11:19:26 +0000
parents
children 066d9d0dd901
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
342
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1 ;; Tags facility for Emacs.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2 ;; Copyright (C) 1985, 1986, 1988 Free Software Foundation, Inc.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4 ;; This file is part of GNU Emacs.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6 ;; GNU Emacs is free software; you can redistribute it and/or modify
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
7 ;; it under the terms of the GNU General Public License as published by
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
8 ;; the Free Software Foundation; either version 1, or (at your option)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
9 ;; any later version.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11 ;; GNU Emacs is distributed in the hope that it will be useful,
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
14 ;; GNU General Public License for more details.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16 ;; You should have received a copy of the GNU General Public License
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17 ;; along with GNU Emacs; see the file COPYING. If not, write to
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
18 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
19
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
21 (provide 'tags)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
22
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
23 (defvar tag-table-files nil
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
24 "List of file names covered by current tag table.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
25 nil means it has not been computed yet; do (tag-table-files) to compute it.")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
26
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
27 (defvar last-tag nil
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
28 "Tag found by the last find-tag.")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
29
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
30 (defun visit-tags-table (file)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
31 "Tell tags commands to use tag table file FILE.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
32 FILE should be the name of a file created with the `etags' program.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
33 A directory name is ok too; it means file TAGS in that directory."
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
34 (interactive (list (read-file-name "Visit tags table: (default TAGS) "
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
35 default-directory
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
36 (concat default-directory "TAGS")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
37 t)))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
38 (setq file (expand-file-name file))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
39 (if (file-directory-p file)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
40 (setq file (concat file "TAGS")))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
41 (setq tag-table-files nil
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
42 tags-file-name file))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
43
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
44 (defun visit-tags-table-buffer ()
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
45 "Select the buffer containing the current tag table.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
46 This is a file whose name is in the variable tags-file-name."
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
47 (or tags-file-name
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
48 (call-interactively 'visit-tags-table))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
49 (set-buffer (or (get-file-buffer tags-file-name)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
50 (progn
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
51 (setq tag-table-files nil)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
52 (find-file-noselect tags-file-name))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
53 (or (verify-visited-file-modtime (get-file-buffer tags-file-name))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
54 (cond ((yes-or-no-p "Tags file has changed, read new contents? ")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
55 (revert-buffer t t)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
56 (setq tag-table-files nil))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
57 (or (eq (char-after 1) ?\^L)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
58 (error "File %s not a valid tag table" tags-file-name)))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
59
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
60 (defun file-of-tag ()
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
61 "Return the file name of the file whose tags point is within.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
62 Assumes the tag table is the current buffer.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
63 File name returned is relative to tag table file's directory."
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
64 (let ((opoint (point))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
65 prev size)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
66 (save-excursion
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
67 (goto-char (point-min))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
68 (while (< (point) opoint)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
69 (forward-line 1)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
70 (end-of-line)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
71 (skip-chars-backward "^,\n")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
72 (setq prev (point))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
73 (setq size (read (current-buffer)))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
74 (goto-char prev)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
75 (forward-line 1)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
76 (forward-char size))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
77 (goto-char (1- prev))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
78 (buffer-substring (point)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
79 (progn (beginning-of-line) (point))))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
80
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
81 (defun tag-table-files ()
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
82 "Return a list of files in the current tag table.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
83 File names returned are absolute."
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
84 (save-excursion
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
85 (visit-tags-table-buffer)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
86 (or tag-table-files
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
87 (let (files)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
88 (goto-char (point-min))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
89 (while (not (eobp))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
90 (forward-line 1)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
91 (end-of-line)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
92 (skip-chars-backward "^,\n")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
93 (setq prev (point))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
94 (setq size (read (current-buffer)))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
95 (goto-char prev)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
96 (setq files (cons (expand-file-name
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
97 (buffer-substring (1- (point))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
98 (save-excursion
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
99 (beginning-of-line)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
100 (point)))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
101 (file-name-directory tags-file-name))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
102 files))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
103 (forward-line 1)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
104 (forward-char size))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
105 (setq tag-table-files (nreverse files))))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
106
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
107 ;; Return a default tag to search for, based on the text at point.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
108 (defun find-tag-default ()
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
109 (save-excursion
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
110 (while (looking-at "\\sw\\|\\s_")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
111 (forward-char 1))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
112 (if (re-search-backward "\\sw\\|\\s_" nil t)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
113 (progn (forward-char 1)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
114 (buffer-substring (point)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
115 (progn (forward-sexp -1)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
116 (while (looking-at "\\s'")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
117 (forward-char 1))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
118 (point))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
119 nil)))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
120
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
121 (defun find-tag-tag (string)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
122 (let* ((default (find-tag-default))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
123 (spec (read-string
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
124 (if default
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
125 (format "%s(default %s) " string default)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
126 string))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
127 (list (if (equal spec "")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
128 default
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
129 spec))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
130
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
131 (defun find-tag (tagname &optional next other-window)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
132 "Find tag (in current tag table) whose name contains TAGNAME.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
133 Selects the buffer that the tag is contained in
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
134 and puts point at its definition.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
135 If TAGNAME is a null string, the expression in the buffer
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
136 around or before point is used as the tag name.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
137 If second arg NEXT is non-nil (interactively, with prefix arg),
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
138 searches for the next tag in the tag table
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
139 that matches the tagname used in the previous find-tag.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
140
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
141 See documentation of variable tags-file-name."
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
142 (interactive (if current-prefix-arg
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
143 '(nil t)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
144 (find-tag-tag "Find tag: ")))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
145 (let (buffer file linebeg startpos)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
146 (save-excursion
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
147 (visit-tags-table-buffer)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
148 (if (not next)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
149 (goto-char (point-min))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
150 (setq tagname last-tag))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
151 (setq last-tag tagname)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
152 (while (progn
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
153 (if (not (search-forward tagname nil t))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
154 (error "No %sentries containing %s"
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
155 (if next "more " "") tagname))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
156 (not (looking-at "[^\n\177]*\177"))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
157 (search-forward "\177")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
158 (setq file (expand-file-name (file-of-tag)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
159 (file-name-directory tags-file-name)))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
160 (setq linebeg
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
161 (buffer-substring (1- (point))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
162 (save-excursion (beginning-of-line) (point))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
163 (search-forward ",")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
164 (setq startpos (read (current-buffer))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
165 (if other-window
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
166 (find-file-other-window file)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
167 (find-file file))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
168 (widen)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
169 (push-mark)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
170 (let ((offset 1000)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
171 found
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
172 (pat (concat "^" (regexp-quote linebeg))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
173 (or startpos (setq startpos (point-min)))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
174 (while (and (not found)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
175 (progn
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
176 (goto-char (- startpos offset))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
177 (not (bobp))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
178 (setq found
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
179 (re-search-forward pat (+ startpos offset) t))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
180 (setq offset (* 3 offset)))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
181 (or found
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
182 (re-search-forward pat nil t)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
183 (error "%s not found in %s" pat file)))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
184 (beginning-of-line))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
185 (setq tags-loop-form '(find-tag nil t))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
186 ;; Return t in case used as the tags-loop-form.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
187 t)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
188
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
189 (defun find-tag-other-window (tagname &optional next)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
190 "Find tag (in current tag table) whose name contains TAGNAME.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
191 Selects the buffer that the tag is contained in in another window
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
192 and puts point at its definition.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
193 If TAGNAME is a null string, the expression in the buffer
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
194 around or before point is used as the tag name.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
195 If second arg NEXT is non-nil (interactively, with prefix arg),
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
196 searches for the next tag in the tag table
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
197 that matches the tagname used in the previous find-tag.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
198
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
199 See documentation of variable tags-file-name."
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
200 (interactive (if current-prefix-arg
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
201 '(nil t)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
202 (find-tag-tag "Find tag other window: ")))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
203 (find-tag tagname next t))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
204
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
205 (defvar next-file-list nil
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
206 "List of files for next-file to process.")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
207
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
208 (defun next-file (&optional initialize)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
209 "Select next file among files in current tag table.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
210 Non-nil argument (prefix arg, if interactive)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
211 initializes to the beginning of the list of files in the tag table."
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
212 (interactive "P")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
213 (if initialize
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
214 (setq next-file-list (tag-table-files)))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
215 (or next-file-list
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
216 (error "All files processed."))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
217 (find-file (car next-file-list))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
218 (setq next-file-list (cdr next-file-list)))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
219
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
220 (defvar tags-loop-form nil
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
221 "Form for tags-loop-continue to eval to process one file.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
222 If it returns nil, it is through with one file; move on to next.")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
223
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
224 (defun tags-loop-continue (&optional first-time)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
225 "Continue last \\[tags-search] or \\[tags-query-replace] command.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
226 Used noninteractively with non-nil argument
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
227 to begin such a command. See variable tags-loop-form."
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
228 (interactive)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
229 (if first-time
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
230 (progn (next-file t)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
231 (goto-char (point-min))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
232 (while (not (eval tags-loop-form))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
233 (next-file)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
234 (message "Scanning file %s..." buffer-file-name)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
235 (goto-char (point-min))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
236
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
237 (defun tags-search (regexp)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
238 "Search through all files listed in tag table for match for REGEXP.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
239 Stops when a match is found.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
240 To continue searching for next match, use command \\[tags-loop-continue].
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
241
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
242 See documentation of variable tags-file-name."
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
243 (interactive "sTags search (regexp): ")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
244 (if (and (equal regexp "")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
245 (eq (car tags-loop-form) 're-search-forward))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
246 (tags-loop-continue nil)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
247 (setq tags-loop-form
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
248 (list 're-search-forward regexp nil t))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
249 (tags-loop-continue t)))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
250
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
251 (defun tags-query-replace (from to &optional delimited)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
252 "Query-replace-regexp FROM with TO through all files listed in tag table.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
253 Third arg DELIMITED (prefix arg) means replace only word-delimited matches.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
254 If you exit (C-G or ESC), you can resume the query-replace
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
255 with the command \\[tags-loop-continue].
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
256
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
257 See documentation of variable tags-file-name."
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
258 (interactive "sTags query replace (regexp): \nsTags query replace %s by: \nP")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
259 (setq tags-loop-form
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
260 (list 'and (list 'save-excursion
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
261 (list 're-search-forward from nil t))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
262 (list 'not (list 'perform-replace from to t t
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
263 (not (null delimited))))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
264 (tags-loop-continue t))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
265
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
266 (defun list-tags (string)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
267 "Display list of tags in file FILE.
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
268 FILE should not contain a directory spec
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
269 unless it has one in the tag table."
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
270 (interactive "sList tags (in file): ")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
271 (with-output-to-temp-buffer "*Tags List*"
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
272 (princ "Tags in file ")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
273 (princ string)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
274 (terpri)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
275 (save-excursion
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
276 (visit-tags-table-buffer)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
277 (goto-char 1)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
278 (search-forward (concat "\f\n" string ","))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
279 (forward-line 1)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
280 (while (not (or (eobp) (looking-at "\f")))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
281 (princ (buffer-substring (point)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
282 (progn (skip-chars-forward "^\177")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
283 (point))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
284 (terpri)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
285 (forward-line 1)))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
286
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
287 (defun tags-apropos (string)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
288 "Display list of all tags in tag table REGEXP matches."
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
289 (interactive "sTag apropos (regexp): ")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
290 (with-output-to-temp-buffer "*Tags List*"
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
291 (princ "Tags matching regexp ")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
292 (prin1 string)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
293 (terpri)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
294 (save-excursion
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
295 (visit-tags-table-buffer)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
296 (goto-char 1)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
297 (while (re-search-forward string nil t)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
298 (beginning-of-line)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
299 (princ (buffer-substring (point)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
300 (progn (skip-chars-forward "^\177")
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
301 (point))))
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
302 (terpri)
8bfd98a0dcdd Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
303 (forward-line 1)))))