diff --git a/cccli/cli.py b/cccli/cli.py index 6290d2843f5101e39afa163cda8a5cede076c0f1..0736e56c1b162b592dac608b5f4bf3490e462a1c 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 d0b0a73fd36f719498833f8b603122f0d2ca2b1f..ae2edcaf4d261cd1a427b17eec10bcd39693bc9d 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")