73 lines
2.0 KiB
Bash
Executable File
73 lines
2.0 KiB
Bash
Executable File
#!/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
|