[PATCH]: shell-complete command
Clint Adams
schizo at debian.org
Sat Aug 20 06:23:27 BST 2005
This is meant to facilitate accurate zsh command completion for bzr,
ripped off mostly from help.py. The non-option argument bit could
probably use some work, though I'm not sure what the end result should
be.
*** added file 'bzrlib/shellcomplete.py'
--- /dev/null
+++ bzrlib/shellcomplete.py
@@ -0,0 +1,74 @@
+import sys
+
+
+def shellcomplete(context=None, outfile = None):
+ if outfile == None:
+ outfile = sys.stdout
+ if context == None:
+ shellcomplete_commands(outfile = outfile)
+ else:
+ shellcomplete_on_command(context, outfile = outfile)
+
+def shellcomplete_on_command(cmdname, outfile = None):
+ cmdname = str(cmdname)
+
+ if outfile == None:
+ outfile = sys.stdout
+
+ from inspect import getdoc
+ import commands
+ context, cmdclass = commands.get_cmd_class(cmdname)
+
+ doc = getdoc(cmdclass)
+ if doc == None:
+ raise NotImplementedError("sorry, no detailed shellcomplete yet for %r" % cmdname)
+
+ shellcomplete_on_option(cmdclass.takes_options, outfile = None)
+ for aname in cmdclass.takes_args:
+ outfile.write(aname + '\n')
+
+
+def shellcomplete_on_option(options, outfile = None):
+ import commands
+
+ if not options:
+ return
+
+ if outfile == None:
+ outfile = sys.stdout
+
+ for on in options:
+ for shortname, longname in commands.SHORT_OPTIONS.items():
+ if longname == on:
+ l = '"(--' + on + ' -' + shortname + ')"{--' + on + ',-' + shortname + '}'
+ break
+ else:
+ l = '--' + on
+ outfile.write(l + '\n')
+
+
+def shellcomplete_commands(outfile = None):
+ """List all commands"""
+ import inspect
+ import commands
+ from inspect import getdoc
+
+ if outfile == None:
+ outfile = sys.stdout
+
+ cmds = []
+ for cmdname, cmdclass in commands.get_all_cmds():
+ cmds.append((cmdname, cmdclass))
+ for alias in cmdclass.aliases:
+ cmds.append((alias, cmdclass))
+ cmds.sort()
+ for cmdname, cmdclass in cmds:
+ if cmdclass.hidden:
+ continue
+ doc = getdoc(cmdclass)
+ if doc == None:
+ outfile.write(cmdname + '\n')
+ else:
+ doclines = doc.splitlines()
+ firstline = doclines[0].lower()
+ outfile.write(cmdname + ':' + firstline[0:-1] + '\n')
*** modified file 'bzrlib/commands.py'
--- bzrlib/commands.py
+++ bzrlib/commands.py
@@ -1551,6 +1551,16 @@
help.help(topic)
+class cmd_shell_complete(Command):
+ """Show appropriate completions for context.
+
+ For a list of all available commands, say 'bzr shell-complete'."""
+ takes_args = ['context?']
+ aliases = ['s-c']
+
+ def run(self, context=None):
+ import shellcomplete
+ shellcomplete.shellcomplete(context)
class cmd_missing(Command):
More information about the bazaar
mailing list