blob: ea8eb3f1c2bf2dbf392197156719a6386c7952c0 [file] [log] [blame]
Guido van Rossumf06ee5f1996-11-27 19:52:01 +00001#! /usr/bin/env python
Guido van Rossumec758ea1991-06-04 20:36:54 +00002
3# ptags
4#
5# Create a tags file for Python programs, usable with vi.
6# Tagged are:
7# - functions (even inside other defs or classes)
8# - classes
9# - filenames
10# Warns about files it cannot open.
11# No warnings about duplicate tags.
12
Guido van Rossum1688f372000-09-01 13:41:37 +000013import sys, re, os
Guido van Rossumec758ea1991-06-04 20:36:54 +000014
Guido van Rossum1688f372000-09-01 13:41:37 +000015tags = [] # Modified global variable!
Guido van Rossumec758ea1991-06-04 20:36:54 +000016
17def main():
Guido van Rossum1688f372000-09-01 13:41:37 +000018 args = sys.argv[1:]
19 for file in args: treat_file(file)
20 if tags:
21 fp = open('tags', 'w')
22 tags.sort()
23 for s in tags: fp.write(s)
Guido van Rossumec758ea1991-06-04 20:36:54 +000024
Guido van Rossumf2e1cfb1992-08-31 10:53:53 +000025
Guido van Rossum1688f372000-09-01 13:41:37 +000026expr = '^[ \t]*(def|class)[ \t]+([a-zA-Z0-9_]+)[ \t]*[:\(]'
27matcher = re.compile(expr)
Guido van Rossumec758ea1991-06-04 20:36:54 +000028
29def treat_file(file):
Guido van Rossum1688f372000-09-01 13:41:37 +000030 try:
31 fp = open(file, 'r')
32 except:
33 sys.stderr.write('Cannot open %s\n' % file)
34 return
35 base = os.path.basename(file)
36 if base[-3:] == '.py':
37 base = base[:-3]
38 s = base + '\t' + file + '\t' + '1\n'
39 tags.append(s)
40 while 1:
41 line = fp.readline()
Tim Peters70c43782001-01-17 08:48:39 +000042 if not line:
Guido van Rossum1688f372000-09-01 13:41:37 +000043 break
44 m = matcher.match(line)
45 if m:
46 content = m.group(0)
47 name = m.group(2)
48 s = name + '\t' + file + '\t/^' + content + '/\n'
49 tags.append(s)
Guido van Rossumec758ea1991-06-04 20:36:54 +000050
51main()