#!/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