diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/commandmanager.py | 2 | ||||
| -rw-r--r-- | lib/completionmanager.py | 84 | ||||
| -rw-r--r-- | lib/outputmanager.py | 2 | 
3 files changed, 80 insertions, 8 deletions
| diff --git a/lib/commandmanager.py b/lib/commandmanager.py index 3a06f99..bec2a33 100644 --- a/lib/commandmanager.py +++ b/lib/commandmanager.py @@ -31,7 +31,7 @@ class CommandManager:          if cmd in self.cmds:              return self.cmds[cmd]          else: -            raise CmdNotFoundException(cmd + 'is not a valid command.') +            raise CmdNotFoundException(cmd + ' is not a valid command.')      def commands(self):          return self.cmds.keys() diff --git a/lib/completionmanager.py b/lib/completionmanager.py index fe6f099..72458f8 100644 --- a/lib/completionmanager.py +++ b/lib/completionmanager.py @@ -1,9 +1,81 @@ +# Almost all code is based on themole completion. http://themole.nasel.com.ar + +import readline, re + +import sys +  class CompletionManager: -    def __init__(self): -        pass +    def __init__(self, cmd_manager, loader): +        self.manager = cmd_manager +        self.loader = loader + +        readline.parse_and_bind("tab: complete") +        readline.set_completer(self.completer) +        readline.set_completer_delims(' \t\n`~!@#$%^&*()=+[{]}\\|;:\'",<>/?') + +        self.parse_regex = re.compile('("[^"]*"|\'[^\']+\')') + +    def completer(self, text, state): +        if readline.get_begidx() == 0: +            return self.generate_commands(text, state) +        else: +            return self.generate_parameters(text, state) + +    def get_completion(self, text, state): +        if self.current == len(self.available): +            return None +        else: +            tmp = self.available[self.current] +            self.current += 1 + +            return tmp + ' ' + +    def generate_commands(self, text, state): +        if state == 0: +            self.available = [] +            self.current = 0 + +            for c in self.manager.commands(): +                if c[0:len(text)] == text: +                    self.available.append(c) + +            self.available.sort() +            if len(self.available) == 1 and self.available[0] == text: +                self.available = [] +                self.current = 0 + +                return text + ' '                 + +        return self.get_completion(text, state)             + +    def generate_parameters(self, text, state): +        if state == 0: +            self.available = [] +            self.current = 0 +       +            try: +                line = readline.get_line_buffer()[:readline.get_endidx()].split(' ') +                cmd = self.manager.find(line[0]) +            except: +                return 0 + +            current_params = list(filter(lambda x: len(x.strip()) > 0, line[1:-1] if len(line) > 2 else [])) +            if ',' in text: +                text = text.split(',')[-1] + +            for i in cmd.parameters(self.loader, current_params): +                if i[:len(text)] == text: +                    self.available.append(i) + +            self.available.sort() +            if len(self.available) == 1: +                self.available = [] +                self.current = 0 + +                return text + cmd.parameter_separator(current_params) + +        return self.get_completion(text, state) + -    def generate_commands(self): -        pass +             -    def generate_parameters(self): -        pass diff --git a/lib/outputmanager.py b/lib/outputmanager.py index d9d4af1..7427783 100644 --- a/lib/outputmanager.py +++ b/lib/outputmanager.py @@ -3,7 +3,7 @@ import sys  class OutputManager:      def __init__(self): -         +        self.last_line_length = 0          self.echo_output = True      def line_break(self): | 
