134 lines
3.0 KiB
Plaintext
134 lines
3.0 KiB
Plaintext
#autoload
|
||
|
||
# Helper: backup a file via a dummy backup script/command
|
||
confe_backup_file() {
|
||
emulate -L zsh
|
||
|
||
local file=${1:A}
|
||
if [[ -z $file ]]; then
|
||
print -u2 "confe: no file passed to confe_backup_file"
|
||
return 1
|
||
fi
|
||
if [[ ! -e $file ]]; then
|
||
print -u2 "confe: cannot backup, file does not exist: $file"
|
||
return 1
|
||
fi
|
||
|
||
# You can override this with: CONFE_BACKUP_CMD=your-script
|
||
local backup_cmd=${CONFE_BACKUP_CMD:-echo}
|
||
|
||
# Dummy backup – replace with your real backup script
|
||
"$backup_cmd" "$file"
|
||
}
|
||
|
||
# Helper: stage a file in its git repository (if there is one)
|
||
confe_stage_file() {
|
||
emulate -L zsh
|
||
|
||
local file=${1:A}
|
||
if [[ -z $file ]]; then
|
||
print -u2 "confe: no file passed to confe_stage_file"
|
||
return 1
|
||
fi
|
||
if [[ ! -e $file ]]; then
|
||
print -u2 "confe: cannot stage, file does not exist: $file"
|
||
return 1
|
||
fi
|
||
|
||
local dir=${file:h}
|
||
|
||
if git -C "$dir" rev-parse --is-inside-work-tree &>/dev/null; then
|
||
git -C "$dir" add "$file"
|
||
else
|
||
print -u2 "confe: $file is not inside a git repository"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
confe() {
|
||
emulate -L zsh
|
||
|
||
# Main executable for editing – define here.
|
||
# You can also override with CONFE_EDIT_CMD in your env.
|
||
local edit_cmd=${CONFE_EDIT_CMD:-${EDITOR:-vim}}
|
||
[[ -z $edit_cmd ]] && edit_cmd=nvim
|
||
|
||
local do_backup=false
|
||
local do_staged=false
|
||
local -a positional
|
||
|
||
# Option parsing: --backup/-b, --staged/-s
|
||
while (( $# > 0 )); do
|
||
case "$1" in
|
||
--backup|-b)
|
||
do_backup=true
|
||
;;
|
||
--staged|-s)
|
||
do_staged=true
|
||
;;
|
||
--)
|
||
shift
|
||
positional+=("$@")
|
||
break
|
||
;;
|
||
--*)
|
||
print -u2 "confe: unknown option: $1"
|
||
return 1
|
||
;;
|
||
-*)
|
||
print -u2 "confe: unknown short option: $1"
|
||
return 1
|
||
;;
|
||
*)
|
||
positional+=("$1")
|
||
;;
|
||
esac
|
||
shift
|
||
done
|
||
|
||
set -- "${positional[@]}"
|
||
|
||
local topic=$1
|
||
if [[ -z $topic ]]; then
|
||
print -u2 "usage: confe [--backup|-b] [--staged|-s] (alias|keybindings|options|path|packages|ssh|brewfile)"
|
||
return 1
|
||
fi
|
||
|
||
# Associative array: topic → file path
|
||
local -A CONFE_FILES=(
|
||
alias "$ZDOTDIR/alias.zsh"
|
||
keybindings "$ZDOTDIR/keybindings.zsh"
|
||
options "$ZDOTDIR/options.zsh"
|
||
path "$ZDOTDIR/path.zsh"
|
||
packages "$DOTFILES/antidote/zsh_plugins.txt"
|
||
ssh "$HOME/.ssh/config"
|
||
brewfile "$DOTFILES/00-homebrew/Brewfile"
|
||
)
|
||
|
||
local file=${CONFE_FILES[$topic]}
|
||
|
||
if [[ -z $file ]]; then
|
||
print -u2 "confe: unknown topic: $topic"
|
||
print -u2 "valid topics: ${(j:, :)${(k)CONFE_FILES}}"
|
||
return 1
|
||
fi
|
||
|
||
# Run backup first if requested
|
||
if $do_backup; then
|
||
confe_backup_file "$file" || return $?
|
||
fi
|
||
|
||
# Main dummy command – you replace by setting edit_cmd / CONFE_EDIT_CMD
|
||
eval "$edit_cmd" $file(:P) || return $?
|
||
if [[ "${file}(:e)" == "zsh" ]]; then
|
||
source $file(:P)
|
||
fi
|
||
|
||
# Stage changes if requested
|
||
if $do_staged; then
|
||
confe_stage_file "$file" || return $?
|
||
fi
|
||
}
|
||
|
||
confe ${1:-ssh}
|