aboutsummaryrefslogtreecommitdiff
path: root/files/.config/nnn/plugins/diffs
diff options
context:
space:
mode:
Diffstat (limited to 'files/.config/nnn/plugins/diffs')
-rwxr-xr-xfiles/.config/nnn/plugins/diffs62
1 files changed, 62 insertions, 0 deletions
diff --git a/files/.config/nnn/plugins/diffs b/files/.config/nnn/plugins/diffs
new file mode 100755
index 0000000..0464781
--- /dev/null
+++ b/files/.config/nnn/plugins/diffs
@@ -0,0 +1,62 @@
+#!/usr/bin/env sh
+
+# Description: Show diff of 2 directories or multiple files in vimdiff
+#
+# Notes:
+# 1. vim may show the warning: 'Vim: Warning: Input is not from a terminal'
+# press 'Enter' to ignore and proceed.
+# 2. if only one file is in selection, the hovered file is considered as the
+# second file to diff with
+#
+# Shell: POSIX compliant
+# Authors: Arun Prakash Jana, ath3
+
+selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
+
+if type nvim >/dev/null 2>&1; then
+ diffcmd="nvim -d"
+else
+ diffcmd="vimdiff +0"
+fi
+
+dirdiff() {
+ dir1=$(mktemp "${TMPDIR:-/tmp}"/nnn-"$(basename "$1")".XXXXXXXX)
+ dir2=$(mktemp "${TMPDIR:-/tmp}"/nnn-"$(basename "$2")".XXXXXXXX)
+ ls -A1 "$1" > "$dir1"
+ ls -A1 "$2" > "$dir2"
+ $diffcmd "$dir1" "$dir2"
+ rm "$dir1" "$dir2"
+}
+
+if [ -s "$selection" ]; then
+ arr=$(tr '\0' '\n' < "$selection")
+ if [ "$(echo "$arr" | wc -l)" -gt 1 ]; then
+ f1="$(echo "$arr" | sed -n '1p')"
+ f2="$(echo "$arr" | sed -n '2p')"
+ if [ -d "$f1" ] && [ -d "$f2" ]; then
+ dirdiff "$f1" "$f2"
+ else
+ # If xargs supports the -o option, use it to get rid of:
+ # Vim: Warning: Input is not from a terminal
+ # xargs -0 -o vimdiff < $selection
+
+ eval xargs -0 "$diffcmd" < "$selection"
+ fi
+ elif [ -n "$1" ]; then
+ f1="$(echo "$arr" | sed -n '1p')"
+ if [ -d "$f1" ] && [ -d "$1" ]; then
+ dirdiff "$f1" "$1"
+ elif [ -f "$f1" ] && [ -f "$1" ]; then
+ $diffcmd "$f1" "$1"
+ else
+ echo "cannot compare file with directory"
+ fi
+ else
+ echo "needs at least 2 files or directories selected for comparison"
+ fi
+fi
+
+# Clear selection
+if [ -p "$NNN_PIPE" ]; then
+ printf "-" > "$NNN_PIPE"
+fi