# ===================================================================
# == Define keys for the browser
# ===================================================================
# Basic
map Q quit
map q quit
map ZZ quit
map ZQ quit
map R reload_cwd
map <C-r> reset
map <C-l> redraw_window
map H history_go -1
map L history_go 1
map <C-c> abort
map i display_file
map ? help
map W display_log
map w eval fm.ui.open_taskview()
map S shell $SHELL
map : console
map ; console
map ! console shell
map @ console -p6 shell %s
map # console shell -p
map s console shell
map r console open_with
map f console find
map cd console cd
# Tagging / Marking
map t tag_toggle
map T tag_remove
map "<any> tag_toggle tag=%any
map <Space> mark_files toggle=True
map v mark_files all=True val=True
map V mark_files all=True val=False
map uv mark_files all=True val=False
# VIM-like
map gg move to=0
map G move to=-1
map j move down=1
map k move up=1
map h move left=1
map l move right=1
map J move down=0.5 pages=True
map K move up=0.5 pages=True
map <C-d> move down=0.5 pages=True
map <C-u> move up=0.5 pages=True
map <C-f> move down=1 pages=True
map <C-b> move up=1 pages=True
# For the nostalgics: Midnight Commander bindings
map <F1> help
map <F3> display_file
map <F4> edit
map <F5> copy
map <F6> cut
map <F7> console mkdir
map <F8> console delete seriously?
map <F10> exit
# In case you work on a keyboard with dvorak layout
map <UP> move up=1
map <DOWN> move down=1
map <LEFT> move left=1
map <RIGHT> move right=1
map <HOME> move to=0
map <END> move to=-1
map <PAGEDOWN> move down=1 pages=True
map <PAGEUP> move up=1 pages=True
map <CR> move right=1
map <DEL> console delete
map <INS> console touch
# Jumping around
map ] move_parent 1
map [ move_parent -1
map } traverse
map gh cd ~
map ge cd /etc
map gu cd /usr
map gd cd /dev
map gl cd -r .
map gL cd -r %f
map go cd /opt
map gv cd /var
map gm cd /media
map gM cd /mnt
map gs cd /srv
map gR eval fm.cd(ranger.RANGERDIR)
# External Programs
map E edit
map du shell -p du --max-depth=1 -h --apparent-size
map dU shell -p du --max-depth=1 -h --apparent-size | sort -rh
map yp shell -d echo -n %d/%f | xsel -i
map yd shell -d echo -n %d | xsel -i
map yn shell -d echo -n %%f | xsel -i
# Filesystem Operations
map = chmod
map cw console rename
map A eval fm.open_console('rename ' + fm.env.cf.basename)
map I eval fm.open_console('rename ' + fm.env.cf.basename, position=7)
map pp paste
map po paste overwrite=True
map pl paste_symlink relative=False
map pL paste_symlink relative=True
map phl paste_hardlink
map dd cut
map ud uncut
map da cut mode=add
map dr cut mode=remove
map yy copy
map uy uncut
map ya copy mode=add
map yr copy mode=remove
# Temporary workarounds
map dgg eval fm.cut(dirarg=dict(to=0), narg=quantifier)
map dG eval fm.cut(dirarg=dict(to=-1), narg=quantifier)
map dj eval fm.cut(dirarg=dict(down=1), narg=quantifier)
map dk eval fm.cut(dirarg=dict(up=1), narg=quantifier)
map ygg eval fm.copy(dirarg=dict(to=0), narg=quantifier)
map yG eval fm.copy(dirarg=dict(to=-1), narg=quantifier)
map yj eval fm.copy(dirarg=dict(down=1), narg=quantifier)
map yk eval fm.copy(dirarg=dict(up=1), narg=quantifier)
# Searching
map / console search
map n search_next
map N search_next forward=False
map ct search_next order=tag
map cs search_next order=size
map ci search_next order=mimetype
map cc search_next order=ctime
map cm search_next order=mtime
map ca search_next order=atime
# Tabs
map <C-n> chain tab_new; cd ~
map <C-w> tab_close
map <TAB> tab_move 1
map <S-TAB> tab_move -1
map gn chain tab_new; cd ~
map gc tab_close
map gt tab_move 1
map gT tab_move -1
map <a-1> tab_open 1
map <a-2> tab_open 2
map <a-3> tab_open 3
map <a-4> tab_open 4
map <a-5> tab_open 5
map <a-6> tab_open 6
map <a-7> tab_open 7
map <a-8> tab_open 8
map <a-9> tab_open 9
# Sorting
map or eval fm.settings.sort_reverse ^= True
map os chain set sort=size; set sort_reverse=False
map ob chain set sort=basename; set sort_reverse=False
map on chain set sort=natural; set sort_reverse=False
map om chain set sort=mtime; set sort_reverse=False
map oc chain set sort=ctime; set sort_reverse=False
map oa chain set sort=atime; set sort_reverse=False
map ot chain set sort=type; set sort_reverse=False
map oS chain set sort=size; set sort_reverse=True
map oB chain set sort=basename; set sort_reverse=True
map oN chain set sort=natural; set sort_reverse=True
map oM chain set sort=mtime; set sort_reverse=True
map oC chain set sort=ctime; set sort_reverse=True
map oA chain set sort=atime; set sort_reverse=True
map oT chain set sort=type; set sort_reverse=True
# Settings
map zc toggle_option collapse_preview
map zd toggle_option sort_directories_first
map zh toggle_option show_hidden
map <C-h> toggle_option show_hidden
map zi toggle_option flushinput
map zm toggle_option mouse_enabled
map zp toggle_option preview_files
map zP toggle_option preview_directories
map zs toggle_option sort_case_insensitive
map zv toggle_option use_preview_script
map zf console filter
# Bookmarks
map `<bg> draw_bookmarks
map '<bg> draw_bookmarks
map m<bg> draw_bookmarks
map um<bg> draw_bookmarks
map `<any> enter_bookmark %any
map '<any> enter_bookmark %any
map m<any> set_bookmark %any
map um<any> unset_bookmark %any
# Beware. I haven't figured out how to make these keybindings pretty yet:
# map +ow shell -d chmod o+w (one mapping for each combination)
eval import itertools; [cmd("map +%s%s shell -d chmod %s+%s %%s" % (mode+mode)) for mode in itertools.product("ugoa", "rwxXst")]
# map -ow shell -d chmod o+w (one mapping for each combination)
eval import itertools; [cmd("map -%s%s shell -d chmod %s-%s %%s" % (mode+mode)) for mode in itertools.product("ugoa", "rwxXst")]
# ===================================================================
# == Define keys for the console
# ===================================================================
# Basic
cmap <tab> eval fm.ui.console.tab()
cmap <s-tab> eval fm.ui.console.tab(-1)
cmap <C-c> eval fm.ui.console.close()
cmap <C-d> eval fm.ui.console.close()
cmap <ESC> eval fm.ui.console.close()
cmap <CR> eval fm.ui.console.execute()
cmap <C-j> eval fm.ui.console.execute()
cmap <C-l> redraw_window
# This special expression allows typing in numerals:
cmap <allow_quantifiers> false
# Move around
cmap <left> eval fm.ui.console.move(left=1)
cmap <right> eval fm.ui.console.move(right=1)
cmap <home> eval fm.ui.console.move(right=0, absolute=True)
cmap <end> eval fm.ui.console.move(right=-1, absolute=True)
cmap <up> eval fm.ui.console.history_move(-1)
cmap <down> eval fm.ui.console.history_move(1)
# And of course the emacs way
cmap <C-b> eval fm.ui.console.move(left=1)
cmap <C-f> eval fm.ui.console.move(right=1)
cmap <C-a> eval fm.ui.console.move(right=0, absolute=True)
cmap <C-e> eval fm.ui.console.move(right=-1, absolute=True)
cmap <C-p> eval fm.ui.console.history_move(-1)
cmap <C-n> eval fm.ui.console.history_move(1)
# Line Editing
# Note: There are multiple ways to express backspaces. <backspace> (code 263)
# and <backspace2> (code 127). To be sure, use both.
cmap <backspace> eval fm.ui.console.delete(-1)
cmap <backspace2> eval fm.ui.console.delete(-1)
cmap <delete> eval fm.ui.console.delete(0)
cmap <C-h> eval fm.ui.console.delete(-1)
cmap <C-d> eval fm.ui.console.delete(0)
cmap <C-w> eval fm.ui.console.delete_word()
cmap <C-k> eval fm.ui.console.delete_rest(1)
cmap <C-u> eval fm.ui.console.delete_rest(-1)
cmap <C-y> eval fm.ui.console.paste()
# ===================================================================
# == Pager Keybindings
# ===================================================================
# Movement
pmap j eval -q fm.ui.pager.move(down=1)
pmap k eval -q fm.ui.pager.move(up=1)
pmap gg eval -q fm.ui.pager.move(down=0, absolute=True)
pmap G eval -q fm.ui.pager.move(down=-1, absolute=True)
pmap <down> eval -q fm.ui.pager.move(down=1)
pmap <up> eval -q fm.ui.pager.move(up=1)
pmap <home> eval -q fm.ui.pager.move(down=0, absolute=True)
pmap <end> eval -q fm.ui.pager.move(down=-1, absolute=True)
pmap h eval -q fm.ui.pager.move(left=4)
pmap l eval -q fm.ui.pager.move(right=4)
pmap <left> eval -q fm.ui.pager.move(left=4)
pmap <right> eval -q fm.ui.pager.move(right=4)
pmap q eval -q fm.ui.close_pager(); fm.ui.close_embedded_pager()
pmap i eval -q fm.ui.close_pager(); fm.ui.close_embedded_pager()
pmap <ESC> eval -q fm.ui.close_pager(); fm.ui.close_embedded_pager()
pmap <F3> eval -q fm.ui.close_pager(); fm.ui.close_embedded_pager()
# ===================================================================
# == Taskview Keybindings
# ===================================================================
# Movement
tmap j eval -q fm.ui.taskview.move(down=1)
tmap k eval -q fm.ui.taskview.move(up=1)
tmap gg eval -q fm.ui.taskview.move(down=0, absolute=True)
tmap G eval -q fm.ui.taskview.move(down=-1, absolute=True)
tmap <down> eval -q fm.ui.taskview.move(down=1)
tmap <up> eval -q fm.ui.taskview.move(up=1)
tmap <home> eval -q fm.ui.taskview.move(down=0, absolute=True)
tmap <end> eval -q fm.ui.taskview.move(down=-1, absolute=True)
# Changing priority and deleting tasks
tmap J eval -q fm.ui.taskview.task_move(-1)
tmap K eval -q fm.ui.taskview.task_move(0)
tmap dd eval -q fm.ui.taskview.task_remove()
tmap <pagedown> eval -q fm.ui.taskview.task_move(-1)
tmap <pageup> eval -q fm.ui.taskview.task_move(0)
tmap <delete> eval -q fm.ui.taskview.task_remove()
# A bunch of aliases for closing
tmap w eval -q fm.ui.close_taskview()
tmap q eval -q fm.ui.close_taskview()
tmap Q eval -q fm.ui.close_taskview()
tmap <esc> eval -q fm.ui.close_taskview()
tmap <c-c> eval -q fm.ui.close_taskview()