summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorhut <hut@lavabit.com>2010-02-18 21:58:37 +0100
committerhut <hut@lavabit.com>2010-03-09 14:40:22 +0100
commitea3b13663ea3bbf42cd3472750ee7e00e9093ca4 (patch)
tree6dfc99b936a28d6e47c473c9a100cb97fb003c6e
parent13ecffe7ffa5c80cd69d55419f230c97d06ab23e (diff)
downloadranger-ea3b13663ea3bbf42cd3472750ee7e00e9093ca4.tar.gz
keyparser: allow passive actions (for hints, show bookmarks)
-rw-r--r--ranger/container/keymap.py10
-rw-r--r--test/tc_newkeys.py30
2 files changed, 39 insertions, 1 deletions
diff --git a/ranger/container/keymap.py b/ranger/container/keymap.py
index 70faa0d0..23f26448 100644
--- a/ranger/container/keymap.py
+++ b/ranger/container/keymap.py
@@ -18,6 +18,7 @@ from inspect import isfunction, getargspec
 from ranger.ext.tree import Tree
 
 MAX_ALIAS_RECURSION = 20
+PASSIVE_ACTION = 9003
 DIRKEY = 9001
 ANYKEY = 9002
 FUNC = 'func'
@@ -207,8 +208,8 @@ class KeyBuffer(object):
 		return True
 
 	def _do_eval_command(self, key):
+		assert isinstance(self.tree_pointer, dict), self.tree_pointer
 		try:
-			assert isinstance(self.tree_pointer, dict), self.tree_pointer
 			self.tree_pointer = self.tree_pointer[key]
 		except TypeError:
 			print(self.tree_pointer)
@@ -230,6 +231,11 @@ class KeyBuffer(object):
 				self.failure = True
 				return None
 		else:
+			if isinstance(self.tree_pointer, dict):
+				try:
+					self.command = self.tree_pointer[PASSIVE_ACTION]
+				except (KeyError, TypeError):
+					self.command = None
 			self._try_to_finish()
 
 	def _try_to_finish(self, rec=MAX_ALIAS_RECURSION):
@@ -274,10 +280,12 @@ class KeyBuffer(object):
 				return self.command
 			if self.failure:
 				break
+		return self.command
 
 key_map = {
 	'dir': DIRKEY,
 	'any': ANYKEY,
+	'psv': PASSIVE_ACTION,
 	'cr': ord("\n"),
 	'enter': ord("\n"),
 	'space': ord(" "),
diff --git a/test/tc_newkeys.py b/test/tc_newkeys.py
index 0922029e..697bfdcb 100644
--- a/test/tc_newkeys.py
+++ b/test/tc_newkeys.py
@@ -38,6 +38,36 @@ class PressTestCase(TestCase):
 
 class Test(PressTestCase):
 	"""The test cases"""
+	def test_passive_action(self):
+		km = KeyMap()
+		directions = KeyMap()
+		kb = KeyBuffer(km, directions)
+		def n(value):
+			"""return n or value"""
+			def fnc(arg=None):
+				if arg is None or arg.n is None:
+					return value
+				return arg.n
+			return fnc
+
+		km.add(n(5), 'ppp')
+		km.add(n(8), 'pp<psv>')
+		km.add(n(2), 'pp<dir>')
+		directions.add('j', dir=Direction(down=1))
+
+		press = self._mkpress(kb, km)
+		self.assertEqual(5, press('ppp'))
+		self.assertEqual(3, press('3ppp'))
+
+		self.assertEqual(2, press('ppj'))
+
+		kb.clear()
+		match = kb.simulate_press('pp')
+		args = CommandArgs(0, 0, kb)
+		self.assert_(match)
+		self.assert_(match.function)
+		self.assertEqual(8, match.function(args))
+
 	def test_translate_keys(self):
 		def test(string, *args):
 			if not args: