aboutsummaryrefslogtreecommitdiff
path: root/sdn-open
diff options
context:
space:
mode:
Diffstat (limited to 'sdn-open')
-rwxr-xr-xsdn-open72
1 files changed, 72 insertions, 0 deletions
diff --git a/sdn-open b/sdn-open
new file mode 100755
index 0000000..5eb048f
--- /dev/null
+++ b/sdn-open
@@ -0,0 +1,72 @@
+#!/bin/sh -e
+# sdn-open: an opener for sdn that makes use of Midnight Commander configuration
+# to make more kinds of files directly openable
+
+if [ "$#" -ne 1 ]
+then
+ echo "Usage: $0 FILE" >&2
+ exit 2
+fi
+
+# This handles both MC_DATADIR and odd installation locations.
+datadir=
+if command -v mc >/dev/null
+then datadir=$(mc --datadir | sed 's/ (.*)$//')
+fi
+
+config=
+for dir in "$HOME"/.config/mc "$datadir" /etc/mc
+do
+ if [ -n "$dir" -a -f "$dir/mc.ext.ini" ]
+ then
+ config=$dir/mc.ext.ini
+ break
+ fi
+done
+
+# This is often used in %env{} expansion, so let's be on the same page.
+export PAGER=${PAGER:-less}
+
+export MC_EXT_FILENAME=$(realpath "$1")
+export MC_EXT_BASENAME=$(basename "$1")
+export MC_EXT_CURRENTDIR=$(dirname "$MC_EXT_FILENAME")
+output=$(sdn-mc-ext <"$config" "$(file -Lbz "$1")" \
+ "$MC_EXT_FILENAME" "$MC_EXT_BASENAME" "$MC_EXT_CURRENTDIR" Open || :)
+kind=$(echo "$output" | sed -n 1p)
+command=$(echo "$output" | sed -n 2p)
+
+# We're trying to retain any explicit user preferences while navigating through:
+# - Debian-based systems have /etc/alternatives/open as /usr/bin/open,
+# pointing to either /usr/bin/xdg-open or /usr/bin/run-mailcap;
+# - macOS has /usr/bin/open, and typically no xdg-open;
+# - Windows Subsystem for Linux has explorer.exe in PATH,
+# where launched applications may have problems with UNC paths,
+# and possibly also xdg-open that may not be capable of opening much.
+#
+# Both macOS open and Windows explorer.exe are capable of opening files,
+# directories, as well as URLs through native associations.
+if [ -n "$MC_XDG_OPEN" ]
+then :
+elif command -v explorer.exe >/dev/null
+then export MC_XDG_OPEN=explorer.exe
+elif command -v open >/dev/null
+then export MC_XDG_OPEN=open
+elif command -v xdg-open >/dev/null
+then export MC_XDG_OPEN=xdg-open
+fi
+
+case "$kind" in
+cd)
+ # These mostly enter virtual filesystems, which we do not understand.
+ "$MC_XDG_OPEN" "$MC_EXT_FILENAME"
+ ;;
+'')
+ if [ -n "$command" ]
+ then eval "$command"
+ else "$MC_XDG_OPEN" "$MC_EXT_FILENAME"
+ fi
+ ;;
+*)
+ echo "Unsupported: $kind" >&2
+ exit 1
+esac