From f69105521406e581344088103623652d23c51933 Mon Sep 17 00:00:00 2001 From: hut Date: Fri, 4 Dec 2009 19:59:41 +0100 Subject: improve bookmarks (delete, reload_if_outdated) --- ranger/bookmark.py | 72 +++++++++++++++++++++++++++++++++++++++++++++++++---- ranger/conf/keys.py | 1 + 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('..') -- cgit 1.4.1-2-gfad0 n25'>25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116