mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-11-30 06:03:49 +08:00
122 lines
3.2 KiB
Python
122 lines
3.2 KiB
Python
|
#!/usr/bin/env python
|
||
|
# -*- python -*-
|
||
|
|
||
|
# Program to generate fish completion function for wajig.
|
||
|
# It runs 'wajig command' and analyzes the output to build a
|
||
|
# completion file which it writes to stdout.
|
||
|
# To use the result, direct stdout to
|
||
|
# ~/.fish.d/completions/wajig.fish.
|
||
|
|
||
|
# Author Reuben Thomas, from Don Rozenberg's bash_completion.py and
|
||
|
# fish's apt-get.fish.
|
||
|
|
||
|
import os
|
||
|
import re
|
||
|
import pprint
|
||
|
pp = pprint.PrettyPrinter()
|
||
|
|
||
|
def escape_quotes(s):
|
||
|
return re.sub('\'', '\\\'', s)
|
||
|
|
||
|
# Run wajig command
|
||
|
f = os.popen('wajig commands', 'r')
|
||
|
|
||
|
lines = f.readlines()
|
||
|
|
||
|
option_patt = r'^-([a-z]*)\|--([a-z]*) +([^ ].*)'
|
||
|
option_patt_r = re.compile(option_patt)
|
||
|
|
||
|
command_patt = r'^([a-z-]*) +([^ ].*)'
|
||
|
command_patt_r = re.compile(command_patt)
|
||
|
|
||
|
os_str = []
|
||
|
os_str.append('')
|
||
|
ol_str = []
|
||
|
ol_str.append('')
|
||
|
oh_str = []
|
||
|
oh_str.append('')
|
||
|
o_i = 0
|
||
|
|
||
|
c_str = []
|
||
|
c_str.append('')
|
||
|
ch_str = []
|
||
|
ch_str.append('')
|
||
|
c_i = 0
|
||
|
|
||
|
for l in lines:
|
||
|
l = l.strip()
|
||
|
if l == '' or l.find(':') > -1 or l.find('Run') == 0:
|
||
|
continue
|
||
|
if l.find('-') == 0:
|
||
|
mo = option_patt_r.search(l)
|
||
|
if mo == None:
|
||
|
continue
|
||
|
os_str[o_i] = mo.group(1)
|
||
|
os_str.append('')
|
||
|
ol_str[o_i] = mo.group(2)
|
||
|
ol_str.append('')
|
||
|
oh_str[o_i] = escape_quotes(mo.group(3))
|
||
|
oh_str.append('')
|
||
|
o_i += 1
|
||
|
else:
|
||
|
mo = command_patt_r.search(l)
|
||
|
if mo == None:
|
||
|
continue
|
||
|
c_str[c_i] = mo.group(1)
|
||
|
c_str.append('')
|
||
|
ch_str[c_i] = escape_quotes(mo.group(2))
|
||
|
ch_str.append('')
|
||
|
c_i += 1
|
||
|
|
||
|
# For debugging, print the commands and options.
|
||
|
#print
|
||
|
#pp.pprint(c_str)
|
||
|
|
||
|
#print
|
||
|
#pp.pprint(os_str)
|
||
|
#print
|
||
|
#pp.pprint(ol_str)
|
||
|
|
||
|
part1 = '''function __fish_wajig_no_subcommand -d (N_ 'Test if wajig has yet to be given the subcommand')
|
||
|
for i in (commandline -opc)
|
||
|
if contains -- $i'''
|
||
|
|
||
|
part2 = '''
|
||
|
return 1
|
||
|
end
|
||
|
end
|
||
|
return 0
|
||
|
end
|
||
|
|
||
|
function __fish_wajig_use_package -d (N_ 'Test if wajig command should have packages as potential completion')
|
||
|
for i in (commandline -opc)
|
||
|
if contains -- $i contains bug build build-depend changelog dependents describe detail hold install installr installrs installs list list-files news package purge purge-depend readme recursive recommended reconfigure reinstall remove remove-depend repackage show showinstall showremove showupgrade size sizes source suggested unhold upgrade versions whatis
|
||
|
return 0
|
||
|
end
|
||
|
end
|
||
|
return 1
|
||
|
end
|
||
|
|
||
|
complete -c wajig -n '__fish_wajig_use_package' -a '(__fish_print_packages)' -d (N_ 'Package')'''
|
||
|
|
||
|
wajig = part1
|
||
|
|
||
|
#add the commands.
|
||
|
for i in range(0, len(c_str) - 1):
|
||
|
wajig = "%s %s" % (wajig, c_str[i])
|
||
|
|
||
|
#add part2
|
||
|
wajig = "%s%s" % (wajig, part2)
|
||
|
|
||
|
#add the options.
|
||
|
wajig = "%s%s" % (wajig, os_str[0].lstrip())
|
||
|
for i in range(1, len(os_str) - 1):
|
||
|
wajig = "%s\ncomplete -c apt-get -s %s -l %s -d (N_ '%s')" % (wajig, os_str[i], ol_str[i], oh_str[i])
|
||
|
|
||
|
#add the commands.
|
||
|
for i in range(0, len(c_str) - 1):
|
||
|
wajig = "%s\ncomplete -f -n '__fish_wajig_no_subcommand' -c wajig -a '%s' -d(N_ '%s')" % (wajig, c_str[i], ch_str[i])
|
||
|
|
||
|
#print it all
|
||
|
print wajig
|