diff options
Diffstat (limited to 'src/windows.py')
-rw-r--r-- | src/windows.py | 57 |
1 files changed, 33 insertions, 24 deletions
diff --git a/src/windows.py b/src/windows.py index 2352a82a..4f2c68c6 100644 --- a/src/windows.py +++ b/src/windows.py @@ -122,7 +122,6 @@ class Win(object): self.move(y, x) next_attr_char = text.find('\x19') while next_attr_char != -1 and text: - log.debug('Addstr_Colored: [%s]' % text.replace('\x19', '\\x19')) if next_attr_char + 1 < len(text): attr_char = text[next_attr_char+1].lower() else: @@ -883,26 +882,28 @@ class Input(Win): self.rewrite_text() return True - def key_left(self, jump=True): + def key_left(self, jump=True, reset=True): """ Move the cursor one char to the left """ - self.reset_completion() + if reset: + self.reset_completion() if self.pos == self.width-1 and self.line_pos > 0: self.line_pos -= 1 elif self.pos >= 1: self.pos -= 1 if jump and self.pos+self.line_pos >= 1 and self.text[self.pos+self.line_pos-1] == '\x19': self.key_left() - else: + elif reset: self.rewrite_text() return True - def key_right(self, jump=True): + def key_right(self, jump=True, reset=True): """ Move the cursor one char to the right """ - self.reset_completion() + if reset: + self.reset_completion() if self.pos == self.width-1: if self.line_pos + self.width-1 < len(self.text): self.line_pos += 1 @@ -910,7 +911,7 @@ class Input(Win): self.pos += 1 if jump and self.pos+self.line_pos < len(self.text) and self.text[self.pos+self.line_pos-1] == '\x19': self.key_right() - else: + elif reset: self.rewrite_text() return True @@ -936,8 +937,6 @@ class Input(Win): plus a space, after the completion. If it's a string, we use it after the completion (with no additional space) """ - if self.pos+self.line_pos != len(self.text): # or len(self.text) == 0 - return # we don't complete if cursor is not at the end of line completion_type = config.get('completion', 'normal') if completion_type == 'shell' and self.text != '': self.shell_completion(word_list, add_after) @@ -957,33 +956,42 @@ class Input(Win): Normal completion """ (y, x) = self._win.getyx() + pos = self.pos + self.line_pos + if pos < len(self.text) and after.endswith(' ') and self.text[pos] == ' ': + after = after[:-1] # remove the last space if we are already on a space if not self.last_completion: - # begin is the begining of the word we want to complete - if self.text.strip() and not self.text.endswith(' '): - begin = self.text.split()[-1].lower() + space_before_cursor = self.text.rfind(' ', 0, pos) + if space_before_cursor != -1: + begin = self.text[space_before_cursor+1:pos] else: - begin = '' + begin = self.text[:pos] hit_list = [] # list of matching nicks for word in word_list: - if word.lower().startswith(begin): + if word.lower().startswith(begin.lower()): hit_list.append(word) if len(hit_list) == 0: return self.hit_list = hit_list end = len(begin) else: - if after: - begin = self.text[-len(after)-len(self.last_completion):-len(after)] - else: - begin = self.last_completion - self.hit_list.append(self.hit_list.pop(0)) # rotate list + begin = self.last_completion end = len(begin) + len(after) - if end: - self.text = self.text[:-end] + self.hit_list.append(self.hit_list.pop(0)) # rotate list + + self.text = self.text[:pos-end] + self.text[pos:] + pos -= end nick = self.hit_list[0] # take the first hit + self.text = self.text[:pos] + nick + after + self.text[pos:] + for i in range(end): + try: + self.key_left(reset=False) + except: + pass + for i in range(len(nick + after)): + self.key_right(reset=False) + + self.rewrite_text() self.last_completion = nick - self.text += nick +after - self.key_end(False) def shell_completion(self, word_list, after): """ @@ -1034,7 +1042,8 @@ class Input(Win): return res if not key or len(key) > 1: return False # ignore non-handled keyboard shortcuts - self.reset_completion() + if reset: + self.reset_completion() self.text = self.text[:self.pos+self.line_pos]+key+self.text[self.pos+self.line_pos:] (y, x) = self._win.getyx() if x == self.width-1: |