Home | History | Annotate | Download | only in scripts
      1 #! /usr/bin/env python
      2 
      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 
     13 import sys, re, os
     14 
     15 tags = []    # Modified global variable!
     16 
     17 def main():
     18     args = sys.argv[1:]
     19     for filename in args:
     20         treat_file(filename)
     21     if tags:
     22         fp = open('tags', 'w')
     23         tags.sort()
     24         for s in tags: fp.write(s)
     25 
     26 
     27 expr = '^[ \t]*(def|class)[ \t]+([a-zA-Z0-9_]+)[ \t]*[:\(]'
     28 matcher = re.compile(expr)
     29 
     30 def treat_file(filename):
     31     try:
     32         fp = open(filename, 'r')
     33     except:
     34         sys.stderr.write('Cannot open %s\n' % filename)
     35         return
     36     base = os.path.basename(filename)
     37     if base[-3:] == '.py':
     38         base = base[:-3]
     39     s = base + '\t' + filename + '\t' + '1\n'
     40     tags.append(s)
     41     while 1:
     42         line = fp.readline()
     43         if not line:
     44             break
     45         m = matcher.match(line)
     46         if m:
     47             content = m.group(0)
     48             name = m.group(2)
     49             s = name + '\t' + filename + '\t/^' + content + '/\n'
     50             tags.append(s)
     51 
     52 if __name__ == '__main__':
     53     main()
     54