# ===================================================================
# Compatible since ranger 1.7.0
#
# By copying this file to ~/.config/ranger/rc.conf, ranger will be
# controllable with emacs-like key bindings.
#
# While this works well in combination with the default VIM-like key bindings,
# you may want to disable them by setting the environment variable
# RANGER_LOAD_DEFAULT_RC to FALSE.  For example by adding this to your
# ~/.bashrc (if you use bash):
#
# export RANGER_LOAD_DEFAULT_RC=FALSE
#
# Each line is a command that will be run before the user interface
# is initialized.  As a result, you can not use commands which rely
# on the UI such as :delete or :mark.
# ===================================================================

# ===================================================================
# == Options
# ===================================================================

# How many columns are there, and what are their relative widths?
set column_ratios 1,3,4

# Which files should be hidden? (regular expression)
set hidden_filter ^\.|\.(?:pyc|pyo|bak|swp)$|^lost\+found$|^__(py)?cache__$

# Show hidden files? You can toggle this by typing 'zh'
set show_hidden false

# Ask for a confirmation when running the "delete" command?
# Valid values are "always", "never", "multiple" (default)
# With "multiple", ranger will ask only if you delete multiple files at once.
set confirm_on_delete multiple

# Which script is used to generate file previews?
# ranger ships with scope.sh, a script that calls external programs (see
# README.md for dependencies) to preview images, archives, etc.
set preview_script ~/.config/ranger/scope.sh

# Use the external preview script or display simple plain text or image previews?
set use_preview_script true

# Automatically count files in the directory, even before entering them?
set automatically_count_files true

# Open all images in this directory when running certain image viewers
# like feh or sxiv?  You can still open selected files by marking them.
set open_all_images true

# Be aware of version control systems and display information.
set vcs_aware false

# State of the three backends git, hg, bzr. The possible states are
# disabled, local (only show local info), enabled (show local and remote
# information).
set vcs_backend_git enabled
set vcs_backend_hg disabled
set vcs_backend_bzr disabled

# Use one of the supported image preview protocols
set preview_images false

# Set the preview image method. Supported methods:
#
# * w3m (default):
#   Preview images in full color with the external command "w3mimgpreview"?
#   This requires the console web browser "w3m" and a supported terminal.
#   It has been successfully tested with "xterm" and "urxvt" without tmux.
#
# * iterm2:
#   Preview images in full color using iTerm2 image previews
#   (http://iterm2.com/images.html). This requires using iTerm2 compiled
#   with image preview support.
#
# * urxvt:
#   Preview images in full color using urxvt image backgrounds. This
#   requires using urxvt compiled with pixbuf support.
#
# * urxvt-full:
#   The same as urxvt but utilizing not only the preview pane but the
#   whole terminal window.
set preview_images_method w3m

# Use a unicode "..." character to mark cut-off filenames?
set unicode_ellipsis false

# Show dotfiles in the bookmark preview box?
set show_hidden_bookmarks true

# Which colorscheme to use?  These colorschemes are available by default:
# default, jungle, snow, solarized
set colorscheme default

# Preview files on the rightmost column?
# And collapse (shrink) the last column if there is nothing to preview?
set preview_files true
set preview_directories true
set collapse_preview true

# Save the console history on exit?
set save_console_history true

# Draw the status bar on top of the browser window (default: bottom)
set status_bar_on_top false

# Draw a progress bar in the status bar which displays the average state of all
# currently running tasks which support progress bars?
set draw_progress_bar_in_status_bar true

# Draw borders around columns?
set draw_borders false

# Display the directory name in tabs?
set dirname_in_tabs false

# Enable the mouse support?
set mouse_enabled true

# Display the file size in the main column or status bar?
set display_size_in_main_column true
set display_size_in_status_bar true

# Display files tags in all columns or only in main column?
set display_tags_in_all_columns true

# Set a title for the window?
set update_title false

# Set the title to "ranger" in the tmux program?
set update_tmux_title false

# Shorten the title if it gets long?  The number defines how many
# directories are displayed at once, 0 turns off this feature.
set shorten_title 3

# Abbreviate $HOME with ~ in the titlebar (first line) of ranger?
set tilde_in_titlebar false

# How many directory-changes or console-commands should be kept in history?
set max_history_size 20
set max_console_history_size 50

# Try to keep so much space between the top/bottom border when scrolling:
set scroll_offset 8

# Flush the input after each key hit?  (Noticeable when ranger lags)
set flushinput true

# Padding on the right when there's no preview?
# This allows you to click into the space to run the file.
set padding_right true

# Save bookmarks (used with mX and `X) instantly?
# This helps to synchronize bookmarks between multiple ranger
# instances but leads to *slight* performance loss.
# When false, bookmarks are saved when ranger is exited.
set autosave_bookmarks true

# You can display the "real" cumulative size of directories by using the
# command :get_cumulative_size or typing "dc".  The size is expensive to
# calculate and will not be updated automatically.  You can choose
# to update it automatically though by turning on this option:
set autoupdate_cumulative_size false

# Turning this on makes sense for screen readers:
set show_cursor false

# One of: size, natural, basename, atime, ctime, mtime, type, random
set sort natural

# Additional sorting options
set sort_reverse false
set sort_case_insensitive true
set sort_directories_first true
set sort_unicode false

# Enable this if key combinations with the Alt Key don't work for you.
# (Especially on xterm)
set xterm_alt_key false

# Whether to include bookmarks in cd command
set cd_bookmarks true

# Avoid previewing files larger than this size, in bytes.  Use a value of 0 to
# disable this feature.
set preview_max_size 0

# Add the highlighted file to the path in the titlebar
set show_selection_in_titlebar true

# The delay that ranger idly waits for user input, in milliseconds, with a
# resolution of 100ms.  Lower delay reduces lag between directory updates but
# increases CPU load.
set idle_delay 2000

# When the metadata manager module looks for metadata, should it only look for
# a ".metadata.json" file in the current directory, or do a deep search and
# check all directories above the current one as well?
set metadata_deep_search false

# ===================================================================
# == Local Options
# ===================================================================
# You can set local options that only affect a single directory.

# Examples:
# setlocal path=~/downloads sort mtime

# ===================================================================
# == Command Aliases in the Console
# ===================================================================

alias e    edit
alias q    quit
alias q!   quitall
alias qa   quitall
alias qall quitall
alias setl setlocal

alias filter     scout -prt
alias find       scout -aeit
alias mark       scout -mr
alias unmark     scout -Mr
alias search     scout -rs
alias search_inc scout -rts
alias travel     scout -aefiklst

# ===================================================================
# == Define keys for the browser
# ===================================================================

# Basic
map <C-x><C-c> quit!
map <C-x>k quit

map <C-x>R     reload_cwd
map <C-x><C-r> reset
map <C-l>      redraw_window
map <C-g>      chain abort; change_mode normal; mark_files all=True val=False

map <C-x>i display_file
map <C-h>  help
map <C-x>W display_log
map <C-x>w taskview_open

map <A-x>  console
map <A-!>  console shell%space
map <A-f> chain draw_possible_programs; console open_with%space

# Change the line mode
map <C-x>mf linemode filename
map <C-x>mi linemode fileinfo
map <C-x>mp linemode permissions
map <C-x>mt linemode metatitle

# Tagging / Marking
map <C-x>t<any> tag_toggle tag=%any
map <C-_>t      tag_remove
map <Space>     mark_files toggle=True
map <C-Space>   toggle_visual_mode

# 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%space
map <F8> console delete
map <F10> exit

# Direction keys
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 <DELETE>   console delete
map <INSERT>   console touch%space

copymap <UP>       <C-p>
copymap <DOWN>     <C-n>
copymap <LEFT>     <C-b>
copymap <RIGHT>    <C-f>
copymap <HOME>     <A-LT>
copymap <END>      <A-GT>
copymap <PAGEDOWN> <A-v>
copymap <PAGEUP>   <C-v>

# Jumping around
map <C-u><C-space> history_go -1
map <A-}> move_parent 1
map <A-{> move_parent -1

map <C-x>gh cd ~
map <C-x>ge cd /etc
map <C-x>gu cd /usr
map <C-x>gd cd /dev
map <C-x>gl cd -r .
map <C-x>gL cd -r %f
map <C-x>go cd /opt
map <C-x>gv cd /var
map <C-x>gm cd /media
map <C-x>gM cd /mnt
map <C-x>gs cd /srv
map <C-x>gr cd /
map <C-x>gR eval fm.cd(ranger.RANGERDIR)
map <C-x>g/ cd /
map <C-x>g? cd /usr/share/doc/ranger

# External Programs
map <C-x><C-f>  edit
map <C-x>du shell -p du --max-depth=1 -h --apparent-size
map <C-x>dU shell -p du --max-depth=1 -h --apparent-size | sort -rh
map <C-x>wp shell -f echo -n %d/%f | xsel -i; xsel -o | xsel -i -b
map <C-x>wd shell -f echo -n %d    | xsel -i; xsel -o | xsel -i -b
map <C-x>wn shell -f echo -n %f    | xsel -i; xsel -o | xsel -i -b

# Filesystem Operations
map <C-x>= chmod

map <A-d>  console rename%space
map <C-e>  eval fm.open_console('rename ' + fm.thisfile.relative_path)
map <C-a>  eval fm.open_console('rename ' + fm.thisfile.relative_path, position=7)

map <C-y>y  paste
map <C-y>o  paste overwrite=True
map <C-y>l  paste_symlink relative=False
map <C-y>L  paste_symlink relative=True
map <C-y>hl paste_hardlink
map <C-y>ht paste_hardlinked_subtree

map <C-w>  cut
map <C-_>w uncut
map <C-x><C-w>a cut mode=add
map <C-x><C-w>r cut mode=remove

map <A-w>  copy
map <C-x><A-w>a copy mode=add
map <C-x><A-w>r copy mode=remove

# Searching
map <C-x>s console search_inc%space
map <C-s> search_next
map <C-r> search_next forward=False

# Tabs
#map <C-n>     tab_new ~
map <C-x>b    tab_move 1
map <A-Right> tab_move 1
map <A-Left>  tab_move -1
map <C-x><C-f> tab_new ~
map <C-_>k    tab_restore
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 <C-x>or toggle_option sort_reverse
map <C-x>oz set sort=random
map <C-x>os chain set sort=size;      set sort_reverse=False
map <C-x>ob chain set sort=basename;  set sort_reverse=False
map <C-x>on chain set sort=natural;   set sort_reverse=False
map <C-x>om chain set sort=mtime;     set sort_reverse=False
map <C-x>oc chain set sort=ctime;     set sort_reverse=False
map <C-x>oa chain set sort=atime;     set sort_reverse=False
map <C-x>ot chain set sort=type;      set sort_reverse=False
map <C-x>oe chain set sort=extension; set sort_reverse=False

map <C-x>oS chain set sort=size;      set sort_reverse=True
map <C-x>oB chain set sort=basename;  set sort_reverse=True
map <C-x>oN chain set sort=natural;   set sort_reverse=True
map <C-x>oM chain set sort=mtime;     set sort_reverse=True
map <C-x>oC chain set sort=ctime;     set sort_reverse=True
map <C-x>oA chain set sort=atime;     set sort_reverse=True
map <C-x>oT chain set sort=type;      set sort_reverse=True
map <C-x>oE chain set sort=extension; set sort_reverse=True

map <C-x>dc get_cumulative_size

# Settings
map <C-x>zc    toggle_option collapse_preview
map <C-x>zd    toggle_option sort_directories_first
map <C-x>zh    toggle_option show_hidden
map <C-x>zi    toggle_option flushinput
map <C-x>zm    toggle_option mouse_enabled
map <C-x>zp    toggle_option preview_files
map <C-x>zP    toggle_option preview_directories
map <C-x>zs    toggle_option sort_case_insensitive
map <C-x>zu    toggle_option autoupdate_cumulative_size
map <C-x>zv    toggle_option use_preview_script
map <C-x>zf    console filter%space

# Bookmarks
map <C-x>rb<any> enter_bookmark %any
map <C-x>rm<any> set_bookmark %any
map <C-x>ru<any> unset_bookmark %any

map <C-x>rb<bg>   draw_bookmarks
copymap <C-x>rb<bg>  <C-x>rm<bg> <C-x>ru<bg>

# Generate all the chmod bindings with some python help:
eval for arg in "rwxXst": cmd("map <C-x>+u{0} shell -f chmod u+{0} %s".format(arg))
eval for arg in "rwxXst": cmd("map <C-x>+g{0} shell -f chmod g+{0} %s".format(arg))
eval for arg in "rwxXst": cmd("map <C-x>+o{0} shell -f chmod o+{0} %s".format(arg))
eval for arg in "rwxXst": cmd("map <C-x>+a{0} shell -f chmod a+{0} %s".format(arg))
eval for arg in "rwxXst": cmd("map <C-x>+{0}  shell -f chmod u+{0} %s".format(arg))

eval for arg in "rwxXst": cmd("map <C-x>-u{0} shell -f chmod u-{0} %s".format(arg))
eval for arg in "rwxXst": cmd("map <C-x>-g{0} shell -f chmod g-{0} %s".format(arg))
eval for arg in "rwxXst": cmd("map <C-x>-o{0} shell -f chmod o-{0} %s".format(arg))
eval for arg in "rwxXst": cmd("map <C-x>-a{0} shell -f chmod a-{0} %s".format(arg))
eval for arg in "rwxXst": cmd("map <C-x>-{0}  shell -f chmod u-{0} %s".format(arg))

# Search for letters as you type them
#eval for arg in "abcdefghijklmnopqrstuvwxyz": cmd("map {0} console search_inc {0}".format(arg))

# ===================================================================
# == Define keys for the console
# ===================================================================
# Note: Unmapped keys are passed directly to the console.

# Basic
cmap <tab>   eval fm.ui.console.tab()
cmap <s-tab> eval fm.ui.console.tab(-1)
cmap <C-g>   eval fm.ui.console.close()
cmap <CR>    eval fm.ui.console.execute()
cmap <C-l>   redraw_window

copycmap <C-g> <esc>
copycmap <CR>  <C-j>

# Move around
cmap <up>    eval fm.ui.console.history_move(-1)
cmap <down>  eval fm.ui.console.history_move(1)
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)

# Line Editing
cmap <backspace>  eval fm.ui.console.delete(-1)
cmap <delete>     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()

# And of course the emacs way
copycmap <up>        <C-p>
copycmap <down>      <C-n>
copycmap <left>      <C-b>
copycmap <right>     <C-f>
copycmap <home>      <C-a>
copycmap <end>       <C-e>
copycmap <delete>    <C-d>
copycmap <backspace> <C-h>

# Note: There are multiple ways to express backspaces.  <backspace> (code 263)
# and <backspace2> (code 127).  To be sure, use both.
copycmap <backspace> <backspace2>

# This special expression allows typing in numerals:
cmap <allow_quantifiers> false

# ===================================================================
# == Pager Keybindings
# ===================================================================

# Movement
pmap  <down>      pager_move  down=1
pmap  <up>        pager_move  up=1
pmap  <left>      pager_move  left=4
pmap  <right>     pager_move  right=4
pmap  <home>      pager_move  to=0
pmap  <end>       pager_move  to=-1
pmap  <pagedown>  pager_move  down=1.0  pages=True
pmap  <pageup>    pager_move  up=1.0    pages=True

copypmap <UP>       <C-p>
copypmap <DOWN>     <C-n> <CR>
copypmap <LEFT>     <C-b>
copypmap <RIGHT>    <C-f>
copypmap <HOME>     <A-LT>
copypmap <END>      <A-GT>
copypmap <PAGEDOWN> <C-F> <A-v> <Space>
copypmap <PAGEUP>   <C-B> <C-v>

# Basic
pmap     <C-l> redraw_window
pmap     <C-g> pager_close
copypmap <C-g> q Q i <F3>
pmap E      edit_file

# ===================================================================
# == Taskview Keybindings
# ===================================================================

# Movement
tmap <up>        taskview_move up=1
tmap <down>      taskview_move down=1
tmap <home>      taskview_move to=0
tmap <end>       taskview_move to=-1
tmap <pagedown>  taskview_move down=1.0  pages=True
tmap <pageup>    taskview_move up=1.0    pages=True
tmap <C-d>       taskview_move down=0.5  pages=True
tmap <C-u>       taskview_move up=0.5    pages=True

copytmap <UP>       k  <C-p>
copytmap <DOWN>     j  <C-n> <CR>
copytmap <HOME>     g
copytmap <END>      G
copytmap <C-u>      u
copytmap <PAGEDOWN> n  f  <C-F>  <Space>
copytmap <PAGEUP>   p  b  <C-B>

# Changing priority and deleting tasks
tmap <A-n>      eval -q fm.ui.taskview.task_move(-1)
tmap <A-p>      eval -q fm.ui.taskview.task_move(0)
tmap <C-d>      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()

# Basic
tmap <C-l> redraw_window
tmap <C-g> taskview_close