diff options
-rw-r--r-- | ranger/bookmark.py | 72 | ||||
-rw-r--r-- | ranger/conf/keys.py | 1 | ||||
-rw-r--r-- | ranger/fm.py | 4 |
3 files changed, 72 insertions, 5 deletions
diff --git a/ranger/bookmark.py b/ranger/bookmark.py index e9bfcee1..4b931292 100644 --- a/ranger/bookmark.py +++ b/ranger/bookmark.py @@ -12,20 +12,81 @@ class Bookmarks(object): self.path = os.path.expanduser("~/.ranger/bookmarks") self.load_pattern = re.compile(r"^[\d\w`']:.") self.enter_dir_function = None + self.last_mtime = None - def load(self): + def load_dict(self): import os - self.dct.clear() - + dct = {} if os.access(self.path, os.R_OK): f = open(self.path, 'r') for line in f: if self.load_pattern.match(line): key, value = line[0], line[2:-1] if key in ALLOWED_KEYS: - self.dct[key] = value - + dct[key] = value f.close() + return dct + else: + raise OSError('Cannot read the given path') + + def set_dict(self, dct): + self.dct.clear() + self.dct.update(dct) + self.original_dict = self.dct.copy() + self.last_mtime = self.get_mtime() + + def get_mtime(self): + import os + return os.stat(self.path).st_mtime + + def load(self): + try: + new_dict = self.load_dict() + except OSError: + return + + self.set_dict(new_dict) + + def delete(self, key): + if key in self.dct: + del self.dct[key] + self.save() + + def update(self): + try: + real_dict = self.load_dict() + except OSError: + return + + for key in set(self.dct.keys()) | set(real_dict.keys()): + if key in self.dct: + current = self.dct[key] + else: + current = None + + if key in self.original_dict: + original = self.original_dict[key] + else: + original = None + + if key in real_dict: + real = real_dict[key] + else: + real = None + + if current == original and current != real: + continue + + if key not in self.dct: + del real_dict[key] + else: + real_dict[key] = current + + self.set_dict(real_dict) + + def reload_if_outdated(self): + if self.last_mtime != self.get_mtime(): + self.update() def enter(self, key): if self.enter_dir_function is not None: @@ -53,6 +114,7 @@ class Bookmarks(object): def save(self): import os + self.update() if os.access(self.path, os.W_OK): f = open(self.path, 'w') diff --git a/ranger/conf/keys.py b/ranger/conf/keys.py index 9a9bcff3..a800253b 100644 --- a/ranger/conf/keys.py +++ b/ranger/conf/keys.py @@ -59,6 +59,7 @@ def initialize_commands(cl): for key in ALLOWED_BOOKMARK_KEYS: cl.bind(c(FM.enter_bookmark, key), "`" + key, "'" + key) cl.bind(c(FM.set_bookmark, key), "m" + key) + cl.bind(c(FM.unset_bookmark, key), "um" + key) # system functions cl.bind(FM.exit, ctrl('D'), 'q', 'ZZ') diff --git a/ranger/fm.py b/ranger/fm.py index 3f36045d..0cbebea2 100644 --- a/ranger/fm.py +++ b/ranger/fm.py @@ -15,6 +15,7 @@ class FM(): while True: try: + self.bookmarks.reload_if_outdated() self.ui.draw() key = self.ui.get_next_key() self.ui.press(key, self) @@ -54,6 +55,9 @@ class FM(): def set_bookmark(self, key): self.bookmarks[key] = self.env.pwd.path + def unset_bookmark(self, key): + self.bookmarks.delete(key) + def move_left(self): self.env.enter_dir('..') |