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()