[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