aboutsummaryrefslogtreecommitdiff
path: root/files/.config/nnn/plugins/umounttree
diff options
context:
space:
mode:
Diffstat (limited to 'files/.config/nnn/plugins/umounttree')
-rwxr-xr-xfiles/.config/nnn/plugins/umounttree52
1 files changed, 52 insertions, 0 deletions
diff --git a/files/.config/nnn/plugins/umounttree b/files/.config/nnn/plugins/umounttree
new file mode 100755
index 0000000..011d74d
--- /dev/null
+++ b/files/.config/nnn/plugins/umounttree
@@ -0,0 +1,52 @@
+#!/usr/bin/env sh
+
+# Description: Autodetects a nnn remote mountpoint (mounted with `c`)
+# from any of its subfolders and allows unmounting it
+# from the subdir without navigating to the mountppoint
+# or entering the remote name. Also works when hovering
+# the mountpoint directly like vanilla `u`.
+#
+# Dependencies: fusermount
+#
+# Shell: POSIX compliant
+# Authors: Kabouik & 0xACE
+#
+# TODO:
+# - Avoid lazy unmount by forcing nnn context to leave the subfolder before fusermount.
+# Tried `printf "%s" "0c$m" > "$NNN_PIPE"` but it breaks the nnn interface, see #854.
+
+err=0
+m=$HOME/.config/nnn/mounts
+if [ "$PWD" = "$m" ]; then
+ # Allow running the script on hovered directory if user is in ~/.config/nnn/mounts
+ d="$1"
+else
+ d=$(dirname "$(readlink -f "$1")" | grep -oP "^$m\K.*" | cut -d"/" -f2)
+fi
+
+# Test if user is within $m or a subdir, abort if not
+if [ "$d" = "" ]; then
+ clear && printf "You are not in a remote folder mounted with nnn. Press return to continue. " && read -r _
+else
+ # Test if $m/$d is a mountpoint and try unmounting if it is
+ mountpoint -q -- "$m/$d"
+ if [ "$?" -eq "1" ]; then
+ clear && printf "Parent '%s' is not a mountpoint. Press return to continue. " "$d" && read -r _
+ else
+ cd "$m" && fusermount -uq "$m/$d" || err=1
+ if [ "$err" -eq "0" ]; then
+ rmdir "$m/$d" && clear && printf "Parent '%s' unmounted." "$d"
+ else
+ clear && printf "Failed to unmount. Try lazy unmount? [Yy/Nn] " && read -r
+ fi
+ fi
+fi
+
+# If unmount fails, offer lazy unmount
+if [ "$REPLY" = "y" ] || [ "$REPLY" = "Y" ]; then
+ err=0
+ cd "$m" && fusermount -uqz "$m/$d" || err=1
+ if [ "$err" -eq "0" ]; then
+ rmdir "$m/$d" && clear && printf "Parent '%s' unmounted with lazy unmount. " "$d"
+ fi
+fi