xaizek / vifm (License: GPLv2+) (since 2018-12-07)
Vifm is a file manager with curses interface, which provides Vi[m]-like environment for managing objects within file systems, extended with some useful ideas from mutt.
vifm v0.9
New version brings two new ways of viewing and processing file lists, namely
tree-view and directory-comparison.  As usual, previously existing facilities
were extended and improved to become more useful.

Thanks to everyone who tried out the beta, especially filterfalse.

Main changes:
 - introduced tree-like representation of files;
 - added directory comparison facilities;
 - added ability to restore last navigation menu;
 - background operations and programs can now be cancelled;
 - dismissed error output of external programs can now be queried;
 - added shell completion for bash and zsh;
 - now it's possible to configure mappings in dialogs.

More detailed list of changes.

 - Removed -Werror in tests from non-developer builds.

Command-line mode:
 - added :tree command that converts current view into a tree (thanks to
   filterfalse and Kornel);
 - added :dmap, :dnoremap and :dunmap commands to configure mappings in dialogs
   (thanks to Sassan Haradji, a.k.a. sassanh);
 - added "tree" parameter to :sync! that enables synchronization of tree view
   (thanks to filterfalse);
 - added :compare command to perform comparison in one or two directory trees
   (thanks to anonymous on SourceForge discussion forum and aleksejrs);
 - added :copen command to restore last menu that supports navigation (thanks to
   Sassan Haradji, a.k.a. sassanh);
 - added :screen! form that enables terminal multiplexers support (instead of
   toggling it as :screen does) (thanks to Marcos Cruz);
 - added :siblnext and :siblprev commands.  They change directory to next or
   previous sibling directories of current path (in global sorting order of
   current pane) (thanks to sudo-nice);
 - made :put, :touch and :mkdir accept [line] range, which can be used to
   specify target position in tree-view (thanks to filterfalse);
 - accept paths in :touch, not just file names (thanks to filterfalse);
 - disallow applying :chmod on ".." entry;
 - disallow selecting ".." entry with :select command;
 - expand macros in `:[un]select !{command}` (thanks to Michael Corvin).

 - added %Iu and %IU macros, which are %u and %U equivalents, but work better if
   external command is interactive and changes terminal state;
 - added %q macro that redirects command output into quick view (thanks to

:set command and options:
 - added 'dotfiles' (local) option, which exposes dot files filter as an option
   (thanks to filterfalse);
 - added 'caseoptions' option that enables more fine-grained control over case
   sensitivity (thanks to Alexandru Geana, a.k.a. alegen);
 - added 'sizefmt' option that configures formatting of human-friendly size
   (thanks to sudo-nice);
 - added %f 'statusline' macro that inserts relative path of the entry, which
   might be useful for non-regular views (thanks to filterfalse);
 - added %D 'statusline' macro that displays path of the other pane in
   single-pane layout (thanks to sudo-nice);
 - added %T 'statusline' macro that displays symbolic link target (thanks to
 - added %a 'statusline' macro that displays amount of free space available at
   current partition (thanks to sudo-nice);
 - consider trailing slash for directories or symbolic links that point to
   directories in 'classify' patterns by file name (e.g., this works now:
 - better handling of setting 'fillchars' to incorrect or excessive value.

Normal and visual modes:
 - added [d and ]d shortcuts to navigate to previous/next directory entry
   (thanks to filterfalse);
 - added [s and ]s shortcuts to navigate to previous/next selected entry
   (thanks to filterfalse);
 - added [z and ]z shortcuts to navigate to first/last sibling in a tree
   (thanks to filterfalse);
 - added zj and zk shortcuts to navigate to next/previous directory sibling in a
   tree (thanks to filterfalse);
 - added [c and ]c shortcuts to navigate to previous/next mismatch in directory
   comparison view (thanks to filterfalse);
 - added do and dp keys to compare views for applying changes in files (thanks
   to filterfalse).

Menus and dialogs:
 - added dd key to :jobs menu, which requests cancellation of background
   operation.  Background :put, :copy, :move, :delete, size calculation with ga
   and gA as well as applications started in background can be cancelled this
   way (thanks to blurm);
 - added e key to :jobs menu that displays list of errors issues by that jobs,
   if any.  h key goes back to :jobs menu;
 - added % key to menu mode, which navigates to [count]-th percent of the list;
 - added meaning to [count] of cp shortcut, which is now processed as numerical
   argument for non-recursive `chmod` command (thanks to sudo-nice);
 - partially return progress report for menus.  Was disabled by introduction of
   null byte heuristic.

File operations:
 - enable restoring files from trash from custom views;
 - disallow moving/copying/linking files into custom view (put is forbidden, so
   makes sense to forbid these too);
 - try harder to move files by not giving up on getting permission error, which
   isn't always a reliable indication of actual permission error.  Only when
   'syscalls' is on (thanks to Marcin Kurczewski, a.k.a. rr-).

File preview:
 - view current directory on ".." for quickview/view mode if no viewer matches
   such entry (thanks to filterfalse);
 - enable cancellation of tree preview construction (thanks to filterfalse);
 - do not resolve symbolic links in directory preview (thanks to filterfalse).

 - make temporary rename files accessible only by the user (thanks to

 - improve performance of startup and exit by omitting file existence checks.
   The cost is possibly old files staying in the state, but it should be for
   long time (thanks to Marcin Kurczewski, a.k.a. rr-);
 - improved sorting performance in the presence of huge amount of symbolic links
   (thanks to Marcin Kurczewski, a.k.a. rr-).

 - don't disable preview on `--remote --select` if it doesn't hide updated pane
   (thanks to Marcin Kurczewski, a.k.a. rr-);
 - make +{num} and similar options work (actually affect cursor of the view)
   (thanks to filterfalse);
 - treat "+" option the same way as Vim (like :$) (thanks to filterfalse).

 - added v:servername variable, which provides access to server name of the
   running instance used by --remote feature (thanks to Marcin Kurczewski,
   a.k.a. rr-);
 - getpanetype() got new value ("tree") to indicate tree-view (thanks to

TUI (Text User Interface):
 - limited maximum height of message popup, just print how many lines we're
 - put hardware cursor according to current mode and cursor within it (thanks to
   Tyler Spivey);
 - display path to the conflicting file in conflict resolution dialog;
 - provide better messages on i/o errors with 'syscalls' (thanks to Behrooz).

File filtering:
 - don't move cursor off "../" before start of local filtering (thanks to
 - prevent clearing filters on zM if there were no zO preceding it (thanks to

Color schemes:
 - added CmpMismatch highlight group for highlighting mismatched files on
   side-by-side comparison.

 - added completion scripts for bash and zsh (patches by filterfalse);
 - escape first tilde in paths that go to the shell (thanks to Marius Schmidl);
 - resolve symbolic link for listing associated programs from desktop-files
   (thanks to filterfalse).

 - work around :drop command being disabled in the plugin (thanks to Phil
 - fixed inconsistent behaviour of :EditVifm in plugin with regard to
   "[No Name]" buffer (thanks to Phil Runninger);
 - fixed plugin in versions of Vim where :argadd without argument doesn't work
   (thanks to eco0414).

Only on Windows:
 - use <exe file location>/data/colors as global storage of color schemes on
   Windows (thanks to r44083);
 - handle terminal resize on Windows 10 (thanks to randomizedthinking);
 - properly recover from invalid/strange UNC root on Windows.  Don't end up with
   empty filelist;
 - fixed use of non-latin characters in environment variables and command-line
   options (thanks to khaoos-abominable).

Important fixes:
 - fixed redirecting stdout of background commands to /dev/null, which could be
   unwritable descriptor (thanks to c02y);
 - fixed possible data loss on moving/copying files over their own parent or
   child directories via p, P, :move, :copy, :alink and :rlink (thanks to Marius
 - fixed detection of too-small-terminal state;
 - fixed treating characters like š and ć (with low Unicode values, just above
   0x100) as functional keys on input (thanks to granderil).

Other changes:
 - changed size formatting to round from zero (matches behaviour of e.g. `ls`);
 - read error output of background commands independently of main thread
   (prevents blocking of tools which produce huge amount of output) (thanks to
   Stas Malavin);
 - no vifminfo merging if file change isn't detected.  Might result in faster
   quitting in some cases.  Not accounting for some changes is still possible
   when multiple instances quit simultaneously, but same could happen without
   this change;
 - made search consider trailing slash for directories and symbolic links that
   point to directories (thanks to filterfalse);
 - don't use :filextype in sample vifmrc for OS X, we can't tell whether
   graphical system is running (thanks to piotryordanov).

See change log for the full list of changes and by whom they were suggested.
Subject SHA-1 Author Date
Version v0.9 2a7a1019d86c8cf39f6c34ffc4a69a8465a27f4a xaizek 2017-06-18 14:31:25
Update NEWS file for v0.9 b310334c8040ad4dff3d2f20628cb68c90957fa6 xaizek 2017-06-18 14:30:27
Fix running cross-compiled one of the new tests 4c6c9019e00e2167feff335db89a77db88c93a70 xaizek 2017-06-17 17:50:57
Set correct CWD on executing startup commands e69715c6aee0a6d949b20f767f11ee7f0f081e62 xaizek 2017-06-15 21:14:52
Invoke DirEnter events on startup with correct PWD ded9e2b54411ee149aa26a37137fbf6e0e380e83 xaizek 2017-06-15 21:14:03
Fix incorrect cursor positioning on file deletion 352298f641a4fcc3a62ffe47eb8a1fe1e109ee06 xaizek 2017-06-15 20:14:45
Extract filelist.c:set_position_by_path() function 7ee0c47766cdb4efcc6de9e1141bf202f17f8086 xaizek 2017-06-15 20:08:49
Update other view after file deletion 8a5b4b4a2d063dbfd02a7d5a9e1c50b997edfa7a xaizek 2017-06-15 17:19:21
Expand macros in :[un]select !{command} 25ee9ac3bf8dcb6d08bfcea501a16735cbb1499c xaizek 2017-06-14 14:29:11
Minor variable and comment updates 5e5e55b4d422d9c4662e1ecd72a859f80c26db8a xaizek 2017-06-14 14:28:48

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/vifm

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/vifm

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master