ipy_completers.py
138 lines
| 3.9 KiB
| text/x-python
|
PythonLexer
ville
|
r988 | """ Implementations for various useful completers | ||
Brian Granger
|
r2064 | See extensions/ipy_stock_completers.py on examples of how to enable a completer, | ||
ville
|
r988 | but the basic idea is to do: | ||
ip.set_hook('complete_command', svn_completer, str_key = 'svn') | ||||
Fernando Perez
|
r2958 | NOTE: some of the completers that used to be here, the ones used always by | ||
default (loaded before by ipy_stock_completers) have been moved into | ||||
core.completerlib, where they will be further cleaned up and maintained. The | ||||
rest of this file would need to be well commented, cleaned up and tested for | ||||
inclusion into the core. | ||||
ville
|
r988 | """ | ||
Brian Granger
|
r2205 | |||
ville
|
r988 | import glob,os,shlex,sys | ||
import inspect | ||||
from time import time | ||||
Ville M. Vainio
|
r1155 | from zipimport import zipimporter | ||
ville
|
r988 | |||
Fernando Perez
|
r2958 | from IPython.core import ipapi | ||
from IPython.core.error import TryNext | ||||
ip = ipapi.get() | ||||
ville
|
r988 | |||
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() | ||||
Brian Granger
|
r2205 | return ip.Completer.file_matches(event.symbol) | ||
ville
|
r988 | |||
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): | ||||
return vcs_completer(svn_commands, event) | ||||
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 """ | ||||
return vcs_completer(hg_commands, event) | ||||
Ville M. Vainio
|
r1067 | __bzr_commands = None | ||
vivainio2
|
r1062 | def bzr_commands(): | ||
Ville M. Vainio
|
r1067 | global __bzr_commands | ||
if __bzr_commands is not None: | ||||
return __bzr_commands | ||||
vivainio2
|
r1062 | out = os.popen('bzr help commands') | ||
Ville M. Vainio
|
r1067 | __bzr_commands = [l.split()[0] for l in out] | ||
return __bzr_commands | ||||
ville
|
r988 | |||
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': | ||||
vivainio2
|
r1062 | return bzr_commands() | ||
ville
|
r988 | 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 | ||||
Brian Granger
|
r2205 | return ip.Completer.file_matches(event.symbol) | ||
ville
|
r988 | |||
vivainio2
|
r1062 | return bzr_commands() | ||
ville
|
r988 | |||
def apt_get_packages(prefix): | ||||
out = os.popen('apt-cache pkgnames') | ||||
for p in out: | ||||
if p.startswith(prefix): | ||||
yield p.rstrip() | ||||
apt_commands = """\ | ||||
update upgrade install remove purge source build-dep dist-upgrade | ||||
dselect-upgrade clean autoclean check""" | ||||
def apt_completer(self, event): | ||||
""" Completer for apt-get (uses apt-cache internally) | ||||
""" | ||||
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 apt_commands.split() | ||||
return list(apt_get_packages(event.symbol)) | ||||