Comparing files

From Vifm Wiki
Revision as of 14:44, 28 July 2014 by (talk) (Use "source" tag instead of "syntaxhighlight")
Jump to navigation Jump to search

Comparison script

The script below takes two arguments on the command-line and compares them via diff command. It also echoes generic human-readable answer saying whether two file system objects are equal. As diff compares directories as well as files, paths to directories are valid arguments as well.


if [ $# != 2 ] ; then
    echo 'Expected exactly two arguments'
    exit 1

if [ -f "$1" -a -f "$2" ]; then
    : # OK, do nothing here
elif [ -d "$1" -a -d "$2" ]; then
    : # OK, do nothing here
    if [ -f "$1" ]; then
    if [ -f "$2" ]; then
    echo "Arguments are of different type ($type_of_1/$type_of_2)"
    exit 1

if diff "$1" "$2" > /dev/null 2>&1; then
    echo 'Equal'
    echo 'Not equal'

Plugging the script into vifm

To use it in Vifm:

  1. Save the script as compare-cmd (not cmp or compare to avoid name conflict with existing tools) at one of directories listed in your $PATH environment variable or under $VIFM/scripts (most likely that it's ~/.vifm/scripts).
  2. On Unix-like operating systems make the script file executable by running
    chmod +x compare-cmp
  3. Add following lines to your vifmrc:
   command! cmpinternal compare-cmd %a %S
   command! cmp : if expand('%c') == expand('%f')
              \ |     echo expand('Comparing %"c and %"C:t ...')
              \ |     cmpinternal %c %C
              \ | else
              \ |     echo expand('Comparing files: %"f ...')
              \ |     cmpinternal %f
              \ | endif

Explanation of key parts:

  • cmpinternal — a trick to invoke external command. Calling execute "!compare-cmd ... %S" reparses command-line which leads to loosing results of command execution (they are overwritten by execution of if-else-endif block).
  • expand('%c') == expand('%f') — check whether only one file is selected in current pane.


  • Run :cmp without selection or with single file selection to compare files under cursors in two panes.
  • Run :cmp after selecting two files in the current pane to compare them.

Results are printed on the status bar (because of %S macro in cmdinternal).