diff --git a/misc/bin/cptemplate.sh b/misc/bin/cptemplate.sh new file mode 100755 index 0000000..88458e4 --- /dev/null +++ b/misc/bin/cptemplate.sh @@ -0,0 +1,113 @@ +#!/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 + +DEFAULT_TEMPLATE_DIR="$HOME/Templates" + +# Helper functions +function help() { +cat << HELPMESSAGE +$(basename "$0") $MAJOR_VERSION.$MINOR_VERSION.$PATCH_VERSION + +Usage: $(basename "$0") [-h] [-d DIR] [-f] dest + +Positional arguments: + dest + +options: + -h, --help show this help message and exit + -d DIR, --template-dir DIR + choose a template directory (default: ~/Templates) + -f, --force overwrite dest if it exists +HELPMESSAGE +} + +while true; do + case "${1}" in + '-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 + ;; + '-f'|'--force') + FORCE_OVERWRITE='--force' + shift + continue + ;; + '-h'|'--help') + help + exit + ;; + --) + shift + break + ;; + -*) + printf '%s\n' "Unknown option: ${1}" >&2 + exit 1 + ;; + *) + break + ;; + esac +done + +# If directory wasn't overridden +if [[ -z "$DIR" ]]; then + DIR="$DEFAULT_TEMPLATE_DIR" +fi + +# If no target specified +if [[ -z "$1" ]]; then + printf '%s\n' 'Please specify target name' + exit 1 +fi + +# Check if default template directory exists +if ! [[ -d "$DIR" ]]; then + printf '%s\n' "Template directory doesn't exist, exiting." + exit 2 +fi + +files="$(find_files "$DIR")" +selected_file="$(run_fzf "$files")" + +# Check if target exists +if [[ -f "$1" && -z "$FORCE_OVERWRITE" ]]; then + printf '%s\n' 'File already exists, exiting' + exit 1 +elif [[ -f "$1" && -n "$FORCE_OVERWRITE" ]]; then + cp --verbose --force -- "$selected_file" "$1" +else + cp --verbose -- "$selected_file" "$1" +fi diff --git a/misc/bin/fedit.sh b/misc/bin/fedit.sh new file mode 100755 index 0000000..4e50ac3 --- /dev/null +++ b/misc/bin/fedit.sh @@ -0,0 +1,131 @@ +#!/usr/bin/env bash + +# Cleanup +set -e +trap 'exit 1' SIGINT + +# Source library +#LIBDIR="/usr/share/file-scripts/" +LIBDIR="$HOME/Projects/file-scripts/misc/" + +for f in "$LIBDIR"/*.sh; do + source "${f}" +done + +BOOT_DIR='/boot' +ETC_DIR='/etc' + +# Helper functions +function help() { +cat << HELPMESSAGE +$(basename "$0") $MAJOR_VERSION.$MINOR_VERSION.$PATCH_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="$(run_fzf "$files")" + +if [[ -w "${selected_file}" ]]; then + "$EDITOR" "$selected_file" +else + sudo --edit "$selected_file" +fi