Add shell auto-completion for zsh, bash, and fish
- completions/_ssr zsh #compdef completion using _arguments/_values
- completions/ssr.bash bash complete -F function (works with bash-completion@2)
- completions/ssr.fish fish completions with __ssr_needs_subcmd predicates
- bin/ssr-completions install/uninstall/status subcommand
- auto-detects $SHELL, --shell zsh|bash|fish|all
- symlinks into user-scoped paths (no sudo):
~/.zsh/completions/_ssr
~/.local/share/bash-completion/completions/ssr
~/.config/fish/completions/ssr.fish
- prints fpath/bash-completion setup hints if not configured
- bin/ssr dispatcher knows `completions`; help line added
- bin/ssr-install offers completion install after schedule prompt
- README Shell completions section, command list, layout entry
Verified:
- zsh -n on _ssr OK; autoload registers function
- bash -n on ssr.bash OK; `complete -p ssr` returns the registration after source
- end-to-end install/status/uninstall against an ephemeral $HOME
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
#compdef ssr
|
||||
# zsh completion for ssr — System Sync & Restore.
|
||||
# Install: copy or symlink into a directory on $fpath, then `autoload -Uz _ssr`.
|
||||
|
||||
_ssr() {
|
||||
local context state line
|
||||
typeset -A opt_args
|
||||
|
||||
local -a commands=(
|
||||
'install:First-time install (link binary, seed config, schedule sync)'
|
||||
'sync:Run a backup → cloud'
|
||||
'restore:Restore a machine (defaults to cloud Brewfile)'
|
||||
'update:Pull latest ssr code, refresh launchd if needed'
|
||||
'schedule:Manage the scheduled launchd sync job'
|
||||
'config:Show or edit the active config file'
|
||||
'completions:Install or remove shell completions'
|
||||
'status:Show last sync time, cloud target, schedule state'
|
||||
'version:Print version'
|
||||
'help:Show top-level help'
|
||||
)
|
||||
|
||||
_arguments -C \
|
||||
'(-h --help)'{-h,--help}'[Show help]' \
|
||||
'(-c --config)'{-c,--config}'[Use a specific config file]:path:_files' \
|
||||
'1: :->cmd' \
|
||||
'*::arg:->args'
|
||||
|
||||
case "$state" in
|
||||
cmd)
|
||||
_describe -t commands 'ssr command' commands
|
||||
;;
|
||||
args)
|
||||
case "${line[1]}" in
|
||||
restore)
|
||||
_arguments \
|
||||
'(-h --help)'{-h,--help}'[Show help]' \
|
||||
'1:Brewfile:_files'
|
||||
;;
|
||||
update)
|
||||
_arguments \
|
||||
'(-h --help)'{-h,--help}'[Show help]' \
|
||||
'(-n --dry-run)'{-n,--dry-run}'[Preview without pulling]'
|
||||
;;
|
||||
schedule)
|
||||
_values 'schedule action' \
|
||||
'on[Enable scheduled sync]' \
|
||||
'off[Disable scheduled sync]' \
|
||||
'status[Show schedule state]'
|
||||
;;
|
||||
config)
|
||||
_values 'config action' \
|
||||
'show[Print active config]' \
|
||||
'edit[Open config in $EDITOR]' \
|
||||
'path[Print config path]'
|
||||
;;
|
||||
completions)
|
||||
_values 'completions action' \
|
||||
'install[Install shell completions]' \
|
||||
'uninstall[Remove shell completions]' \
|
||||
'status[Show installed completions]'
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
_ssr "$@"
|
||||
@@ -0,0 +1,69 @@
|
||||
# bash completion for ssr — System Sync & Restore.
|
||||
# Source from your ~/.bashrc or place under ~/.local/share/bash-completion/completions/ssr
|
||||
|
||||
_ssr() {
|
||||
local cur prev words cword
|
||||
if declare -F _init_completion >/dev/null 2>&1; then
|
||||
_init_completion || return
|
||||
else
|
||||
COMPREPLY=()
|
||||
cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||
words=("${COMP_WORDS[@]}")
|
||||
cword=$COMP_CWORD
|
||||
fi
|
||||
|
||||
local commands="install sync restore update schedule config completions status version help"
|
||||
local global_flags="-c --config -h --help"
|
||||
|
||||
# Detect command (first non-flag word after `ssr`).
|
||||
local cmd=""
|
||||
local i
|
||||
for ((i = 1; i < cword; i++)); do
|
||||
case "${words[i]}" in
|
||||
-c|--config) ((i++)); continue ;;
|
||||
-*) continue ;;
|
||||
*) cmd="${words[i]}"; break ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Handle --config <path>.
|
||||
if [[ "$prev" == "-c" || "$prev" == "--config" ]]; then
|
||||
COMPREPLY=( $(compgen -f -- "$cur") )
|
||||
return
|
||||
fi
|
||||
|
||||
# Top-level command selection.
|
||||
if [[ -z "$cmd" ]]; then
|
||||
if [[ "$cur" == -* ]]; then
|
||||
COMPREPLY=( $(compgen -W "$global_flags" -- "$cur") )
|
||||
else
|
||||
COMPREPLY=( $(compgen -W "$commands" -- "$cur") )
|
||||
fi
|
||||
return
|
||||
fi
|
||||
|
||||
# Per-command argument completion.
|
||||
case "$cmd" in
|
||||
restore)
|
||||
COMPREPLY=( $(compgen -f -- "$cur") )
|
||||
;;
|
||||
update)
|
||||
COMPREPLY=( $(compgen -W "--dry-run -n -h --help" -- "$cur") )
|
||||
;;
|
||||
schedule)
|
||||
COMPREPLY=( $(compgen -W "on off status" -- "$cur") )
|
||||
;;
|
||||
config)
|
||||
COMPREPLY=( $(compgen -W "show edit path" -- "$cur") )
|
||||
;;
|
||||
completions)
|
||||
COMPREPLY=( $(compgen -W "install uninstall status" -- "$cur") )
|
||||
;;
|
||||
*)
|
||||
COMPREPLY=()
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
complete -F _ssr ssr
|
||||
@@ -0,0 +1,71 @@
|
||||
# fish completion for ssr — System Sync & Restore.
|
||||
# Install: drop into ~/.config/fish/completions/ssr.fish
|
||||
|
||||
set -l ssr_cmds install sync restore update schedule config completions status version help
|
||||
|
||||
# True when no subcommand has been picked yet (only flags / option-args seen so far).
|
||||
function __ssr_needs_subcmd
|
||||
set -l tokens (commandline -opc)
|
||||
set -l skip_next 0
|
||||
for tok in $tokens[2..-1]
|
||||
if test $skip_next -eq 1
|
||||
set skip_next 0
|
||||
continue
|
||||
end
|
||||
switch $tok
|
||||
case -c --config
|
||||
set skip_next 1
|
||||
case '-*'
|
||||
# ignore other flags
|
||||
case '*'
|
||||
return 1
|
||||
end
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
# True when the chosen subcommand equals $argv[1].
|
||||
function __ssr_using_subcmd
|
||||
set -l target $argv[1]
|
||||
set -l tokens (commandline -opc)
|
||||
set -l skip_next 0
|
||||
for tok in $tokens[2..-1]
|
||||
if test $skip_next -eq 1
|
||||
set skip_next 0
|
||||
continue
|
||||
end
|
||||
switch $tok
|
||||
case -c --config
|
||||
set skip_next 1
|
||||
case '-*'
|
||||
case '*'
|
||||
test "$tok" = "$target"; and return 0
|
||||
return 1
|
||||
end
|
||||
end
|
||||
return 1
|
||||
end
|
||||
|
||||
# Global flags
|
||||
complete -c ssr -s c -l config -d 'Config file path' -r -F
|
||||
complete -c ssr -s h -l help -d 'Show help'
|
||||
|
||||
# Subcommands
|
||||
complete -c ssr -n __ssr_needs_subcmd -a install -d 'First-time install'
|
||||
complete -c ssr -n __ssr_needs_subcmd -a sync -d 'Run a backup → cloud'
|
||||
complete -c ssr -n __ssr_needs_subcmd -a restore -d 'Restore a machine'
|
||||
complete -c ssr -n __ssr_needs_subcmd -a update -d 'Pull latest ssr code'
|
||||
complete -c ssr -n __ssr_needs_subcmd -a schedule -d 'Manage launchd schedule'
|
||||
complete -c ssr -n __ssr_needs_subcmd -a config -d 'Show/edit config'
|
||||
complete -c ssr -n __ssr_needs_subcmd -a completions -d 'Install shell completions'
|
||||
complete -c ssr -n __ssr_needs_subcmd -a status -d 'Show state summary'
|
||||
complete -c ssr -n __ssr_needs_subcmd -a version -d 'Print version'
|
||||
complete -c ssr -n __ssr_needs_subcmd -a help -d 'Show top-level help'
|
||||
|
||||
# Per-subcommand args
|
||||
complete -c ssr -n '__ssr_using_subcmd restore' -F
|
||||
complete -c ssr -n '__ssr_using_subcmd update' -s n -l dry-run -d 'Preview without pulling'
|
||||
|
||||
complete -c ssr -n '__ssr_using_subcmd schedule' -a 'on off status'
|
||||
complete -c ssr -n '__ssr_using_subcmd config' -a 'show edit path'
|
||||
complete -c ssr -n '__ssr_using_subcmd completions' -a 'install uninstall status'
|
||||
Reference in New Issue
Block a user