From ffec67de733cfa2ee1c2dab6b87f933565180330 Mon Sep 17 00:00:00 2001 From: hut Date: Fri, 4 Dec 2009 20:55:03 +0100 Subject: implemented searching --- ranger/conf/keys.py | 3 +++ ranger/directory.py | 26 ++++++++++++++++++++++++++ ranger/environment.py | 1 + ranger/fm.py | 10 ++++++++++ ranger/gui/wconsole.py | 10 +++++++++- 5 files changed, 49 insertions(+), 1 deletion(-) 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 -- cgit 1.4.1-2-gfad0