##// END OF EJS Templates
stock completer for hg (mercurial)
stock completer for hg (mercurial)

File last commit:

Show More
155 lines | 5.1 KiB | text/x-python | PythonLexer
""" 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
import glob,os,shlex,sys
ip = IPython.ipapi.get()
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')
pkg_cache = None
def module_completer(self,event):
""" Give completions after user has typed 'import' """
# only a local version for py 2.4, pkgutil has no walk_packages() there
if sys.version_info < (2,5):
for el in [f[:-3] for f in glob.glob("*.py")]:
yield el
global pkg_cache
import pkgutil,imp,time
#current =
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())
already = set()
for ld, name, ispkg in pkg_cache:
if name.count('.') < event.symbol.count('.') + 1:
if name not in already:
yield name + (ispkg and '.' or '')
ip.set_hook('complete_command', module_completer, str_key = 'import')
ip.set_hook('complete_command', module_completer, str_key = 'from')
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
status stat st switch sw unlock update
def svn_completer(self,event):
if len((event.line + 'placeholder').split()) > 2:
# the rest are probably file names
return ip.IP.Completer.file_matches(event.symbol)
return svn_commands.split()
ip.set_hook('complete_command', svn_completer, str_key = 'svn')
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
def hg_completer(self,event):
""" Completer for mercurial commands """
if len((event.line + 'placeholder').split()) > 2:
# the rest are probably file names
return ip.IP.Completer.file_matches(event.symbol)
return hg_commands.split()
ip.set_hook('complete_command', hg_completer, str_key = 'hg')
def runlistpy(self, event):
comps = shlex.split(event.line)
relpath = (len(comps) > 1 and comps[-1] or '')
#print "rp",relpath # dbg
lglob = glob.glob
isdir = os.path.isdir
if relpath.startswith('~'):
relpath = os.path.expanduser(relpath)
dirs = [f.replace('\\','/') + "/" for f in lglob(relpath+'*')
if isdir(f)]
pys = [f.replace('\\','/') for f in lglob(relpath+'*.py')]
return dirs + pys
ip.set_hook('complete_command', runlistpy, str_key = '%run')
def cd_completer(self, event):
relpath = event.symbol
if '-b' in event.line:
# return only bookmark completions
bkms = self.db.get('bookmarks',{})
return bkms.keys()
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 []
if relpath.startswith('~'):
relpath = os.path.expanduser(relpath).replace('\\','/')
found = [f.replace('\\','/')+'/' for f in glob.glob(relpath+'*') if os.path.isdir(f)]
if not found:
return [relpath]
return found
ip.set_hook('complete_command', cd_completer, str_key = '%cd')