about 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.yml30
-rw-r--r--.github/workflows/shellcheck.yml22
-rw-r--r--Makefile4
-rw-r--r--README.md48
-rw-r--r--doc/ranger.1142
-rw-r--r--doc/ranger.desktop1
-rw-r--r--doc/ranger.pod136
-rw-r--r--doc/rifle.122
-rw-r--r--examples/rc_emacs.conf8
-rwxr-xr-xranger/config/commands.py115
-rw-r--r--ranger/config/rc.conf10
-rw-r--r--ranger/config/rifle.conf12
-rw-r--r--ranger/container/settings.py5
-rw-r--r--ranger/core/actions.py2
-rw-r--r--ranger/core/main.py10
-rwxr-xr-xranger/data/scope.sh1
-rw-r--r--ranger/gui/widgets/statusbar.py6
19 files changed, 490 insertions, 144 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
new file mode 100644
index 00000000..1daba84c
--- /dev/null
+++ b/.github/workflows/python.yml
@@ -0,0 +1,30 @@
+name: Python lints and tests
+
+on:
+  push:
+    paths:
+      - '.github/workflows/python.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: Lint and test with pylint, flake8, -d-o-c-t-e-s-t-, -p-y-t-e-s-t-
+      run: |
+        make test_pylint test_flake8 test_pytest
diff --git a/.github/workflows/shellcheck.yml b/.github/workflows/shellcheck.yml
new file mode 100644
index 00000000..0d10cf61
--- /dev/null
+++ b/.github/workflows/shellcheck.yml
@@ -0,0 +1,22 @@
+name: Shellcheck scope.sh
+
+on: 
+  push:
+    paths:
+      - '.github/workflows/shellcheck.yml'
+      - 'ranger/data/scope.sh'
+
+jobs:
+  test_shellcheck:
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v1
+      with:
+        fetch-depth: 1
+    - name: Install newer shellcheck (0.7.0 rather than 0.4.6)
+      run: |
+        curl -LO "https://storage.googleapis.com/shellcheck/shellcheck-stable.linux.x86_64.tar.xz"
+        tar xf shellcheck-stable.linux.x86_64.tar.xz
+    - name: Shellcheck scope.sh
+      run: |
+        env PATH=shellcheck-stable:$PATH make test_shellcheck
diff --git a/Makefile b/Makefile
index 87c5ff1b..7e2c62da 100644
--- a/Makefile
+++ b/Makefile
@@ -127,9 +127,9 @@ test: test_py test_shellcheck
 
 man:
 	pod2man --stderr --center='ranger manual' --date='$(NAME)-$(VERSION)' \
-		--release=$(shell date +%x) doc/ranger.pod doc/ranger.1
+		--release=$(shell date -u '+%Y-%m-%d') doc/ranger.pod doc/ranger.1
 	pod2man --stderr --center='rifle manual' --date='$(NAME_RIFLE)-$(VERSION_RIFLE)' \
-		--release=$(shell date +%x) doc/rifle.pod doc/rifle.1
+		--release=$(shell date -u '+%Y-%m-%d') doc/rifle.pod doc/rifle.1
 
 manhtml:
 	pod2html doc/ranger.pod --outfile=doc/ranger.1.html
diff --git a/README.md b/README.md
index be17f0f9..85f6137e 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,8 @@
 ranger 1.9.2
 ============
 
+<img src="https://ranger.github.io/ranger_logo.png" width="150">
+
 [![Build Status](https://travis-ci.org/ranger/ranger.svg?branch=master)](https://travis-ci.org/ranger/ranger)
 <a href="https://repology.org/metapackage/ranger/versions">
   <img src="https://repology.org/badge/latest-versions/ranger.svg" alt="latest packaged version(s)">
@@ -73,26 +75,36 @@ Dependencies
   and (optionally) wide-unicode support
 * A pager (`less` by default)
 
-Optional:
+### Optional dependencies
+
+For general usage:
 
-* The `file` program for determining file types
-* The Python module `chardet`, in case of encoding detection problems
+* `file` for determining file types
+* `chardet` (Python package) for improved encoding detection of text files
 * `sudo` to use the "run as root" feature
-* `w3m` for the `w3mimgdisplay` program to preview images
-* `python-bidi` for correct display of RTL file names (Hebrew, Arabic)
+* `python-bidi` to display right-to-left file names correctly (Hebrew, Arabic)
 
-Optional, for enhanced file previews (with `scope.sh`):
+For enhanced file previews (with `scope.sh`):
 
 * `img2txt` (from `caca-utils`) for ASCII-art image previews
+* `w3mimgdisplay`, `ueberzug`, `kitty`, `terminology` or `urxvt` for image
+  previews
+* `convert` (from `imagemagick`) to auto-rotate images and for SVG previews
+* `ffmpegthumbnailer` for video thumbnails
 * `highlight` or `pygmentize` for syntax highlighting of code
-* `atool`, `bsdtar` and/or `unrar` for previews of archives
-* `lynx`, `w3m` or `elinks` for previews of html pages
-* `pdftotext` or `mutool` for `pdf` previews
+* `atool`, `bsdtar`, `unrar` and/or `7z` to preview archives
+* `bsdtar`, `tar`, `unrar` and/or `unzip` to preview archives as their first
+  image
+* `lynx`, `w3m` or `elinks` to preview html pages
+* `pdftotext` or `mutool` for textual `pdf` previews, `pdftoppm` to preview as
+  image
+* `djvutxt` for textual DjVu previews, `ddjvu` to preview as image
+* `calibre` or `epub-thumbnailer` for image previews of ebooks
 * `transmission-show` for viewing BitTorrent information
 * `mediainfo` or `exiftool` for viewing information about media files
 * `odt2txt` for OpenDocument text files (`odt`, `ods`, `odp` and `sxw`)
-* `chardet` (Python package) for improved encoding detection of text files
-
+* `python` or `jq` for JSON files
+* `fontimage` for font previews
 
 Installing
 ----------
@@ -141,3 +153,17 @@ Ranger can automatically copy default configuration files to `~/.config/ranger`
 if you run it with the switch `--copy-config=( rc | scope | ... | all )`.
 See `ranger --help` for a description of that switch.  Also check
 `ranger/config/` for the default configuration.
+
+
+Going Further
+---------------
+* To get the most out of ranger, read the [Official User Guide](https://github.com/ranger/ranger/wiki/Official-user-guide).
+* For frequently asked questions, see the [FAQ](https://github.com/ranger/ranger/wiki/FAQ%3A-Frequently-Asked-Questions).
+* For more information on customization, see the [wiki](https://github.com/ranger/ranger/wiki).
+
+
+Community
+---------------
+For help, support, or if you just want to hang out with us, you can find us here:
+* **IRC**: channel **#ranger** on [freenode](https://freenode.net/kb/answer/chat)
+* **Reddit**: [r/ranger](https://www.reddit.com/r/ranger/)
diff --git a/doc/ranger.1 b/doc/ranger.1
index 5a29f6e1..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" "2019-06-18" "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
@@ -432,6 +441,10 @@ the end of a command when needed, while preventing editors to strip spaces off
 the end of the line automatically.
 .PP
 To write a literal %, you need to escape it by writing %%.
+.PP
+Note that macros are expanded twice when using chain. For example, to insert
+a space character in a chained command, you would write %%space:
+ chain command1; command2%%space
 .SS "\s-1BOOKMARKS\s0"
 .IX Subsection "BOOKMARKS"
 Type \fBm<key>\fR to bookmark the current directory. You can re-enter this
@@ -687,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.
@@ -967,6 +983,13 @@ all directories above the current one as well?
 .IP "mouse_enabled [bool] <zm>" 4
 .IX Item "mouse_enabled [bool] <zm>"
 Enable mouse input?
+.IP "nested_ranger_warning [string]" 4
+.IX Item "nested_ranger_warning [string]"
+Warn at startup if \f(CW\*(C`RANGER_LEVEL\*(C'\fR is greater than 0, in other words give a
+warning when you nest ranger in a subshell started by ranger. Allowed values
+are \f(CW\*(C`true\*(C'\fR, \f(CW\*(C`false\*(C'\fR and \f(CW\*(C`error\*(C'\fR. The special value \f(CW\*(C`error\*(C'\fR promotes the
+warning to an error, this is usually shown as red text but will crash ranger
+when run with the \f(CW\*(C`\-\-debug\*(C'\fR flag.
 .IP "one_indexed [bool]" 4
 .IX Item "one_indexed [bool]"
 Start line numbers from 1.  Possible values are:
@@ -1101,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
@@ -1185,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...
@@ -1230,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.
@@ -1362,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.
@@ -1405,16 +1435,10 @@ 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 only one tab. Otherwise quits if there are no tasks in progress.
@@ -1541,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
@@ -1556,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 55944cdd..260ab3e3 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
 
@@ -328,6 +338,10 @@ the end of the line automatically.
 
 To write a literal %, you need to escape it by writing %%.
 
+Note that macros are expanded twice when using chain. For example, to insert
+a space character in a chained command, you would write %%space:
+ chain command1; command2%%space
+
 =head2 BOOKMARKS
 
 Type B<m<keyE<gt>> to bookmark the current directory. You can re-enter this
@@ -639,6 +653,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.
@@ -985,6 +1003,14 @@ all directories above the current one as well?
 
 Enable mouse input?
 
+=item nested_ranger_warning [string]
+
+Warn at startup if C<RANGER_LEVEL> is greater than 0, in other words give a
+warning when you nest ranger in a subshell started by ranger. Allowed values
+are C<true>, C<false> and C<error>. The special value C<error> promotes the
+warning to an error, this is usually shown as red text but will crash ranger
+when run with the C<--debug> flag.
+
 =item one_indexed [bool]
 
 Start line numbers from 1.  Possible values are:
@@ -1148,6 +1174,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
@@ -1239,6 +1270,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...
@@ -1291,39 +1323,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>
 
@@ -1442,7 +1461,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
@@ -1450,8 +1475,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>
 
@@ -1489,19 +1514,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.
@@ -1640,14 +1657,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
@@ -1658,14 +1682,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/doc/rifle.1 b/doc/rifle.1
index a42734d2..114cc5d0 100644
--- a/doc/rifle.1
+++ b/doc/rifle.1
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man 4.09 (Pod::Simple 3.35)
+.\" Automatically generated by Pod::Man 4.10 (Pod::Simple 3.35)
 .\"
 .\" Standard preamble:
 .\" ========================================================================
@@ -54,16 +54,20 @@
 .\" Avoid warning from groff about undefined register 'F'.
 .de IX
 ..
-.if !\nF .nr F 0
-.if \nF>0 \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+.    if \nF \{\
+.        de IX
+.        tm Index:\\$1\t\\n%\t"\\$2"
 ..
-.    if !\nF==2 \{\
-.        nr % 0
-.        nr F 2
+.        if !\nF==2 \{\
+.            nr % 0
+.            nr F 2
+.        \}
 .    \}
 .\}
+.rr rF
 .\"
 .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
 .\" Fear.  Run.  Save yourself.  No user-serviceable parts.
@@ -129,7 +133,7 @@
 .\" ========================================================================
 .\"
 .IX Title "RIFLE 1"
-.TH RIFLE 1 "rifle-1.9.2" "2019-04-03" "rifle manual"
+.TH RIFLE 1 "rifle-1.9.2" "08/18/2019" "rifle manual"
 .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
 .\" way too many mistakes in technical documents.
 .if n .ad l
diff --git a/examples/rc_emacs.conf b/examples/rc_emacs.conf
index 0462282e..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
 
@@ -206,6 +209,11 @@ set idle_delay 2000
 # check all directories above the current one as well?
 set metadata_deep_search false
 
+# Warn at startup if RANGER_LEVEL env var is greater than 0, in other words
+# give a warning when you nest ranger in a subshell started by ranger.
+# Special value "error" makes the warning more visible.
+set nested_ranger_warning true
+
 # ===================================================================
 # == Local Options
 # ===================================================================
diff --git a/ranger/config/commands.py b/ranger/config/commands.py
index 9cbf5f2e..0eae4e19 100755
--- a/ranger/config/commands.py
+++ b/ranger/config/commands.py
@@ -572,7 +572,7 @@ class default_linemode(Command):
 class quit(Command):  # pylint: disable=redefined-builtin
     """:quit
 
-    Closes the current tab, if there's only one tab.
+    Closes the current tab, if there's more than one tab.
     Otherwise quits if there are no tasks in progress.
     """
     def _exit_no_work(self):
@@ -591,7 +591,7 @@ class quit(Command):  # pylint: disable=redefined-builtin
 class quit_bang(Command):
     """:quit!
 
-    Closes the current tab, if there's only one tab.
+    Closes the current tab, if there's more than one tab.
     Otherwise force quits immediately.
     """
     name = 'quit!'
@@ -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...]
 
@@ -1244,7 +1302,7 @@ class copycmap(copymap):
 
 
 class copytmap(copymap):
-    """:copycmap <keys> <newkeys1> [<newkeys2>...]
+    """:copytmap <keys> <newkeys1> [<newkeys2>...]
 
     Copies a "taskview" keybinding from <keys> to <newkeys>
     """
@@ -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>
 
diff --git a/ranger/config/rc.conf b/ranger/config/rc.conf
index f559290d..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
 
@@ -301,6 +304,11 @@ set freeze_files false
 # Print file sizes in bytes instead of the default human-readable format.
 set size_in_bytes false
 
+# Warn at startup if RANGER_LEVEL env var is greater than 0, in other words
+# give a warning when you nest ranger in a subshell started by ranger.
+# Special value "error" makes the warning more visible.
+set nested_ranger_warning true
+
 # ===================================================================
 # == Local Options
 # ===================================================================
@@ -396,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
@@ -483,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..f04d1031 100644
--- a/ranger/config/rifle.conf
+++ b/ranger/config/rifle.conf
@@ -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 478f6124..6fc2da5e 100644
--- a/ranger/container/settings.py
+++ b/ranger/container/settings.py
@@ -58,6 +58,7 @@ ALLOWED_SETTINGS = {
     'max_history_size': (int, type(None)),
     'metadata_deep_search': bool,
     'mouse_enabled': bool,
+    'nested_ranger_warning': str,
     'one_indexed': bool,
     'open_all_images': bool,
     'padding_right': bool,
@@ -93,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,
@@ -105,6 +107,7 @@ ALLOWED_VALUES = {
     'confirm_on_delete': ['multiple', 'always', 'never'],
     'draw_borders': ['none', 'both', 'outline', 'separators'],
     'line_numbers': ['false', 'absolute', 'relative'],
+    'nested_ranger_warning': ['true', 'false', 'error'],
     'one_indexed': [False, True],
     'preview_images_method': ['w3m', 'iterm2', 'terminology',
                               'urxvt', 'urxvt-full', 'kitty',
@@ -276,7 +279,7 @@ class Settings(SignalDispatcher, FileManagerAware):
         if path:
             if path not in self._localsettings:
                 try:
-                    regex = re.compile(path)
+                    regex = re.compile(re.escape(path))
                 except re.error:  # Bad regular expression
                     return
                 self._localregexes[path] = regex
diff --git a/ranger/core/actions.py b/ranger/core/actions.py
index 96829f27..ed99f1c6 100644
--- a/ranger/core/actions.py
+++ b/ranger/core/actions.py
@@ -1608,10 +1608,10 @@ class Actions(  # pylint: disable=too-many-instance-attributes,too-many-public-m
 
     def delete(self, files=None):
         # XXX: warn when deleting mount points/unseen marked files?
-        self.notify("Deleting!")
         # COMPAT: old command.py use fm.delete() without arguments
         if files is None:
             files = (fobj.path for fobj in self.thistab.get_selection())
+        self.notify("Deleting {}!".format(", ".join(files)))
         files = [os.path.abspath(path) for path in files]
         for path in files:
             # Untag the deleted files.
diff --git a/ranger/core/main.py b/ranger/core/main.py
index 23648677..aefaacbc 100644
--- a/ranger/core/main.py
+++ b/ranger/core/main.py
@@ -180,6 +180,16 @@ def main(
             for command in args.cmd:
                 fm.execute_console(command)
 
+        if int(os.environ[level]) > 1:
+            warning = 'Warning:'
+            nested_warning = "You're in a nested ranger instance!"
+            warn_when_nested = fm.settings.nested_ranger_warning.lower()
+            if warn_when_nested == 'true':
+                fm.notify(' '.join((warning, nested_warning)), bad=False)
+            elif warn_when_nested == 'error':
+                fm.notify(' '.join((warning.upper(), nested_warning + '!!')),
+                          bad=True)
+
         if ranger.args.profile:
             import cProfile
             import pstats
diff --git a/ranger/data/scope.sh b/ranger/data/scope.sh
index 306eeed0..eb09b2bf 100755
--- a/ranger/data/scope.sh
+++ b/ranger/data/scope.sh
@@ -45,7 +45,6 @@ HIGHLIGHT_STYLE=${HIGHLIGHT_STYLE:-pablo}
 HIGHLIGHT_OPTIONS="--replace-tabs=${HIGHLIGHT_TABWIDTH} --style=${HIGHLIGHT_STYLE} ${HIGHLIGHT_OPTIONS:-}"
 PYGMENTIZE_STYLE=${PYGMENTIZE_STYLE:-autumn}
 
-
 handle_extension() {
     case "${FILE_EXTENSION_LOWER}" in
         ## Archive
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