#!/usr/bin/env sh # Description: Sets the xdg-open's default application for the current entry's file # type. ${XDG_DATA_DIRS} and ${XDG_DATA_HOME} are set to the recommended # defaults if unset, as specified in XDG Base Directory Specification # - http://specifications.freedesktop.org/basedir-spec/. # # Dependencies: xdg-utils, fzf or dmenu (GUI) # # Shell: POSIX compliant # Author: lwnctd # set to 1 to enable GUI apps GUI="${GUI:-0}" if [ "$GUI" -ne 0 ] && command -v dmenu > /dev/null 2>& 1; then menu="dmenu -i -l 7" elif command -v fzf > /dev/null 2>& 1; then menu="fzf -e --tiebreak=begin" fi if [ -z "$1" ] || [ -z "$menu" ] > /dev/null 2>& 1; then exit 1 fi ftype=$(xdg-mime query filetype "$2/$1") if [ -z "$ftype" ]; then exit 1 fi dirs=${XDG_DATA_DIRS:-/usr/local/share:/usr/share} dirs=${dirs}:${XDG_DATA_HOME:-$HOME/.local/share}: while [ -n "$dirs" ]; do d=${dirs%%:*} if [ -n "$d" ] && [ -d "$d"/applications ]; then set -- "$@" "$d"/applications fi dirs=${dirs#*:} done app=$(find "$@" -iname '*.desktop' -exec grep '^Name=' {} + \ | sort -u -t ':' -k 1,1 \ | sed -e 's;..*/\(..*desktop\):Name=\(..*\);\2:\1;' \ | sort -t ':' -k 1,1 \ | column -t -s ':' -o "$(printf '\t')" \ | $menu \ | cut -f 2) if [ -n "$app" ]; then xdg-mime default "${app%%[[:blank:]]*}" "$ftype" fi