diff options
Diffstat (limited to 'ranger/gui/wconsole.py')
-rw-r--r-- | ranger/gui/wconsole.py | 134 |
1 files changed, 127 insertions, 7 deletions
diff --git a/ranger/gui/wconsole.py b/ranger/gui/wconsole.py index 4411e83b..fdaa7716 100644 --- a/ranger/gui/wconsole.py +++ b/ranger/gui/wconsole.py @@ -1,7 +1,8 @@ from ranger.gui.widget import Widget as SuperClass import curses -CONSOLE_MODES = tuple(':/?>!') +CONSOLE_MODES = tuple(':@/?>!') +CONSOLE_MODES_DICTIONARY = { '@': 'open with: ' } class WConsole(SuperClass): def __init__(self, win, colorscheme): @@ -14,16 +15,26 @@ class WConsole(SuperClass): initialize_console_commands(self.commandlist) self.last_cursor_mode = 1 self.clear() + self.prompt = None + self.execute_funcs = { + ':': WConsole.execute_command, + '@': WConsole.execute_openwith_quick, + '/': WConsole.execute_search, + '?': WConsole.execute_search, + '>': WConsole.execute_noreturn, + '!': WConsole.execute_openwith } + + def feed_env(self, env): + self.cf = env.cf def draw(self): if self.mode is None: return - - self.win.addstr(self.y, self.x, ":" + self.line) + self.win.addstr(self.y, self.x, self.prompt + self.line) def finalize(self): try: - self.win.move(self.y, self.x + self.pos + 1) + self.win.move(self.y, self.x + self.pos + len(self.prompt)) except: pass @@ -33,6 +44,10 @@ class WConsole(SuperClass): self.last_cursor_mode = curses.curs_set(1) self.mode = mode + try: + self.prompt = CONSOLE_MODES_DICTIONARY[self.mode] + except KeyError: + self.prompt = self.mode self.focused = True self.visible = True return True @@ -50,8 +65,8 @@ class WConsole(SuperClass): def press(self, key, fm, env): from curses.ascii import ctrl, ESC - from ranger.helper import log - log(key) +# from ranger.helper import log +# log(key) try: cmd = self.commandlist.paths[env.keybuffer] @@ -93,13 +108,118 @@ class WConsole(SuperClass): self.pos = 0 def delete(self, mod): + if mod == -1 and len(self.line) == 0: + self.close() pos = self.pos + mod self.line = self.line[0:pos] + self.line[pos+1:] self.move(relative = mod) - def execute(self): + def execute(self, fm): + try: + self.execute_funcs[self.mode] (self, fm) + except KeyError: + pass self.line = '' self.pos = 0 self.close() + def execute_search(self, fm): + pass + + def execute_openwith(self, fm): + line = self.line + if line[0] == '!': + fm.execute_file(tuple(line[1:].split()) + (fm.env.cf.path, )) + else: + fm.execute_file(tuple(line.split()) + (fm.env.cf.path, ), background = True) + + def execute_openwith_quick(self, fm): + split = self.line.split() + app, flags, mode = get_app_flags_mode(self.line, fm) + fm.execute_file( + files = [self.cf], + app = app, + flags = flags, + mode = mode ) + + def execute_noreturn(self, fm): + pass + + def execute_command(self, fm): + pass + +def get_app_flags_mode(line, fm): + app = '' + flags = '' + mode = 0 + split = line.split() + + if len(split) == 0: + pass + + elif len(split) == 1: + part = split[0] + if is_app(part, fm): + app = part + elif is_flags(part): + flags = part + elif is_mode(part): + mode = part + + elif len(split) == 2: + part0 = split[0] + part1 = split[1] + + if is_app(part0, fm): + app = part0 + if is_flags(part1): + flags = part1 + elif is_mode(part1): + mode = part1 + elif is_flags(part0): + flags = part0 + if is_mode(part1): + mode = part1 + elif is_mode(part0): + mode = part0 + if is_flags(part1): + flags = part1 + + elif len(split) >= 3: + part0 = split[0] + part1 = split[1] + part2 = split[2] + + if is_app(part0, fm): + app = part0 + if is_flags(part1): + flags = part1 + if is_mode(part2): + mode = part2 + elif is_mode(part1): + mode = part1 + if is_flags(part2): + flags = part2 + elif is_flags(part0): + flags = part0 + if is_mode(part1): + mode = part1 + elif is_mode(part0): + mode = part0 + if is_flags(part1): + flags = part1 + + return app, flags, int(mode) + +def is_app(arg, fm): + return fm.apps.has(arg) + +def is_flags(arg): + from ranger.applications import ALLOWED_FLAGS + return all(x in ALLOWED_FLAGS for x in arg) + +def is_mode(arg): + return all(x in '0123456789' for x in arg) + + |