about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--ranger/conf/keys.py3
-rw-r--r--ranger/directory.py26
-rw-r--r--ranger/environment.py1
-rw-r--r--ranger/fm.py10
-rw-r--r--ranger/gui/wconsole.py10
5 files changed, 49 insertions, 1 deletions
diff --git a/ranger/conf/keys.py b/ranger/conf/keys.py
index a800253b..dc7362cf 100644
--- a/ranger/conf/keys.py
+++ b/ranger/conf/keys.py
@@ -55,6 +55,9 @@ def initialize_commands(cl):
 	cl.bind(cd("~/.trash"),   'gt')
 	cl.bind(cd("/srv"),       'gs')
 
+	cl.bind(FM.search_forward,  'n')
+	cl.bind(FM.search_backward, 'N')
+
 	# bookmarks
 	for key in ALLOWED_BOOKMARK_KEYS:
 		cl.bind(c(FM.enter_bookmark, key),   "`" + key, "'" + key)
diff --git a/ranger/directory.py b/ranger/directory.py
index 55ca89a9..d8aa3b71 100644
--- a/ranger/directory.py
+++ b/ranger/directory.py
@@ -135,6 +135,29 @@ class Directory(SuperClass):
 				return True
 			i += 1
 		return False
+	
+	def search(self, arg, direction = 1):
+		if self.empty() or arg is None:
+			return False
+		elif hasattr(arg, 'search'):
+			fnc = lambda x: arg.search(x.basename)
+		else:
+			fnc = lambda x: arg in x.basename
+
+		length = len(self)
+
+		if direction > 0:
+			generator = ((self.pointed_index + (x + 1)) % length for x in range(length-1))
+		else:
+			generator = ((self.pointed_index - (x + 1)) % length for x in range(length-1))
+
+		for i in generator:
+			_file = self.files[i]
+			if fnc(_file):
+				self.pointed_index = i
+				self.pointed_file = _file
+				return True
+		return False
 
 	def correct_pointer(self):
 		"""make sure the pointer is in the valid range of 0 : len(self.files)-1 (or None if directory is empty.)"""
@@ -179,6 +202,9 @@ class Directory(SuperClass):
 	def empty(self):
 		return self.files is None or len(self.files) == 0
 
+	def __nonzero__(self):
+		return True
+
 	def __len__(self):
 		if not self.accessible: raise ranger.fsobject.NotLoadedYet()
 		return len(self.files)
diff --git a/ranger/environment.py b/ranger/environment.py
index f5dbe176..be39fbb6 100644
--- a/ranger/environment.py
+++ b/ranger/environment.py
@@ -8,6 +8,7 @@ class Environment():
 		self.path = abspath(expanduser(path))
 		self.opt = opt
 		self.pathway = ()
+		self.last_search = None
 		self.directories = {}
 		self.pwd = None # current directory
 		self.cf = None # current file
diff --git a/ranger/fm.py b/ranger/fm.py
index 0cbebea2..9a13332e 100644
--- a/ranger/fm.py
+++ b/ranger/fm.py
@@ -31,6 +31,16 @@ class FM():
 			time.sleep(0.2)
 		except KeyboardInterrupt:
 			raise SystemExit()
+	
+	def search_forward(self):
+		if self.env.pwd:
+			if self.env.pwd.search(self.env.last_search):
+				self.env.cf = self.env.pwd.pointed_file
+
+	def search_backward(self):
+		if self.env.pwd:
+			if self.env.pwd.search(self.env.last_search, -1):
+				self.env.cf = self.env.pwd.pointed_file
 
 	def resize(self):
 		self.ui.resize()
diff --git a/ranger/gui/wconsole.py b/ranger/gui/wconsole.py
index fdaa7716..611790f8 100644
--- a/ranger/gui/wconsole.py
+++ b/ranger/gui/wconsole.py
@@ -125,7 +125,15 @@ class WConsole(SuperClass):
 		self.close()
 
 	def execute_search(self, fm):
-		pass
+		import re
+		if fm.env.pwd:
+#			try:
+				regexp = re.compile(self.line, re.L | re.U | re.I)
+				fm.env.last_search = regexp
+				if fm.env.pwd.search(regexp):
+					fm.env.cf = fm.env.pwd.pointed_file
+#			except:
+#				pass
 
 	def execute_openwith(self, fm):
 		line = self.line