ipy_stock_completers.py
218 lines
| 6.9 KiB
| text/x-python
|
PythonLexer
vivainio
|
r394 | """ Tab completion support for a couple of linux package managers | ||
This is also an example of how to write custom completer plugins | ||||
or hooks. | ||||
Practical use: | ||||
[ipython]|1> import ipy_linux_package_managers | ||||
[ipython]|2> apt-get u<<< press tab here >>> | ||||
update upgrade | ||||
[ipython]|2> apt-get up | ||||
""" | ||||
import IPython.ipapi | ||||
vivainio
|
r411 | import glob,os,shlex,sys | ||
vivainio
|
r394 | |||
ip = IPython.ipapi.get() | ||||
vivainio
|
r458 | def vcs_completer(commands, event): | ||
""" utility to make writing typical version control app completers easier | ||||
VCS command line apps typically have the format: | ||||
[sudo ]PROGNAME [help] [command] file file... | ||||
""" | ||||
cmd_param = event.line.split() | ||||
if event.line.endswith(' '): | ||||
cmd_param.append('') | ||||
if cmd_param[0] == 'sudo': | ||||
cmd_param = cmd_param[1:] | ||||
if len(cmd_param) == 2 or 'help' in cmd_param: | ||||
return commands.split() | ||||
return ip.IP.Completer.file_matches(event.symbol) | ||||
vivainio
|
r394 | def apt_completers(self, event): | ||
""" This should return a list of strings with possible completions. | ||||
Note that all the included strings that don't start with event.symbol | ||||
are removed, in order to not confuse readline. | ||||
""" | ||||
# print event # dbg | ||||
# commands are only suggested for the 'command' part of package manager | ||||
# invocation | ||||
cmd = (event.line + "<placeholder>").rsplit(None,1)[0] | ||||
# print cmd | ||||
if cmd.endswith('apt-get') or cmd.endswith('yum'): | ||||
return ['update', 'upgrade', 'install', 'remove'] | ||||
# later on, add dpkg -l / whatever to get list of possible | ||||
# packages, add switches etc. for the rest of command line | ||||
# filling | ||||
raise IPython.ipapi.TryNext | ||||
# re_key specifies the regexp that triggers the specified completer | ||||
ip.set_hook('complete_command', apt_completers, re_key = '.*apt-get') | ||||
ip.set_hook('complete_command', apt_completers, re_key = '.*yum') | ||||
vivainio
|
r395 | |||
vivainio
|
r409 | pkg_cache = None | ||
vivainio
|
r395 | def module_completer(self,event): | ||
""" Give completions after user has typed 'import' """ | ||||
fptest
|
r412 | |||
vivainio
|
r411 | # only a local version for py 2.4, pkgutil has no walk_packages() there | ||
fptest
|
r412 | if sys.version_info < (2,5): | ||
for el in [f[:-3] for f in glob.glob("*.py")]: | ||||
yield el | ||||
vivainio
|
r411 | return | ||
fptest
|
r412 | |||
vivainio
|
r409 | global pkg_cache | ||
vivainio
|
r407 | import pkgutil,imp,time | ||
fptest
|
r412 | #current = | ||
vivainio
|
r409 | if pkg_cache is None: | ||
print "\n\n[Standby while scanning modules, this can take a while]\n\n" | ||||
pkg_cache = list(pkgutil.walk_packages()) | ||||
vivainio
|
r410 | already = set() | ||
vivainio
|
r409 | for ld, name, ispkg in pkg_cache: | ||
vivainio
|
r410 | if name.count('.') < event.symbol.count('.') + 1: | ||
if name not in already: | ||||
already.add(name) | ||||
yield name + (ispkg and '.' or '') | ||||
vivainio
|
r407 | return | ||
vivainio
|
r395 | |||
vivainio
|
r397 | ip.set_hook('complete_command', module_completer, str_key = 'import') | ||
vivainio
|
r407 | ip.set_hook('complete_command', module_completer, str_key = 'from') | ||
vivainio
|
r397 | |||
svn_commands = """\ | ||||
add blame praise annotate ann cat checkout co cleanup commit ci copy | ||||
cp delete del remove rm diff di export help ? h import info list ls | ||||
lock log merge mkdir move mv rename ren propdel pdel pd propedit pedit | ||||
pe propget pget pg proplist plist pl propset pset ps resolved revert | ||||
vivainio
|
r401 | status stat st switch sw unlock update | ||
vivainio
|
r397 | """ | ||
vivainio
|
r401 | def svn_completer(self,event): | ||
vivainio
|
r458 | return vcs_completer(svn_commands, event) | ||
vivainio
|
r397 | |||
vivainio
|
r402 | ip.set_hook('complete_command', svn_completer, str_key = 'svn') | ||
vivainio
|
r445 | hg_commands = """ | ||
add addremove annotate archive backout branch branches bundle cat | ||||
clone commit copy diff export grep heads help identify import incoming | ||||
init locate log manifest merge outgoing parents paths pull push | ||||
qapplied qclone qcommit qdelete qdiff qfold qguard qheader qimport | ||||
qinit qnew qnext qpop qprev qpush qrefresh qrename qrestore qsave | ||||
qselect qseries qtop qunapplied recover remove rename revert rollback | ||||
root serve showconfig status strip tag tags tip unbundle update verify | ||||
version | ||||
""" | ||||
def hg_completer(self,event): | ||||
""" Completer for mercurial commands """ | ||||
vivainio
|
r458 | return vcs_completer(hg_commands, event) | ||
vivainio
|
r445 | |||
ip.set_hook('complete_command', hg_completer, str_key = 'hg') | ||||
vivainio
|
r457 | bzr_commands = """ | ||
add annotate bind branch break-lock bundle-revisions cat check | ||||
checkout commit conflicts deleted diff export gannotate gbranch | ||||
gcommit gdiff help ignore ignored info init init-repository inventory | ||||
log merge missing mkdir mv nick pull push reconcile register-branch | ||||
remerge remove renames resolve revert revno root serve sign-my-commits | ||||
status testament unbind uncommit unknowns update upgrade version | ||||
version-info visualise whoami | ||||
""" | ||||
def bzr_completer(self,event): | ||||
""" Completer for bazaar commands """ | ||||
cmd_param = event.line.split() | ||||
if event.line.endswith(' '): | ||||
cmd_param.append('') | ||||
if len(cmd_param) > 2: | ||||
cmd = cmd_param[1] | ||||
param = cmd_param[-1] | ||||
output_file = (param == '--output=') | ||||
if cmd == 'help': | ||||
return bzr_commands.split() | ||||
elif cmd in ['bundle-revisions','conflicts', | ||||
'deleted','nick','register-branch', | ||||
'serve','unbind','upgrade','version', | ||||
'whoami'] and not output_file: | ||||
return [] | ||||
else: | ||||
# the rest are probably file names | ||||
return ip.IP.Completer.file_matches(event.symbol) | ||||
return bzr_commands.split() | ||||
ip.set_hook('complete_command', bzr_completer, str_key = 'bzr') | ||||
vivainio
|
r402 | def runlistpy(self, event): | ||
comps = shlex.split(event.line) | ||||
relpath = (len(comps) > 1 and comps[-1] or '') | ||||
fptest
|
r412 | #print "rp",relpath # dbg | ||
fptest
|
r413 | lglob = glob.glob | ||
fptest
|
r412 | isdir = os.path.isdir | ||
vivainio
|
r402 | if relpath.startswith('~'): | ||
relpath = os.path.expanduser(relpath) | ||||
fptest
|
r413 | dirs = [f.replace('\\','/') + "/" for f in lglob(relpath+'*') | ||
fptest
|
r412 | if isdir(f)] | ||
fptest
|
r413 | pys = [f.replace('\\','/') for f in lglob(relpath+'*.py')] | ||
vivainio
|
r402 | return dirs + pys | ||
ip.set_hook('complete_command', runlistpy, str_key = '%run') | ||||
vivainio
|
r409 | def cd_completer(self, event): | ||
vivainio
|
r402 | relpath = event.symbol | ||
vivainio
|
r484 | #print event # dbg | ||
vivainio
|
r404 | if '-b' in event.line: | ||
# return only bookmark completions | ||||
bkms = self.db.get('bookmarks',{}) | ||||
return bkms.keys() | ||||
vivainio
|
r405 | |||
vivainio
|
r481 | |||
vivainio
|
r405 | if event.symbol == '-': | ||
# jump in directory history by number | ||||
ents = ['-%d [%s]' % (i,s) for i,s in enumerate(ip.user_ns['_dh'])] | ||||
if len(ents) > 1: | ||||
return ents | ||||
return [] | ||||
vivainio
|
r404 | |||
vivainio
|
r402 | if relpath.startswith('~'): | ||
relpath = os.path.expanduser(relpath).replace('\\','/') | ||||
vivainio
|
r484 | found = [] | ||
vivainio
|
r487 | for d in [f.replace('\\','/') + '/' for f in glob.glob(relpath+'*') | ||
if os.path.isdir(f)]: | ||||
vivainio
|
r484 | if ' ' in d: | ||
# we don't want to deal with any of that, complex code | ||||
# for this is elsewhere | ||||
raise IPython.ipapi.TryNext | ||||
found.append( d ) | ||||
vivainio
|
r402 | if not found: | ||
vivainio
|
r481 | if os.path.isdir(relpath): | ||
return [relpath] | ||||
vivainio
|
r484 | raise IPython.ipapi.TryNext | ||
vivainio
|
r402 | return found | ||
fptest
|
r412 | ip.set_hook('complete_command', cd_completer, str_key = '%cd') | ||