Issue #7117, continued: Remove substitution of %g-style formatting for
[python.git] / Tools / scripts / eptags.py
blob8d35dfb31e1f0440396f76673bf1f6e7095a5db0
1 #! /usr/bin/env python
2 """Create a TAGS file for Python programs, usable with GNU Emacs.
4 usage: eptags pyfiles...
6 The output TAGS file is usable with Emacs version 18, 19, 20.
7 Tagged are:
8 - functions (even inside other defs or classes)
9 - classes
11 eptags warns about files it cannot open.
12 eptags will not give warnings about duplicate tags.
14 BUGS:
15 Because of tag duplication (methods with the same name in different
16 classes), TAGS files are not very useful for most object-oriented
17 python projects.
18 """
19 import sys,re
21 expr = r'^[ \t]*(def|class)[ \t]+([a-zA-Z_][a-zA-Z0-9_]*)[ \t]*[:\(]'
22 matcher = re.compile(expr)
24 def treat_file(filename, outfp):
25 """Append tags found in file named 'filename' to the open file 'outfp'"""
26 try:
27 fp = open(filename, 'r')
28 except:
29 sys.stderr.write('Cannot open %s\n'%filename)
30 return
31 charno = 0
32 lineno = 0
33 tags = []
34 size = 0
35 while 1:
36 line = fp.readline()
37 if not line:
38 break
39 lineno = lineno + 1
40 m = matcher.search(line)
41 if m:
42 tag = m.group(0) + '\177%d,%d\n' % (lineno, charno)
43 tags.append(tag)
44 size = size + len(tag)
45 charno = charno + len(line)
46 outfp.write('\f\n%s,%d\n' % (filename,size))
47 for tag in tags:
48 outfp.write(tag)
50 def main():
51 outfp = open('TAGS', 'w')
52 for filename in sys.argv[1:]:
53 treat_file(filename, outfp)
55 if __name__=="__main__":
56 main()