From 280652a21eb08799dc9fe3e946bc4c22c8ea710e Mon Sep 17 00:00:00 2001
From: Seblu <sebastien.luttringer@smartjog.com>
Date: Sat, 8 Jan 2011 04:29:28 +0100
Subject: [PATCH] correctly handle ? and ! completion and execution

---
 cccli/cli.py     | 26 +++++++++++++++++---------
 cccli/printer.py |  1 +
 2 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/cccli/cli.py b/cccli/cli.py
index 6290d28..0736e56 100644
--- a/cccli/cli.py
+++ b/cccli/cli.py
@@ -120,19 +120,24 @@ class Cli(object):
 
     def _exec_command(self, argv):
         '''Execute command'''
-        self.printer.debug("argv: %s"%argv)
         try:
-            if (argv[0][0] == "!"):
+            # handle ! in command name
+            if argv[0][0] == "!":
                 argv[0] = argv[0][1:]
                 if not len(argv[0]):
                     return
                 p = subprocess.Popen(argv, close_fds=True, shell=True)
                 p.wait()
                 ret = p.returncode
-            elif (argv[0] == "?"):
-                Command(["help"], self).call()
-            else:
-                Command(argv, self).call()
+                return
+            # handle ? in command name
+            if argv[0][0] == "?":
+                if len(argv[0]) > 1:
+                    argv.insert(1, argv[0][1:])
+                argv[0] = "help"
+            # execute command
+            self.printer.debug("argv: %s"%argv)
+            Command(argv, self).call()
         except cmdBadArgument as e:
             if str(e):
                 self.printer.error("Bad argument: %s."%str(e))
@@ -150,8 +155,7 @@ class Cli(object):
         except EOFError:
             self.printer.out("")
         except Exception as e:
-            if cccli.debug:
-                raise
+            if cccli.debug: raise
             self.printer.error("%s: %s"%(type(e), str(e)))
             self.printer.warn("This is a not expected error, please report it!")
 
@@ -160,7 +164,11 @@ class Cli(object):
         comp = self.printer.completion
         stripped = comp.get_buf()[:comp.get_begin() + 1].lstrip()
         if texte == "" and stripped != "":
-            return None
+            return ()
+        if len(texte) > 0 and texte[0] == "!":
+            return ()
+        if len(texte) > 0 and texte[0] == "?":
+            texte = texte[1:]
         return [ c for c in  Command.list() + self.alias.keys() if c.startswith(texte) ]
 
 class CliHandler(RpcHandler):
diff --git a/cccli/printer.py b/cccli/printer.py
index d0b0a73..ae2edca 100644
--- a/cccli/printer.py
+++ b/cccli/printer.py
@@ -259,3 +259,4 @@ class Completion(object):
         self.compfunc = func
         self.readline.set_completer(self._completer)
         self.readline.parse_and_bind("tab: complete")
+        self.readline.set_completer_delims(" \t")
-- 
GitLab