from curses import * from curses.ascii import * from ranger import RANGERDIR from ranger.gui.widgets import console_mode as cmode from ranger.gui.widgets.console import Console from ranger.container.bookmarks import ALLOWED_KEYS as ALLOWED_BOOKMARK_KEYS # syntax for binding keys: bind(*keys, fnc) # fnc is a function which is called with the FM instance, # keys are one or more key-combinations which are either: # * a string # * an integer which represents an ascii code # * a tuple of integers # # in initialize_console_commands, fnc is a function which is # called with the console widget instance instead. def initialize_commands(command_list): """Initialize the commands for the main user interface""" def do(method, *args, **kw): return lambda fm, n: getattr(fm, method)(*args, **kw) def bind(*args): command_list.bind(args[-1], *args[:-1]) bind('l', KEY_RIGHT, do('move_right')) bind(KEY_ENTER, ctrl('j'), do('move_right', mode=1)) bind('H', do('history_go', -1)) bind('L', do('history_go', 1)) bind('J', do('move_pointer_by_pages', 0.5)) bind('K', do('move_pointer_by_pages', -0.5)) bind('E', do('edit_file')) # bind('o', do('force_load_preview')) bind('i', do('tag_toggle')) bind('I', do('tag_remove')) bind(' ', do('mark', toggle=True)) bind('v', do('mark', all=True, toggle=True)) bind('V', do('mark', all=True, val=False)) bind('yy', do('copy')) bind('dd', do('cut')) bind('p', do('paste')) bind('s', do('spawn', 'bash')) bind(TAB, do('search', order='tag')) t_hint = "show_//h//idden //p//review_files //d//irectories_first //a//uto_load_preview //c//ollapse_preview" command_list.hint(t_hint, 't') bind('th', do('toggle_boolean_option', 'show_hidden')) bind('tp', do('toggle_boolean_option', 'preview_files')) bind('td', do('toggle_boolean_option', 'directories_first')) bind('ta', do('toggle_boolean_option', 'auto_load_preview')) bind('tc', do('toggle_boolean_option', 'collapse_preview')) sort_hint = "//s//ize //b//ase//n//ame //m//time //t//ype //r//everse" sort_dict = { 's': 'size', 'b': 'basename', 'n': 'basename', 'm': 'mtime', 't': 'type', } for key, val in sort_dict.items(): for key, is_upper in ((key.lower(), False), (key.upper(), True)): # reverse if any of the two letters is capital bind('o' + key, do('sort', func=val, reverse=is_upper)) bind('O' + key, do('sort', func=val, reverse=True)) bind('or', 'Or', 'oR', 'OR', lambda fm, n: \ fm.sort(reverse=not fm.settings.reverse)) command_list.hint(sort_hint, 'o', 'O') def edit_name(fm, n): cf = fm.env.cf if cf: fm.open_console(cmode.COMMAND, 'rename ' + cf.basename) bind('A', edit_name) bind('cw', do('open_console', cmode.COMMAND, 'rename ')) bind('cd', do('open_console', cmode.COMMAND, 'cd ')) bind('f', do('open_console', cmode.COMMAND_QUICK, 'find ')) bind('term', do('spawn', 'x-terminal-emulator')) bind('du', do('runcmd', 'du --max-depth=1 -h | less')) bind('tf', do('open_console', cmode.COMMAND, 'filter ')) d_hint = 'd//u// (disk usage) d//d// (cut)' command_list.hint(d_hint, 'd') # key combinations which change the current directory def cd(path): return lambda fm: fm.enter_dir(path) bind('gh', do('cd', '~')) bind('ge', do('cd', '/etc')) bind('gu', do('cd', '/usr')) bind('gr', do('cd', '/')) bind('gm', do('cd', '/media')) bind('gn', do('cd', '/mnt')) bind('gt', do('cd', '~/.trash')) bind('gs', do('cd', '/srv')) bind('gR', do('cd', RANGERDIR)) bind('n', do('search', forward=True)) bind('N', do('search', forward=False)) bind('cc', do('search', forward=True, order='ctime')) bind('cm', do('search', forward=True, order='mimetype')) bind('cs', do('search', forward=True, order='size')) c_hint = '//c//time //m//imetype //s//ize' command_list.hint(c_hint, 'c') # bookmarks for key in ALLOWED_BOOKMARK_KEYS: bind("`" + key, "'" + key, do('enter_bookmark', key)) bind("m" + key, do('set_bookmark', key)) bind("um" + key, do('unset_bookmark', key)) # system functions bind(ctrl('D'), 'q', 'ZZ', do('exit')) bind(ctrl('R'), do('reset')) bind(ctrl('L'), do('redraw_window')) bind(ctrl('C'), do('interrupt')) bind(KEY_RESIZE, do('resize')) bind(KEY_MOUSE, do('handle_mouse')) bind(':', do('open_console', cmode.COMMAND)) bind('>', do('open_console', cmode.COMMAND_QUICK)) bind('/', do('open_console', cmode.SEARCH)) bind('?', do('open_console', cmode.SEARCH)) bind('!', do('open_console', cmode.OPEN)) bind('r', do('open_console', cmode.OPEN_QUICK)) # definitions which require their own function: def test(fm, n): from ranger import log log(fm.bookmarks.dct) bind('x', test) def ggG(default): # moves to an absolute point, or to a predefined default # if no number is specified. return lambda fm, n: \ fm.move_pointer(absolute=(n or default)-1) bind('gg', ggG(1)) bind('G', ggG(0)) bind('%', lambda fm, n: fm.move_pointer_by_percentage(absolute=n or 50)) def jk(direction): # moves up or down by the specified number or one, in # the predefined direction return lambda fm, n: \ fm.move_pointer(relative=(n or 1) * direction) bind('j', KEY_DOWN, jk(1)) bind('k', KEY_UP, jk(-1)) bind('h', KEY_LEFT, KEY_BACKSPACE, DEL, lambda fm, n: \ fm.move_left(n or 1)) bind('w', lambda fm, n: fm.ui.open_pman()) command_list.rebuild_paths() def initialize_console_commands(command_list): """Initialize the commands for the console widget only""" def bind(*args): command_list.bind(args[-1], *args[:-1]) def do(method, *args, **kw): return lambda widget: getattr(widget, method)(*args, **kw) def do_fm(method, *args, **kw): return lambda widget: getattr(widget.fm, method)(*args, **kw) # movement bind(KEY_UP, do('history_move', -1)) bind(KEY_DOWN, do('history_move', 1)) bind(ctrl('b'), KEY_LEFT, do('move', relative = -1)) bind(ctrl('f'), KEY_RIGHT, do('move', relative = 1)) bind(ctrl('a'), KEY_HOME, do('move', absolute = 0)) bind(ctrl('e'), KEY_END, do('move', absolute = -1)) bind(ctrl('d'), KEY_DC, do('delete', 0)) bind(ctrl('h'), KEY_BACKSPACE, DEL, do('delete', -1)) bind(ctrl('w'), do('delete_word')) bind(ctrl('k'), do('delete_rest', 1)) bind(ctrl('u'), do('delete_rest', -1)) bind(ctrl('y'), do('paste')) # system functions bind(ctrl('c'), ESC, do('close')) bind(ctrl('j'), KEY_ENTER, do('execute')) bind(ctrl('l'), do_fm('redraw')) bind(TAB, do('tab')) bind(KEY_BTAB, do('tab', -1)) bind(KEY_RESIZE, do_fm('resize')) # type keys def type_key(key): return lambda con: con.type_key(key) for i in range(ord(' '), ord('~')+1): bind(i, type_key(i)) command_list.rebuild_paths() def initialize_process_manager_commands(command_list): """Initialize the commands for the process manager widget""" from ranger.gui.widgets.process_manager import KeyWrapper as wdg def bind(*args): command_list.bind(args[-1], *args[:-1]) def do(method, *args, **kw): return lambda widget, n: getattr(widget, method)(*args, **kw) def do_fm(method, *args, **kw): return lambda widget, n: getattr(widget.fm, method)(*args, **kw) bind('j', KEY_DOWN, wdg.move(relative=1)) bind('k', KEY_UP, wdg.move(relative=-1)) bind('gg', wdg.move(absolute=0)) bind('G', wdg.move(absolute=-1)) bind('K', lambda wdg, n: wdg.process_move(0)) bind('J', lambda wdg, n: wdg.process_move(-1)) bind('dd', do('process_remove')) bind('w', ESC, ctrl('d'), ctrl('c'), lambda wdg, n: wdg.fm.ui.close_pman()) bind(KEY_RESIZE, do_fm('resize')) command_list.rebuild_paths()