134 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env bash
 | 
						|
 | 
						|
# Cleanup
 | 
						|
set -e
 | 
						|
trap 'exit 1' SIGINT
 | 
						|
 | 
						|
# Source library
 | 
						|
LIBDIR="/usr/share/file-scripts/"
 | 
						|
 | 
						|
for f in "$LIBDIR"/*.sh; do
 | 
						|
	source "${f}"
 | 
						|
done
 | 
						|
 | 
						|
# Constants
 | 
						|
VERSION=2.0.0
 | 
						|
 | 
						|
BOOT_DIR='/boot'
 | 
						|
ETC_DIR='/etc'
 | 
						|
 | 
						|
# Helper functions
 | 
						|
function help() {
 | 
						|
	cat <<HELPMESSAGE
 | 
						|
$(basename "$0") $VERSION
 | 
						|
 | 
						|
Usage: $(basename "$0") [-h|--help] [options] [patterns]
 | 
						|
 | 
						|
Options
 | 
						|
  -h, --help            show this help message and exit
 | 
						|
  -b, --boot            edit a file in /boot
 | 
						|
  -d DIR, --dir DIR     edit a file in a given directory
 | 
						|
  -E, --etc             edit a file in /etc
 | 
						|
  -I, --no-ignore       do not respect .(git|fd)ignore files
 | 
						|
  -i, --no-ignore-vcs   do not respect .gitignore files
 | 
						|
 | 
						|
Note that this script uses EDITOR to select an editor
 | 
						|
HELPMESSAGE
 | 
						|
}
 | 
						|
 | 
						|
while true; do
 | 
						|
	case "${1}" in
 | 
						|
	'-b' | '--boot')
 | 
						|
		EDIT_BOOT=1
 | 
						|
		shift
 | 
						|
		continue
 | 
						|
		;;
 | 
						|
	'-d' | '--dir')
 | 
						|
		DIR="${2}"
 | 
						|
		case "${DIR}" in
 | 
						|
		"")
 | 
						|
			exit 1
 | 
						|
			;;
 | 
						|
		-*)
 | 
						|
			exit 1
 | 
						|
			;;
 | 
						|
		esac
 | 
						|
		shift 2
 | 
						|
		continue
 | 
						|
		;;
 | 
						|
	--dir=*)
 | 
						|
		DIR="${1#*=}"
 | 
						|
		case "${DIR}" in
 | 
						|
		"")
 | 
						|
			exit 1
 | 
						|
			;;
 | 
						|
		-*)
 | 
						|
			exit 1
 | 
						|
			;;
 | 
						|
		esac
 | 
						|
		shift
 | 
						|
		continue
 | 
						|
		;;
 | 
						|
	'-E' | '--etc')
 | 
						|
		EDIT_ETC=1
 | 
						|
		shift
 | 
						|
		continue
 | 
						|
		;;
 | 
						|
	'-i' | '--no-ignore-vcs')
 | 
						|
		NO_IGNORE_VCS=1
 | 
						|
		shift
 | 
						|
		continue
 | 
						|
		;;
 | 
						|
	'-I' | '--no-ignore')
 | 
						|
		NO_IGNORE=1
 | 
						|
		shift
 | 
						|
		continue
 | 
						|
		;;
 | 
						|
	'-h' | '--help')
 | 
						|
		help
 | 
						|
		exit
 | 
						|
		;;
 | 
						|
	--)
 | 
						|
		shift
 | 
						|
		break
 | 
						|
		;;
 | 
						|
	-*)
 | 
						|
		printf '%s\n' "Unknown option: ${1}" >&2
 | 
						|
		exit 1
 | 
						|
		;;
 | 
						|
	*)
 | 
						|
		break
 | 
						|
		;;
 | 
						|
	esac
 | 
						|
done
 | 
						|
 | 
						|
# Handle -b and -E, they are mutually exclusive
 | 
						|
if [[ -n $EDIT_BOOT && -z $EDIT_ETC ]]; then
 | 
						|
	DIR="$BOOT_DIR"
 | 
						|
elif [[ -z $EDIT_BOOT && -n $EDIT_ETC ]]; then
 | 
						|
	DIR="$ETC_DIR"
 | 
						|
elif [[ -n $EDIT_BOOT && -n $EDIT_ETC ]]; then
 | 
						|
	printf '%s\n' 'Select either --boot or --etc, not both'
 | 
						|
	exit 1
 | 
						|
elif [[ -z $DIR ]]; then
 | 
						|
	DIR='.'
 | 
						|
fi
 | 
						|
 | 
						|
# Handle extra options
 | 
						|
declare -a extra_opts
 | 
						|
 | 
						|
if [[ -n $NO_IGNORE ]]; then
 | 
						|
	extra_opts+=('--no-ignore')
 | 
						|
elif [[ -n $NO_IGNORE_VCS ]]; then
 | 
						|
	extra_opts+=('--no-ignore-vcs')
 | 
						|
fi
 | 
						|
 | 
						|
files="$(find_files $DIR "${extra_opts[@]}")"
 | 
						|
selected_file="$(fzf --select-1 --exit-0 <<< "$files")"
 | 
						|
 | 
						|
if [[ -w "${selected_file}" ]]; then
 | 
						|
	"$EDITOR" "$selected_file"
 | 
						|
else
 | 
						|
	sudo --edit "$selected_file"
 | 
						|
fi
 |