X-Git-Url: https://vcs.fsf.org/?p=rainbowstream.git;a=blobdiff_plain;f=rainbowstream%2Finteractive.py;h=62be3ec2ef5a9f9ce15eb9882f96fcb6520dfb90;hp=dccd004997edcbdb5a07804d73a859af8114e8cd;hb=7dd6112968b1e90a69fe8d7a8a18da8265947921;hpb=7b896eacd53884dce1e1a1461b85d8bdf73213c4 diff --git a/rainbowstream/interactive.py b/rainbowstream/interactive.py index dccd004..62be3ec 100644 --- a/rainbowstream/interactive.py +++ b/rainbowstream/interactive.py @@ -1,5 +1,8 @@ import readline -import rlcompleter +import os.path + +from .config import * + class RainbowCompleter(object): @@ -7,7 +10,8 @@ class RainbowCompleter(object): """ Init """ - self.options = sorted(options) + self.options = options + self.current_candidates = [] return def complete(self, text, state): @@ -16,30 +20,75 @@ class RainbowCompleter(object): """ response = None if state == 0: - if text: - self.matches = [s - for s in self.options - if s and s.startswith(text)] + origline = readline.get_line_buffer() + begin = readline.get_begidx() + end = readline.get_endidx() + being_completed = origline[begin:end] + words = origline.split() + + if not words: + self.current_candidates = sorted([c for c in self.options]) else: - self.matches = self.options[:] + try: + if begin == 0: + candidates = [c for c in self.options] + elif words[-1] in self.options[words[0]]: + candidates = [] + else: + first = words[0] + candidates = self.options[first] + + if being_completed: + self.current_candidates = [w for w in candidates + if w.startswith(being_completed)] + else: + self.current_candidates = candidates + + except (KeyError, IndexError): + self.current_candidates = [] try: - response = self.matches[state] + response = self.current_candidates[state] except IndexError: response = None return response -def init_interactive_shell(set): +def get_history_items(): + """ + Get all history item + """ + return [ + readline.get_history_item(i) + for i in xrange(1, readline.get_current_history_length() + 1) + ] + + +def read_history(): + """ + Read history file + """ + if os.path.isfile(c['HISTORY_FILENAME']): + readline.read_history_file(c['HISTORY_FILENAME']) + + +def save_history(): + """ + Save history to file + """ + readline.write_history_file(c['HISTORY_FILENAME']) + + +def init_interactive_shell(d): """ Init the rainbow shell """ - readline.set_completer(RainbowCompleter(set).complete) + readline.set_completer(RainbowCompleter(d).complete) readline.parse_and_bind('set editing-mode vi') - readline.parse_and_bind("set input-meta on") - readline.parse_and_bind("set convert-meta off") - readline.parse_and_bind("set output-meta on") + readline.parse_and_bind('set show-all-if-ambiguous on') + readline.parse_and_bind('set show-all-if-unmodified on') + readline.parse_and_bind('set skip-completed-text on') if 'libedit' in readline.__doc__: readline.parse_and_bind("bind ^I rl_complete") else: - readline.parse_and_bind("tab: complete") \ No newline at end of file + readline.parse_and_bind("tab: complete")