Benjamin Peterson | 90f5ba5 | 2010-03-11 22:53:45 +0000 | [diff] [blame] | 1 | #! /usr/bin/env python3 |
Guido van Rossum | 1688f37 | 2000-09-01 13:41:37 +0000 | [diff] [blame] | 2 | """Create a TAGS file for Python programs, usable with GNU Emacs. |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 3 | |
Guido van Rossum | 1688f37 | 2000-09-01 13:41:37 +0000 | [diff] [blame] | 4 | usage: eptags pyfiles... |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 5 | |
Guido van Rossum | 1688f37 | 2000-09-01 13:41:37 +0000 | [diff] [blame] | 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 |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 10 | |
Guido van Rossum | 1688f37 | 2000-09-01 13:41:37 +0000 | [diff] [blame] | 11 | eptags warns about files it cannot open. |
| 12 | eptags will not give warnings about duplicate tags. |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 13 | |
Guido van Rossum | 1688f37 | 2000-09-01 13:41:37 +0000 | [diff] [blame] | 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 |
| 20 | |
| 21 | expr = r'^[ \t]*(def|class)[ \t]+([a-zA-Z_][a-zA-Z0-9_]*)[ \t]*[:\(]' |
| 22 | matcher = re.compile(expr) |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 23 | |
Andrew M. Kuchling | ac6df95 | 2003-05-13 18:14:25 +0000 | [diff] [blame] | 24 | def treat_file(filename, outfp): |
| 25 | """Append tags found in file named 'filename' to the open file 'outfp'""" |
Guido van Rossum | 1688f37 | 2000-09-01 13:41:37 +0000 | [diff] [blame] | 26 | try: |
Andrew M. Kuchling | ac6df95 | 2003-05-13 18:14:25 +0000 | [diff] [blame] | 27 | fp = open(filename, 'r') |
Serhiy Storchaka | ba9ac5b | 2015-05-20 10:33:40 +0300 | [diff] [blame] | 28 | except OSError: |
Andrew M. Kuchling | ac6df95 | 2003-05-13 18:14:25 +0000 | [diff] [blame] | 29 | sys.stderr.write('Cannot open %s\n'%filename) |
Jeremy Hylton | 0b7b4b8 | 2000-09-18 01:46:01 +0000 | [diff] [blame] | 30 | return |
Guido van Rossum | 1688f37 | 2000-09-01 13:41:37 +0000 | [diff] [blame] | 31 | charno = 0 |
| 32 | lineno = 0 |
| 33 | tags = [] |
| 34 | size = 0 |
| 35 | while 1: |
Jeremy Hylton | 0b7b4b8 | 2000-09-18 01:46:01 +0000 | [diff] [blame] | 36 | line = fp.readline() |
| 37 | if not line: |
| 38 | break |
| 39 | lineno = lineno + 1 |
| 40 | m = matcher.search(line) |
| 41 | if m: |
Andrew M. Kuchling | ac6df95 | 2003-05-13 18:14:25 +0000 | [diff] [blame] | 42 | tag = m.group(0) + '\177%d,%d\n' % (lineno, charno) |
Jeremy Hylton | 0b7b4b8 | 2000-09-18 01:46:01 +0000 | [diff] [blame] | 43 | tags.append(tag) |
| 44 | size = size + len(tag) |
| 45 | charno = charno + len(line) |
Andrew M. Kuchling | ac6df95 | 2003-05-13 18:14:25 +0000 | [diff] [blame] | 46 | outfp.write('\f\n%s,%d\n' % (filename,size)) |
Guido van Rossum | 1688f37 | 2000-09-01 13:41:37 +0000 | [diff] [blame] | 47 | for tag in tags: |
Jeremy Hylton | 0b7b4b8 | 2000-09-18 01:46:01 +0000 | [diff] [blame] | 48 | outfp.write(tag) |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 49 | |
Guido van Rossum | 1688f37 | 2000-09-01 13:41:37 +0000 | [diff] [blame] | 50 | def main(): |
| 51 | outfp = open('TAGS', 'w') |
Andrew M. Kuchling | ac6df95 | 2003-05-13 18:14:25 +0000 | [diff] [blame] | 52 | for filename in sys.argv[1:]: |
| 53 | treat_file(filename, outfp) |
Guido van Rossum | 1688f37 | 2000-09-01 13:41:37 +0000 | [diff] [blame] | 54 | |
| 55 | if __name__=="__main__": |
| 56 | main() |