summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/doctest.yml30
-rw-r--r--.github/workflows/py37.yml30
-rw-r--r--.github/workflows/python.yml6
-rw-r--r--doc/ranger.1133
-rw-r--r--doc/ranger.desktop1
-rw-r--r--doc/ranger.pod124
-rw-r--r--examples/rc_emacs.conf3
-rwxr-xr-xranger/config/commands.py114
-rw-r--r--ranger/config/rc.conf5
-rw-r--r--ranger/config/rifle.conf14
-rw-r--r--ranger/container/settings.py1
-rw-r--r--ranger/core/runner.py2
-rwxr-xr-xranger/ext/rifle.py2
-rw-r--r--ranger/gui/widgets/statusbar.py6
14 files changed, 347 insertions, 124 deletions
diff --git a/.github/workflows/doctest.yml b/.github/workflows/doctest.yml
new file mode 100644
index 00000000..f12cb926
--- /dev/null
+++ b/.github/workflows/doctest.yml
@@ -0,0 +1,30 @@
+name: Python doctest and pytest
+
+on:
+  push:
+    paths:
+      - '.github/workflows/doctest.yml'
+      - '*.py'
+
+jobs:
+  test_py:
+    runs-on: ubuntu-latest
+    strategy:
+      max-parallel: 4
+      matrix:
+        python-version: [2.7, 3.5, 3.6]
+    steps:
+    - uses: actions/checkout@v1
+      with:
+        fetch-depth: 1
+    - name: Set up Python ${{ matrix.python-version }}
+      uses: actions/setup-python@v1
+      with:
+        python-version: ${{ matrix.python-version }}
+    - name: Install dependencies
+      run: |
+        python -m pip install --upgrade pip
+        pip install -r requirements.txt
+    - name: doctest
+      run: |
+        make test_doctest test_other
diff --git a/.github/workflows/py37.yml b/.github/workflows/py37.yml
new file mode 100644
index 00000000..ca8210a2
--- /dev/null
+++ b/.github/workflows/py37.yml
@@ -0,0 +1,30 @@
+name: Python 3.7 lints and tests
+
+on:
+  push:
+    paths:
+      - '.github/workflows/py37.yml'
+      - '*.py'
+
+jobs:
+  test_py:
+    runs-on: ubuntu-latest
+    strategy:
+      max-parallel: 4
+      matrix:
+        python-version: [3.7]
+    steps:
+    - uses: actions/checkout@v1
+      with:
+        fetch-depth: 1
+    - name: Set up Python ${{ matrix.python-version }}
+      uses: actions/setup-python@v1
+      with:
+        python-version: ${{ matrix.python-version }}
+    - name: Install dependencies
+      run: |
+        python -m pip install --upgrade pip
+        pip install -r <(sed 's/<2//' requirements.txt)
+    - name: Lint and test with pylint, flake8, doctest, pytest
+      run: |
+        make test_py
diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml
index 6e872db5..1daba84c 100644
--- a/.github/workflows/python.yml
+++ b/.github/workflows/python.yml
@@ -12,7 +12,7 @@ jobs:
     strategy:
       max-parallel: 4
       matrix:
-        python-version: [2.7, 3.5, 3.6, 3.7]
+        python-version: [2.7, 3.5, 3.6]
     steps:
     - uses: actions/checkout@v1
       with:
@@ -25,6 +25,6 @@ jobs:
       run: |
         python -m pip install --upgrade pip
         pip install -r requirements.txt
-    - name: Lint and test with pylint, flake8, doctest, pytest
+    - name: Lint and test with pylint, flake8, -d-o-c-t-e-s-t-, -p-y-t-e-s-t-
       run: |
-        make test_py
+        make test_pylint test_flake8 test_pytest
diff --git a/doc/ranger.1 b/doc/ranger.1
index ae9543ad..3521d762 100644
--- a/doc/ranger.1
+++ b/doc/ranger.1
@@ -133,12 +133,11 @@
 .\" ========================================================================
 .\"
 .IX Title "RANGER 1"
-.TH RANGER 1 "ranger-1.9.2" "08/18/2019" "ranger manual"
+.TH RANGER 1 "ranger-1.9.2" "2019-10-02" "ranger manual"
 .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
 .\" way too many mistakes in technical documents.
 .if n .ad l
 .nh
-.SH "NAME"
 ranger \- visual file manager
 .SH "SYNOPSIS"
 .IX Header "SYNOPSIS"
@@ -290,18 +289,6 @@ Independently of the preview script, there is a feature to preview images
 by drawing them directly into the terminal. To enable this feature, set the
 option \f(CW\*(C`preview_images\*(C'\fR to true and enable one of the image preview modes:
 .PP
-\fIw3m\fR
-.IX Subsection "w3m"
-.PP
-This does not work over ssh, requires certain terminals (tested on \*(L"xterm\*(R" and
-\&\*(L"urxvt\*(R") and is incompatible with tmux, although it works with screen.
-.PP
-To enable this feature, install the program \*(L"w3m\*(R" and set the option
-\&\f(CW\*(C`preview_images_method\*(C'\fR to w3m.
-.PP
-When using a terminal with a nonzero border which is not automatically detected, the w3m preview will be misaligned.
-Use the \f(CW\*(C`w3m_offset\*(C'\fR option to manually adjust the image offset. This should be the same value as the terminal's border value.
-.PP
 \fIiTerm2\fR
 .IX Subsection "iTerm2"
 .PP
@@ -314,6 +301,14 @@ This feature relies on the dimensions of the terminal's font.  By default, a
 width of 8 and height of 11 are used.  To use other values, set the options
 \&\f(CW\*(C`iterm2_font_width\*(C'\fR and \f(CW\*(C`iterm2_font_height\*(C'\fR to the desired values.
 .PP
+\fIkitty\fR
+.IX Subsection "kitty"
+.PP
+This only works in Kitty. It requires \s-1PIL\s0 (or pillow) to work.
+Allows remote image previews, for example in an ssh session.
+.PP
+To enable this feature, set the option \f(CW\*(C`preview_images_method\*(C'\fR to kitty.
+.PP
 \fIterminology\fR
 .IX Subsection "terminology"
 .PP
@@ -321,6 +316,16 @@ This only works in terminology. It can render vector graphics, but works only lo
 .PP
 To enable this feature, set the option \f(CW\*(C`preview_images_method\*(C'\fR to terminology.
 .PP
+\fIueberzug\fR
+.IX Subsection "ueberzug"
+.PP
+U\*:berzug is a command line utility which draws images on terminals using child
+windows. It requires \s-1PIL\s0 (or pillow) and relies on X11. This makes it
+compatible (in a limited way, i.e., tmux splits are not supported) with many
+terminals and tmux but not the Linux console or Wayland.
+.PP
+To enable this feature, set the option \f(CW\*(C`preview_images_method\*(C'\fR to ueberzug.
+.PP
 \fIurxvt\fR
 .IX Subsection "urxvt"
 .PP
@@ -339,13 +344,17 @@ window.
 .PP
 To enable this feature, set the option \f(CW\*(C`preview_images_method\*(C'\fR to urxvt-full.
 .PP
-\fIkitty\fR
-.IX Subsection "kitty"
+\fIw3m\fR
+.IX Subsection "w3m"
 .PP
-This only works on Kitty. It requires \s-1PIL\s0 (or pillow) to work.
-Allows remote image previews, for example in an ssh session.
+This does not work over ssh, requires certain terminals (tested on \*(L"xterm\*(R" and
+\&\*(L"urxvt\*(R") and is incompatible with tmux, although it works with screen.
 .PP
-To enable this feature, set the option \f(CW\*(C`preview_images_method\*(C'\fR to kitty.
+To enable this feature, install the program \*(L"w3m\*(R" and set the option
+\&\f(CW\*(C`preview_images_method\*(C'\fR to w3m.
+.PP
+When using a terminal with a nonzero border which is not automatically detected, the w3m preview will be misaligned.
+Use the \f(CW\*(C`w3m_offset\*(C'\fR option to manually adjust the image offset. This should be the same value as the terminal's border value.
 .SS "\s-1SELECTION\s0"
 .IX Subsection "SELECTION"
 The \fIselection\fR is defined as \*(L"All marked files \s-1IF THERE ARE ANY,\s0 otherwise
@@ -691,6 +700,9 @@ Open the console with the most recent command.
 .IX Item "Alt-N"
 Open a tab. N has to be a number from 0 to 9. If the tab doesn't exist yet, it
 will be created.
+.IP "Alt-l, Alt-r" 14
+.IX Item "Alt-l, Alt-r"
+Shift a tab left, respectively right.
 .IP "gn, ^N" 14
 .IX Item "gn, ^N"
 Create a new tab.
@@ -1112,6 +1124,10 @@ Sets the state for the version control backend. The possible values are:
 \& local      display only local state.
 \& enabled    display both, local and remote state. May be slow for hg and bzr.
 .Ve
+.IP "vcs_msg_length [int]" 4
+.IX Item "vcs_msg_length [int]"
+Length to truncate first line of the commit messages to when shown in
+the statusbar.  Defaults to 50.
 .IP "viewmode [string]" 4
 .IX Item "viewmode [string]"
 Sets the view mode, which can be \fBmiller\fR to display the files in the
@@ -1196,6 +1212,7 @@ ranger.  For your convenience, this is a list of the \*(L"public\*(R" commands i
 \& terminal
 \& tmap key command
 \& touch filename
+\& trash
 \& travel pattern
 \& tunmap keys...
 \& unmap keys...
@@ -1241,33 +1258,27 @@ example, \fB+ar\fR allows reading for everyone, \-ow forbids others to write and
 777= allows everything.
 .Sp
 See also: man 1 chmod
-.IP "cmap \fIkey\fR \fIcommand\fR" 2
-.IX Item "cmap key command"
-Binds keys for the console. Works like the \f(CW\*(C`map\*(C'\fR command.
 .IP "console [\-p\fIN\fR] \fIcommand\fR" 2
 .IX Item "console [-pN] command"
 Opens the console with the command already typed in.  The cursor is placed at
 \&\fIN\fR.
+.IP "copymap  \fIkey\fR \fInewkey\fR [\fInewkey2\fR ...]" 2
+.IX Item "copymap key newkey [newkey2 ...]"
+.PD 0
 .IP "copycmap \fIkey\fR \fInewkey\fR [\fInewkey2\fR ...]" 2
 .IX Item "copycmap key newkey [newkey2 ...]"
-See \f(CW\*(C`copymap\*(C'\fR
-.IP "copymap \fIkey\fR \fInewkey\fR [\fInewkey2\fR ...]" 2
-.IX Item "copymap key newkey [newkey2 ...]"
-Copies the keybinding \fIkey\fR to \fInewkey\fR in the \*(L"browser\*(R" context.  This is a
-deep copy, so if you change the new binding (or parts of it) later, the old one
-is not modified.
-.Sp
-To copy key bindings of the console, taskview, or pager use \*(L"copycmap\*(R",
-\&\*(L"copytmap\*(R" or \*(L"copypmap\*(R".
 .IP "copypmap \fIkey\fR \fInewkey\fR [\fInewkey2\fR ...]" 2
 .IX Item "copypmap key newkey [newkey2 ...]"
-See \f(CW\*(C`copymap\*(C'\fR
 .IP "copytmap \fIkey\fR \fInewkey\fR [\fInewkey2\fR ...]" 2
 .IX Item "copytmap key newkey [newkey2 ...]"
-See \f(CW\*(C`copymap\*(C'\fR
-.IP "cunmap [\fIkeys...\fR]" 2
-.IX Item "cunmap [keys...]"
-Removes key mappings of the console. Works like the \f(CW\*(C`unmap\*(C'\fR command.
+.PD
+Copies the keybinding \fIkey\fR to \fInewkey\fR in the \*(L"browser\*(R" context.  This is a
+deep copy, so if you change the new binding (or parts of it) later, the old one
+is not modified. For example, \fIcopymap j down\fR will make the key sequence
+\&\*(L"down\*(R" move the cursor down one item.
+.Sp
+To copy key bindings of the console, pager or taskview use \*(L"copycmap\*(R",
+\&\*(L"copypmap\*(R" or \*(L"copytmap\*(R" respectively.
 .IP "default_linemode [\fIpath=regexp\fR | \fItag=tags\fR] \fIlinemodename\fR" 2
 .IX Item "default_linemode [path=regexp | tag=tags] linemodename"
 Sets the default linemode.  See \fIlinemode\fR command.
@@ -1373,16 +1384,24 @@ See the \fIranger.core.linemode\fR module for some examples.
 .IX Item "load_copy_buffer"
 Load the copy buffer from \fI~/.config/ranger/copy_buffer\fR.  This can be used to
 pass the list of copied files to another ranger instance.
-.IP "map \fIkey\fR \fIcommand\fR" 2
+.IP "map  \fIkey\fR \fIcommand\fR" 2
 .IX Item "map key command"
+.PD 0
+.IP "cmap \fIkey\fR \fIcommand\fR" 2
+.IX Item "cmap key command"
+.IP "pmap \fIkey\fR \fIcommand\fR" 2
+.IX Item "pmap key command"
+.IP "tmap \fIkey\fR \fIcommand\fR" 2
+.IX Item "tmap key command"
+.PD
 Assign the key combination to the given command.  Whenever you type the
 key/keys, the command will be executed.  Additionally, if you use a quantifier
 when typing the key, like 5j, it will be passed to the command as the attribute
 \&\*(L"self.quantifier\*(R".
 .Sp
 The keys you bind with this command are accessible in the file browser only,
-not in the console, task view or pager.  To bind keys there, use the commands
-\&\*(L"cmap\*(R", \*(L"tmap\*(R" or \*(L"pmap\*(R".
+not in the console, pager or taskview.  To bind keys there, use the commands
+\&\*(L"cmap\*(R", \*(L"pmap\*(R" or \*(L"tmap\*(R".
 .IP "mark \fIpattern\fR" 2
 .IX Item "mark pattern"
 Mark all files matching the regular expression pattern.
@@ -1416,19 +1435,13 @@ of applications is generated by the external file opener \*(L"rifle\*(R" and can
 displayed when pressing \*(L"r\*(R" in ranger.
 .Sp
 Note that if you specify an application, the mode is ignored.
-.IP "pmap \fIkey\fR \fIcommand\fR" 2
-.IX Item "pmap key command"
-Binds keys for the pager. Works like the \f(CW\*(C`map\*(C'\fR command.
 .IP "prompt_metadata [\fIkeys ...\fR]" 2
 .IX Item "prompt_metadata [keys ...]"
 Prompt the user to input metadata with the \f(CW\*(C`meta\*(C'\fR command for multiple keys in
 a row.
-.IP "punmap [\fIkeys ...\fR]" 2
-.IX Item "punmap [keys ...]"
-Removes key mappings of the pager. Works like the \f(CW\*(C`unmap\*(C'\fR command.
 .IP "quit" 2
 .IX Item "quit"
-Closes the current tab, if there's more than one tab. Otherwise quits if there are no tasks in progress.
+Closes the current tab, if there's only one tab. Otherwise quits if there are no tasks in progress.
 The current directory will be bookmarked as ' so you can re-enter it by typing `` or '' the next time you
 start ranger.
 .IP "quit!" 2
@@ -1552,12 +1565,19 @@ Scroll the file preview by \fIvalue\fR lines.
 .IP "terminal" 2
 .IX Item "terminal"
 Spawns the \fIx\-terminal-emulator\fR starting in the current directory.
-.IP "tmap \fIkey\fR \fIcommand\fR" 2
-.IX Item "tmap key command"
-Binds keys for the taskview. Works like the \f(CW\*(C`map\*(C'\fR command.
 .IP "touch \fIfilename\fR" 2
 .IX Item "touch filename"
 Creates an empty file with the name \fIfilename\fR, unless it already exists.
+.IP "trash" 2
+.IX Item "trash"
+Move all files in the selection to the trash using rifle. Rifle tries to use a
+trash manager like \fItrash-cli\fR if available but will fall back to moving files
+to either \fI\f(CI$XDG_DATA_HOME\fI/ranger\-trash\fR or \fI~/.ranger/ranger\-trash\fR. This is
+a less permanent version of \fIdelete\fR, relying on the user to clear out the
+trash whenever it's convenient. While having the possibility of restoring
+trashed files until this happens. ranger will ask for a confirmation if you
+attempt to trash multiple (marked) files or non-empty directories. This can be
+changed by modifying the setting \*(L"confirm_on_delete\*(R".
 .IP "travel \fIpattern\fR" 2
 .IX Item "travel pattern"
 Filters the current directory for files containing the letters in the
@@ -1567,13 +1587,18 @@ is automatically reopened, allowing for fast travel.
 To close the console, press \s-1ESC\s0 or execute a file.
 .Sp
 This command is based on the \fIscout\fR command and supports all of its options.
-.IP "tunmap [\fIkeys ...\fR]" 2
-.IX Item "tunmap [keys ...]"
-Removes key mappings of the taskview. Works like the \f(CW\*(C`unmap\*(C'\fR command.
-.IP "unmap [\fIkeys\fR ...]" 2
+.IP "unmap  [\fIkeys\fR ...]" 2
 .IX Item "unmap [keys ...]"
+.PD 0
+.IP "cunmap [\fIkeys\fR ...]" 2
+.IX Item "cunmap [keys ...]"
+.IP "punmap [\fIkeys\fR ...]" 2
+.IX Item "punmap [keys ...]"
+.IP "tunmap [\fIkeys\fR ...]" 2
+.IX Item "tunmap [keys ...]"
+.PD
 Removes the given key mappings in the \*(L"browser\*(R" context.  To unmap key bindings
-in the console, taskview, or pager use \*(L"cunmap\*(R", \*(L"tunmap\*(R" or \*(L"punmap\*(R".
+in the console, pager, or taskview use \*(L"cunmap\*(R", \*(L"punmap\*(R" or \*(L"tunmap\*(R".
 .IP "unmark \fIpattern\fR" 2
 .IX Item "unmark pattern"
 Unmark all files matching a regular expression pattern.
diff --git a/doc/ranger.desktop b/doc/ranger.desktop
index 9c140185..55d68ed8 100644
--- a/doc/ranger.desktop
+++ b/doc/ranger.desktop
@@ -7,3 +7,4 @@ Terminal=true
 Exec=ranger
 Categories=ConsoleOnly;System;FileTools;FileManager
 MimeType=inode/directory;
+Keywords=File;Manager;Browser;Explorer;Launcher;Vi;Vim;Python
diff --git a/doc/ranger.pod b/doc/ranger.pod
index 4b44fc92..be964b37 100644
--- a/doc/ranger.pod
+++ b/doc/ranger.pod
@@ -1,3 +1,4 @@
+=encoding utf8
 =head1 NAME
 
 ranger - visual file manager
@@ -201,17 +202,6 @@ Independently of the preview script, there is a feature to preview images
 by drawing them directly into the terminal. To enable this feature, set the
 option C<preview_images> to true and enable one of the image preview modes:
 
-=head3 w3m
-
-This does not work over ssh, requires certain terminals (tested on "xterm" and
-"urxvt") and is incompatible with tmux, although it works with screen.
-
-To enable this feature, install the program "w3m" and set the option
-C<preview_images_method> to w3m.
-
-When using a terminal with a nonzero border which is not automatically detected, the w3m preview will be misaligned.
-Use the C<w3m_offset> option to manually adjust the image offset. This should be the same value as the terminal's border value.
-
 =head3 iTerm2
 
 This only works in iTerm2 compiled with image preview support, but works over
@@ -223,12 +213,28 @@ This feature relies on the dimensions of the terminal's font.  By default, a
 width of 8 and height of 11 are used.  To use other values, set the options
 C<iterm2_font_width> and C<iterm2_font_height> to the desired values.
 
+=head3 kitty
+
+This only works in Kitty. It requires PIL (or pillow) to work.
+Allows remote image previews, for example in an ssh session.
+
+To enable this feature, set the option C<preview_images_method> to kitty.
+
 =head3 terminology
 
 This only works in terminology. It can render vector graphics, but works only locally.
 
 To enable this feature, set the option C<preview_images_method> to terminology.
 
+=head3 ueberzug
+
+Ɯberzug is a command line utility which draws images on terminals using child
+windows. It requires PIL (or pillow) and relies on X11. This makes it
+compatible (in a limited way, i.e., tmux splits are not supported) with many
+terminals and tmux but not the Linux console or Wayland.
+
+To enable this feature, set the option C<preview_images_method> to ueberzug.
+
 =head3 urxvt
 
 This only works in urxvt compiled with pixbuf support. Does not work over ssh.
@@ -245,12 +251,16 @@ window.
 
 To enable this feature, set the option C<preview_images_method> to urxvt-full.
 
-=head3 kitty
+=head3 w3m
 
-This only works on Kitty. It requires PIL (or pillow) to work.
-Allows remote image previews, for example in an ssh session.
+This does not work over ssh, requires certain terminals (tested on "xterm" and
+"urxvt") and is incompatible with tmux, although it works with screen.
 
-To enable this feature, set the option C<preview_images_method> to kitty.
+To enable this feature, install the program "w3m" and set the option
+C<preview_images_method> to w3m.
+
+When using a terminal with a nonzero border which is not automatically detected, the w3m preview will be misaligned.
+Use the C<w3m_offset> option to manually adjust the image offset. This should be the same value as the terminal's border value.
 
 =head2 SELECTION
 
@@ -639,6 +649,10 @@ Open the console with the most recent command.
 Open a tab. N has to be a number from 0 to 9. If the tab doesn't exist yet, it
 will be created.
 
+=item Alt-l, Alt-r
+
+Shift a tab left, respectively right.
+
 =item gn, ^N
 
 Create a new tab.
@@ -1156,6 +1170,11 @@ Sets the state for the version control backend. The possible values are:
  local      display only local state.
  enabled    display both, local and remote state. May be slow for hg and bzr.
 
+=item vcs_msg_length [int]
+
+Length to truncate first line of the commit messages to when shown in
+the statusbar.  Defaults to 50.
+
 =item viewmode [string]
 
 Sets the view mode, which can be B<miller> to display the files in the
@@ -1247,6 +1266,7 @@ ranger.  For your convenience, this is a list of the "public" commands including
  terminal
  tmap key command
  touch filename
+ trash
  travel pattern
  tunmap keys...
  unmap keys...
@@ -1299,39 +1319,26 @@ example, B<+ar> allows reading for everyone, -ow forbids others to write and
 
 See also: man 1 chmod
 
-=item cmap I<key> I<command>
-
-Binds keys for the console. Works like the C<map> command.
-
 =item console [-pI<N>] I<command>
 
 Opens the console with the command already typed in.  The cursor is placed at
 I<N>.
 
-=item copycmap I<key> I<newkey> [I<newkey2> ...]
-
-See C<copymap>
+=item copymap  I<key> I<newkey> [I<newkey2> ...]
 
-=item copymap I<key> I<newkey> [I<newkey2> ...]
-
-Copies the keybinding I<key> to I<newkey> in the "browser" context.  This is a
-deep copy, so if you change the new binding (or parts of it) later, the old one
-is not modified.
-
-To copy key bindings of the console, taskview, or pager use "copycmap",
-"copytmap" or "copypmap".
+=item copycmap I<key> I<newkey> [I<newkey2> ...]
 
 =item copypmap I<key> I<newkey> [I<newkey2> ...]
 
-See C<copymap>
-
 =item copytmap I<key> I<newkey> [I<newkey2> ...]
 
-See C<copymap>
-
-=item cunmap [I<keys...>]
+Copies the keybinding I<key> to I<newkey> in the "browser" context.  This is a
+deep copy, so if you change the new binding (or parts of it) later, the old one
+is not modified. For example, I<copymap j down> will make the key sequence
+"down" move the cursor down one item.
 
-Removes key mappings of the console. Works like the C<unmap> command.
+To copy key bindings of the console, pager or taskview use "copycmap",
+"copypmap" or "copytmap" respectively.
 
 =item default_linemode [I<path=regexp> | I<tag=tags>] I<linemodename>
 
@@ -1450,7 +1457,13 @@ See the I<ranger.core.linemode> module for some examples.
 Load the copy buffer from F<~/.config/ranger/copy_buffer>.  This can be used to
 pass the list of copied files to another ranger instance.
 
-=item map I<key> I<command>
+=item map  I<key> I<command>
+
+=item cmap I<key> I<command>
+
+=item pmap I<key> I<command>
+
+=item tmap I<key> I<command>
 
 Assign the key combination to the given command.  Whenever you type the
 key/keys, the command will be executed.  Additionally, if you use a quantifier
@@ -1458,8 +1471,8 @@ when typing the key, like 5j, it will be passed to the command as the attribute
 "self.quantifier".
 
 The keys you bind with this command are accessible in the file browser only,
-not in the console, task view or pager.  To bind keys there, use the commands
-"cmap", "tmap" or "pmap".
+not in the console, pager or taskview.  To bind keys there, use the commands
+"cmap", "pmap" or "tmap".
 
 =item mark I<pattern>
 
@@ -1497,19 +1510,11 @@ displayed when pressing "r" in ranger.
 
 Note that if you specify an application, the mode is ignored.
 
-=item pmap I<key> I<command>
-
-Binds keys for the pager. Works like the C<map> command.
-
 =item prompt_metadata [I<keys ...>]
 
 Prompt the user to input metadata with the C<meta> command for multiple keys in
 a row.
 
-=item punmap [I<keys ...>]
-
-Removes key mappings of the pager. Works like the C<unmap> command.
-
 =item quit
 
 Closes the current tab, if there's only one tab. Otherwise quits if there are no tasks in progress.
@@ -1648,14 +1653,21 @@ Scroll the file preview by I<value> lines.
 
 Spawns the I<x-terminal-emulator> starting in the current directory.
 
-=item tmap I<key> I<command>
-
-Binds keys for the taskview. Works like the C<map> command.
-
 =item touch I<filename>
 
 Creates an empty file with the name I<filename>, unless it already exists.
 
+=item trash
+
+Move all files in the selection to the trash using rifle. Rifle tries to use a
+trash manager like I<trash-cli> if available but will fall back to moving files
+to either F<$XDG_DATA_HOME/ranger-trash> or F<~/.ranger/ranger-trash>. This is
+a less permanent version of I<delete>, relying on the user to clear out the
+trash whenever it's convenient. While having the possibility of restoring
+trashed files until this happens. ranger will ask for a confirmation if you
+attempt to trash multiple (marked) files or non-empty directories. This can be
+changed by modifying the setting "confirm_on_delete".
+
 =item travel I<pattern>
 
 Filters the current directory for files containing the letters in the
@@ -1666,14 +1678,16 @@ To close the console, press ESC or execute a file.
 
 This command is based on the I<scout> command and supports all of its options.
 
-=item tunmap [I<keys ...>]
+=item unmap  [I<keys> ...]
+
+=item cunmap [I<keys> ...]
 
-Removes key mappings of the taskview. Works like the C<unmap> command.
+=item punmap [I<keys> ...]
 
-=item unmap [I<keys> ...]
+=item tunmap [I<keys> ...]
 
 Removes the given key mappings in the "browser" context.  To unmap key bindings
-in the console, taskview, or pager use "cunmap", "tunmap" or "punmap".
+in the console, pager, or taskview use "cunmap", "punmap" or "tunmap".
 
 =item unmark I<pattern>
 
diff --git a/examples/rc_emacs.conf b/examples/rc_emacs.conf
index e3596ba5..a69d68fe 100644
--- a/examples/rc_emacs.conf
+++ b/examples/rc_emacs.conf
@@ -59,6 +59,9 @@ set vcs_backend_git enabled
 set vcs_backend_hg disabled
 set vcs_backend_bzr disabled
 
+# Truncate the long commit messages to this length when shown in the statusbar.
+set vcs_msg_length 50
+
 # Use one of the supported image preview protocols
 set preview_images false
 
diff --git a/ranger/config/commands.py b/ranger/config/commands.py
index 55dd9cd1..cb6fa132 100755
--- a/ranger/config/commands.py
+++ b/ranger/config/commands.py
@@ -699,6 +699,64 @@ class delete(Command):
             self.fm.delete(files)
 
 
+class trash(Command):
+    """:trash
+
+    Tries to move the selection or the files passed in arguments (if any) to
+    the trash, using rifle rules with label "trash".
+    The arguments use a shell-like escaping.
+
+    "Selection" is defined as all the "marked files" (by default, you
+    can mark files with space or v). If there are no marked files,
+    use the "current file" (where the cursor is)
+
+    When attempting to trash non-empty directories or multiple
+    marked files, it will require a confirmation.
+    """
+
+    allow_abbrev = False
+    escape_macros_for_shell = True
+
+    def execute(self):
+        import shlex
+        from functools import partial
+
+        def is_directory_with_files(path):
+            return os.path.isdir(path) and not os.path.islink(path) and len(os.listdir(path)) > 0
+
+        if self.rest(1):
+            files = shlex.split(self.rest(1))
+            many_files = (len(files) > 1 or is_directory_with_files(files[0]))
+        else:
+            cwd = self.fm.thisdir
+            tfile = self.fm.thisfile
+            if not cwd or not tfile:
+                self.fm.notify("Error: no file selected for deletion!", bad=True)
+                return
+
+            # relative_path used for a user-friendly output in the confirmation.
+            files = [f.relative_path for f in self.fm.thistab.get_selection()]
+            many_files = (cwd.marked_items or is_directory_with_files(tfile.path))
+
+        confirm = self.fm.settings.confirm_on_delete
+        if confirm != 'never' and (confirm != 'multiple' or many_files):
+            self.fm.ui.console.ask(
+                "Confirm deletion of: %s (y/N)" % ', '.join(files),
+                partial(self._question_callback, files),
+                ('n', 'N', 'y', 'Y'),
+            )
+        else:
+            # no need for a confirmation, just delete
+            self.fm.execute_file(files, label='trash')
+
+    def tab(self, tabnum):
+        return self._tab_directory_content()
+
+    def _question_callback(self, files, answer):
+        if answer == 'y' or answer == 'Y':
+            self.fm.execute_file(files, label='trash')
+
+
 class jump_non(Command):
     """:jump_non [-FLAGS...]
 
@@ -1263,30 +1321,69 @@ class unmap(Command):
             self.fm.ui.keymaps.unbind(self.context, arg)
 
 
-class cunmap(unmap):
+class uncmap(unmap):
+    """:uncmap <keys> [<keys2>, ...]
+
+    Remove the given "console" mappings
+    """
+    context = 'console'
+
+
+class cunmap(uncmap):
     """:cunmap <keys> [<keys2>, ...]
 
     Remove the given "console" mappings
+
+    DEPRECATED in favor of uncmap.
     """
-    context = 'browser'
 
+    def execute(self):
+        self.fm.notify("cunmap is deprecated in favor of uncmap!")
+        super(cunmap, self).execute()
 
-class punmap(unmap):
-    """:punmap <keys> [<keys2>, ...]
+
+class unpmap(unmap):
+    """:unpmap <keys> [<keys2>, ...]
 
     Remove the given "pager" mappings
     """
     context = 'pager'
 
 
-class tunmap(unmap):
-    """:tunmap <keys> [<keys2>, ...]
+class punmap(unpmap):
+    """:punmap <keys> [<keys2>, ...]
+
+    Remove the given "pager" mappings
+
+    DEPRECATED in favor of unpmap.
+    """
+
+    def execute(self):
+        self.fm.notify("punmap is deprecated in favor of unpmap!")
+        super(punmap, self).execute()
+
+
+class untmap(unmap):
+    """:untmap <keys> [<keys2>, ...]
 
     Remove the given "taskview" mappings
     """
     context = 'taskview'
 
 
+class tunmap(untmap):
+    """:tunmap <keys> [<keys2>, ...]
+
+    Remove the given "taskview" mappings
+
+    DEPRECATED in favor of untmap.
+    """
+
+    def execute(self):
+        self.fm.notify("tunmap is deprecated in favor of untmap!")
+        super(tunmap, self).execute()
+
+
 class map_(Command):
     """:map <keysequence> <command>
 
@@ -1827,11 +1924,14 @@ class yank(Command):
                     ['xsel'],
                     ['xsel', '-b'],
                 ],
+                'wl-copy': [
+                    ['wl-copy'],
+                ],
                 'pbcopy': [
                     ['pbcopy'],
                 ],
             }
-            ordered_managers = ['pbcopy', 'xclip', 'xsel']
+            ordered_managers = ['pbcopy', 'wl-copy', 'xclip', 'xsel']
             executables = get_executables()
             for manager in ordered_managers:
                 if manager in executables:
diff --git a/ranger/config/rc.conf b/ranger/config/rc.conf
index 00a20def..e557d4de 100644
--- a/ranger/config/rc.conf
+++ b/ranger/config/rc.conf
@@ -67,6 +67,9 @@ set vcs_backend_hg disabled
 set vcs_backend_bzr disabled
 set vcs_backend_svn disabled
 
+# Truncate the long commit messages to this length when shown in the statusbar.
+set vcs_msg_length 50
+
 # Use one of the supported image preview protocols
 set preview_images false
 
@@ -401,6 +404,7 @@ map <F5> copy
 map <F6> cut
 map <F7> console mkdir%space
 map <F8> console delete
+#map <F8> console trash
 map <F10> exit
 
 # In case you work on a keyboard with dvorak layout
@@ -488,6 +492,7 @@ map p`<any> paste dest=%any_path
 map p'<any> paste dest=%any_path
 
 map dD console delete
+map dT console trash
 
 map dd cut
 map ud uncut
diff --git a/ranger/config/rifle.conf b/ranger/config/rifle.conf
index a90646e2..c269cfc4 100644
--- a/ranger/config/rifle.conf
+++ b/ranger/config/rifle.conf
@@ -26,7 +26,7 @@
 #   directory      | $1 is a directory
 #   number <n>     | change the number of this command to n
 #   terminal       | stdin, stderr and stdout are connected to a terminal
-#   X              | $DISPLAY is not empty (i.e. Xorg runs)
+#   X              | A graphical environment is available (darwin, Xorg, or Wayland)
 #
 # There are also pseudo-conditions which have a "side effect":
 #   flag <flags>  | Change how the program is run. See below.
@@ -264,5 +264,15 @@ label wallpaper, number 14, mime ^image, has feh, X = feh --bg-fill "$1"
 label editor, !mime ^text, !ext xml|json|csv|tex|py|pl|rb|js|sh|php  = ${VISUAL:-$EDITOR} -- "$@"
 label pager,  !mime ^text, !ext xml|json|csv|tex|py|pl|rb|js|sh|php  = "$PAGER" -- "$@"
 
-# The very last action, so that it's never triggered accidentally, is to execute a program:
+
+######################################################################
+# The actions below are left so low down in this file on purpose, so #
+# they are never triggered accidentally.                             #
+######################################################################
+
+# Execute a file as program/script.
 mime application/x-executable = "$1"
+
+# Move the file to trash using trash-cli.
+label trash, has trash-put = trash-put -- "$@"
+label trash = mkdir -p -- ${XDG_DATA_DIR:-$HOME/.ranger}/ranger-trash; mv -- "$@" ${XDG_DATA_DIR:-$HOME/.ranger}/ranger-trash
diff --git a/ranger/container/settings.py b/ranger/container/settings.py
index 82901ac0..6fc2da5e 100644
--- a/ranger/container/settings.py
+++ b/ranger/container/settings.py
@@ -94,6 +94,7 @@ ALLOWED_SETTINGS = {
     'vcs_backend_git': str,
     'vcs_backend_hg': str,
     'vcs_backend_svn': str,
+    'vcs_msg_length': int,
     'viewmode': str,
     'w3m_delay': float,
     'w3m_offset': int,
diff --git a/ranger/core/runner.py b/ranger/core/runner.py
index f38b026a..efb307da 100644
--- a/ranger/core/runner.py
+++ b/ranger/core/runner.py
@@ -214,7 +214,7 @@ class Runner(object):  # pylint: disable=too-few-public-methods
             toggle_ui = True
             context.wait = True
         if 't' in context.flags:
-            if 'DISPLAY' not in os.environ:
+            if not ('WAYLAND_DISPLAY' in os.environ or sys.platform == 'darwin' or 'DISPLAY' in os.environ):
                 return self._log("Can not run with 't' flag, no display found!")
             term = get_term()
             if isinstance(action, str):
diff --git a/ranger/ext/rifle.py b/ranger/ext/rifle.py
index a55e14c7..cdf0d729 100755
--- a/ranger/ext/rifle.py
+++ b/ranger/ext/rifle.py
@@ -237,7 +237,7 @@ class Rifle(object):  # pylint: disable=too-many-instance-attributes
             self._app_flags = argument
             return True
         elif function == 'X':
-            return sys.platform == 'darwin' or 'DISPLAY' in os.environ
+            return 'WAYLAND_DISPLAY' in os.environ or sys.platform == 'darwin' or 'DISPLAY' in os.environ
         elif function == 'env':
             return bool(os.environ.get(argument))
         elif function == 'else':
diff --git a/ranger/gui/widgets/statusbar.py b/ranger/gui/widgets/statusbar.py
index 71064ed4..fd44613e 100644
--- a/ranger/gui/widgets/statusbar.py
+++ b/ranger/gui/widgets/statusbar.py
@@ -212,7 +212,11 @@ class StatusBar(Widget):  # pylint: disable=too-many-instance-attributes
                 left.add_space()
                 left.add(directory.vcs.rootvcs.head['date'].strftime(self.timeformat), 'vcsdate')
                 left.add_space()
-                left.add(directory.vcs.rootvcs.head['summary'], 'vcscommit')
+                summary_length = self.settings.vcs_msg_length or 50
+                left.add(
+                    directory.vcs.rootvcs.head['summary'][:summary_length],
+                    'vcscommit'
+                )
 
     def _get_owner(self, target):
         uid = target.stat.st_uid