about summary refs log tree commit diff stats
path: root/ranger/container/keybuffer.py
diff options
context:
space:
mode:
Diffstat (limited to 'ranger/container/keybuffer.py')
-rw-r--r--ranger/container/keybuffer.py57
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 ) )