119 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env bash
 | 
						|
 | 
						|
# Cleanup
 | 
						|
set -e
 | 
						|
trap 'exit 1' SIGINT
 | 
						|
 | 
						|
# Constants
 | 
						|
VERSION=2.0.0
 | 
						|
 | 
						|
BOOT_DIR='/boot'
 | 
						|
ETC_DIR='/etc'
 | 
						|
fd_opts=(--hidden --type file --type symlink --threads "$(nproc)")
 | 
						|
 | 
						|
# 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')
 | 
						|
            fd_opts+=(--no-ignore-vcs)
 | 
						|
            shift
 | 
						|
            continue
 | 
						|
            ;;
 | 
						|
        '-I' | '--no-ignore')
 | 
						|
            fd_opts+=(--no-ignore)
 | 
						|
            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
 | 
						|
 | 
						|
files="$(fd "${fd_opts[@]}" -- . $DIR)"
 | 
						|
selected_file="$(fzf --select-1 --exit-0 <<< "$files")"
 | 
						|
 | 
						|
if [[ -w "${selected_file}" ]]; then
 | 
						|
    "$EDITOR" "$selected_file"
 | 
						|
else
 | 
						|
    sudo --edit "$selected_file"
 | 
						|
fi
 |