diff options
Diffstat (limited to 'ranger/container/keybuffer.py')
-rw-r--r-- | ranger/container/keybuffer.py | 57 |
1 files changed, 51 insertions, 6 deletions
diff --git a/ranger/container/keybuffer.py b/ranger/container/keybuffer.py index 10c9c40c..048a5083 100644 --- a/ranger/container/keybuffer.py +++ b/ranger/container/keybuffer.py @@ -1,11 +1,56 @@ -class KeyBuffer(tuple): - """Extension of tuple suited to be used as a keybuffer""" - def __str__(self): - """returns a concatenation of all characters""" - return "".join( map( to_string, self ) ) - def to_string(i): try: return chr(i) except ValueError: return '?' + +from collections import deque +from curses.ascii import ascii + +ZERO = ord('0') +NINE = ord('9') + +class KeyBuffer(object): + def __init__(self): + self.number = None + self.queue = deque() + self.queue_with_numbers = deque() + + def clear(self): + """Clear the keybuffer and restore the initial state""" + self.number = None + self.queue.clear() + self.queue_with_numbers.clear() + + def append(self, key): + """ + Append a key to the keybuffer, or initial numbers to + the number attribute. + """ + self.queue_with_numbers.append(key) + + if not self.queue and key >= ZERO and key <= NINE: + if self.number is None: + self.number = 0 + try: + self.number = self.number * 10 + int(chr(key)) + except ValueError: + return + else: + self.queue.append(key) + + def tuple_with_numbers(self): + """Get a tuple of ascii codes.""" + return tuple(self.queue_with_numbers) + + def tuple_without_numbers(self): + """ + Get a tuple of ascii codes. + If the keybuffer starts with numbers, those will + be left out. To access them, use keybuffer.number + """ + return tuple(self.queue) + + def __str__(self): + """returns a concatenation of all characters""" + return "".join( map( to_string, self.queue_with_numbers ) ) |