aboutsummaryrefslogtreecommitdiffhomepage
path: root/make_completions.py
blob: cee4698ad85cdc2fb2363658fa3e69a9be1dbf6b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env python

import sys
import commands
import re

def escape_quotes(s):
  return re.sub('\'', '\\\'', s)

def escape(s):
  return re.sub('([\'"#%*?])', r"\\\1", s)

def print_completion( cmd, switch_name, arg, desc ):

	offset=1
	switch_type = "o"

	if len(switch_name) == 2:
		switch_type = "s"

	if switch_name[1] == "-":
		switch_type = "l"
		offset=2

	arg_str = ""
	if arg == None:
		pass
	elif 	arg == "standard":
		arg_str = "-a 'c89 c99 gnu89 gnu99 c++98 gnu++98'"
	else:
		pass

	print "complete -c %s -%s %s %s --description '%s'" % (cmd, switch_type, escape( switch_name[offset:] ), arg_str, escape_quotes(desc))

def clean_whitespace( str ):
	clean_whitespace_prog0 = re.compile( r"-[ \t]*\n[ \t\r]+" )
	clean_whitespace_prog1 = re.compile( r"[ \n\t]+" )
	clean_whitespace_prog2 = re.compile( r"^[ \t\r]*", re.MULTILINE )
	str = clean_whitespace_prog0.sub( "", str )
	str = clean_whitespace_prog1.sub( " ", str )
	str = clean_whitespace_prog2.sub( "", str )
	return str



cmd = sys.argv[1]
man = commands.getoutput( "man %s | col -b" % cmd )
remainder = man

re1 = r"\n( *-[^ ,]*  *(|\n))+[^.]+"
prog1 = re.compile(re1, re.MULTILINE)

re2 = r"^(|=[^ ]*)( |\n)*(?P<switch>-[^ =./\n]+)(  *[^-\n ]*\n|)"
prog2 = re.compile(re2, re.MULTILINE)

re3 = r"^=(?P<arg>[^ ]*)"
prog3 = re.compile(re2, 0)

while True:

	match = prog1.search( remainder )  

	if match == None:
		break

#	print "yay match!!!\n"
	str = match.string[match.start():match.end()]

#	print str

	rem2 = str

	switch = []

	while True:
		match2 = prog2.search( rem2 )

		if match2 == None:
			break

		sw = match2.expand( r"\g<switch>" )
#		print "yay switch %s!!!\n" %sw

		switch.append( sw )

		rem2 = rem2[match2.end():]

	match_arg = prog3.search( rem2 )
	arg = None
	
	if match_arg != None:
		arg = match_arg.expand( r"\g<arg>" )
		rem2 = rem2[match_arg.end():]

	desc = clean_whitespace(rem2)

	if len( desc) > 8 and arg != None:

#		print "Yay desc '%s'!!\n" % desc

		for i in switch:
			print_completion( cmd, i, arg, desc )


	remainder = remainder[match.end():]