# ===================================================================
# This file contains the default startup commands for ranger.
# To change them, it is recommended to create the file
# ~/.config/ranger/rc.conf and add your custom commands there.
#
# If you copy this whole file there, you may want to set the environment
# variable RANGER_LOAD_DEFAULT_RC to FALSE to avoid loading it twice.
#
# The purpose of this file is mainly to define keybindings and settings.
# For running more complex python code, please create a plugin in "plugins/" or
# a command in "commands.py".
#
# 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
# ===================================================================

# a plugin that adds file glyphs / icon support to Ranger:
# https://github.com/alexanderjeurissen/ranger_devicons
default_linemode devicons

# Which viewmode should be used?  Possible values are:
#     miller: Use miller columns which show multiple levels of the hierarchy
#     multipane: Midnight-commander like multipane view showing all tabs next
#                to each other
set viewmode miller
#set viewmode multipane

# 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 true

# 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 ueberzug
#set preview_images_method kitty

# 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
set colorscheme euphrasia


# 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 true

# Display the directory name in tabs?
set dirname_in_tabs true

# 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

# Clear all existing filters when leaving a directory
set clear_filters_on_dir_change false

# Disable displaying line numbers in main column
set line_numbers 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
# ===================================================================

# Unmap anything
#
unmap <C-r> <C-l> <C-d> <C-h> <C-m> <C-n> <C-q>
unmap <C-a>
unmap <C-v> <C-x> <C-c>
unmap <C-t> <C-w>
unmap ..
unmap A a c d G m n o p S s y z
unmap gi gl gr ge gh gn go gR gs gT gt gu
unmap ud um uq ut uV uv uy

# Return to normal mode
#
map <ESC> change_mode normal

# <Fx> commands
#
map <F1>  help
map <F2>  eval fm.execute_console("bulkrename") if fm.thisdir.marked_items else fm.open_console('rename ' + fm.thisfile.relative_path.replace("%", "%%"))
map <F3>  console scout -ftsea%space
map <F4>  shell $SHELL -c "cd %d; $SHELL"
map <F5>  reload_cwd

# Moves
#
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>   shell trash-put %s
map <INSERT>   console touch%space

map <A-LEFT>   history_go -1
map <A-RIGHT>  history_go 1
map <A-DOWN>   move_parent 1
map <A-UP>     move_parent -1

# Goto moves
#
# to anywhere
map cd console cd%space
# to home dirs
map g~ cd ~/
map g. cd ~/dotfiles/
map gc cd ~/Cours/
map gd cd ~/Documents/
map gm cd ~/Musique/
map gp cd ~/Projets/
map gt cd ~/tmp/
map gu eval fm.cd('/run/media/' + os.getenv('USER'))
map gv cd ~/Vidéos/
# to global dirs
map g/ cd /
map gD cd /dev
map gE cd /etc
map gL cd -r %f
map gM cd /mnt
map gO cd /opt
map gS cd /srv
map gT cd /tmp
map gU cd /usr
map gV cd /var

# Control moves
#
map <C-c>    copy
map <C-h>    set show_hidden!
map <C-l>    redraw_window
map <C-q>    abort
map <C-r>    reset
map <C-v>    paste append=True
map <C-x>    cut

# Tabs
#
map <C-t>    tab_new ~
map <C-w>    tab_close
map <TAB>    tab_move 1
map <S-TAB>  tab_move -1

# Specs commands
#
map i  display_file
map q  quit
map r  chain draw_possible_programs; console -p10 open_with f
map :  console
map !  console shell%space
map ~  set viewmode!
map =  console chmod%space
map ?  help
map m. shell ${HOME}/.config/ranger/scripts/dotify.sh %s

map Q  quit!
map W  display_log
map w  taskview_open

# Change the line mode
#
map mf linemode filename
map mi linemode fileinfo
map mm linemode mtime
map mp linemode permissions
map ms linemode sizemtime
map mt linemode metatitle

# New objects
#
map nf  console touch%space
map nd  console mkdir%space
map nl  console shell ln -s%space

# Tagging / Marking
#
map t       tag_toggle
map T<any>  tag_toggle tag=%any
map <Space> mark_files toggle=True
map <C-a>   mark_files all=True toggle=True
map V       toggle_visual_mode

# Bookmarks
#
map gb<any>    enter_bookmark %any
map B<any>     set_bookmark %any
map Bu<any>    unset_bookmark %any
map b<bg>      draw_bookmarks

# External Programs
#
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 y. yank name_without_extension

# Filesystem Operations
#
map A     eval fm.open_console('rename ' + fm.thisfile.relative_path.replace("%", "%%"))
map I     eval fm.open_console('rename ' + fm.thisfile.relative_path.replace("%", "%%"), position=7)

# Searching
# map /  console search%space
# 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

#map <TAB>     tab_move 1
#map <S-TAB>   tab_move -1
#map gt        tab_move 1
#map gT        tab_move -1
#map gn        tab_new ~
#map gc        tab_close
#map uq        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 sr set sort_reverse!
map sz set sort=random
map ss chain set sort=size;      set sort_reverse=False
map sb chain set sort=basename;  set sort_reverse=False
map sn chain set sort=natural;   set sort_reverse=False
map sm chain set sort=mtime;     set sort_reverse=False
map sc chain set sort=ctime;     set sort_reverse=False
map sa chain set sort=atime;     set sort_reverse=False
map st chain set sort=type;      set sort_reverse=False
map se chain set sort=extension; set sort_reverse=False

map sS chain set sort=size;      set sort_reverse=True
map sB chain set sort=basename;  set sort_reverse=True
map sN chain set sort=natural;   set sort_reverse=True
map sM chain set sort=mtime;     set sort_reverse=True
map sC chain set sort=ctime;     set sort_reverse=True
map sA chain set sort=atime;     set sort_reverse=True
map sT chain set sort=type;      set sort_reverse=True
map sE chain set sort=extension; set sort_reverse=True

map dc get_cumulative_size

# Settings
#
map Sc    set collapse_preview!
map Sd    set sort_directories_first!
map .     set show_hidden!
map SI    set flushinput!
map Si    set preview_images!
map Sm    set mouse_enabled!
map Sp    set preview_files!
map SP    set preview_directories!
map Ss    set sort_case_insensitive!
map Su    set autoupdate_cumulative_size!
map Sv    set use_preview_script!
map Sf    console filter%space

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

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

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

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

copycmap <ESC> <C-d>
#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)
#cmap <a-left>   eval fm.ui.console.move_word(left=1)
#cmap <a-right>  eval fm.ui.console.move_word(right=1)

# Line Editing
cmap <backspace>  eval fm.ui.console.delete(-1)
cmap <delete>     eval fm.ui.console.delete(0)
cmap <C-x>        eval fm.ui.console.delete_word()
#cmap <A-d>        eval fm.ui.console.delete_word(backward=False)
#cmap <C-k>        eval fm.ui.console.delete_rest(1)
#cmap <C-u>        eval fm.ui.console.delete_rest(-1)
cmap <C-v>        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
#pmap  <C-d>       pager_move  down=0.5  pages=True
#pmap  <C-u>       pager_move  up=0.5    pages=True

#copypmap <UP>       k  <C-p>
#copypmap <DOWN>     j  <C-n> <CR>
#copypmap <LEFT>     h
#copypmap <RIGHT>    l
#copypmap <HOME>     g
#copypmap <END>      G
#copypmap <C-d>      d
#copypmap <C-u>      u
#copypmap <PAGEDOWN> n  f  <C-F>  <Space>
#copypmap <PAGEUP>   p  b  <C-B>

# Basic
pmap     <C-l> redraw_window
pmap     <ESC> pager_close
copypmap <ESC> q Q i
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 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()

# Basic
tmap <C-l> redraw_window
tmap <ESC> taskview_close
copytmap <ESC> q Q w <C-c>


/* vim: set filetype=vim : */