import readline, signal prompt = 'GigiX > ' def signal_handler(signal, frame): print input(prompt) return signal.signal(signal.SIGINT, signal_handler) readline.parse_and_bind("tab: complete") class completer: def __init__(self, tree): self.tree = tree def _parser(self, line, search): if (search is None) or (callable(search) == True): return [] elif len(line) == 0: return [x for x in search] elif len(line) == 1 and readline.get_line_buffer()[-1] != ' ': return ['%s ' % x for x in search if x.startswith(line[0])] else: return self._parser(line[1:], search[line[0]]) return [] def complete(self, text, state): line = readline.get_line_buffer().split() results = self._parser(line, self.tree) return results[state] def linux_sles_12(): print('Je suis Linux SLES 12') tree = { 'unix': { 'solaris': { '8':None, '9':None, '10':None, '11':None, } }, 'linux': { 'debian': { 'buzz':None, 'rex':None, 'bo':None, 'hamm':None, 'slink':None, 'patato':None, 'woody':None, 'sarge':None, 'etch':None, 'lenny':None, 'squeeze':None, 'wheezy':None, 'jessie':None, }, 'RHEL': { '3':None, '4':None, '5':None, '6':None, '7':None, }, 'SLES': { '9':None, '10':None, '11':None, '12':linux_sles_12, } }, 'windows': { 'xp':None, 'vista':None, 'seven':None, '8':None, '10':None, } } readline.set_completer(completer(tree).complete) l = '' while l != ('quit' or 'exit'): try: l = input(prompt) eval("tree['"+"']['".join(l.split())+"']()") except EOFError: print('Bye') break except: continue