Files
2026-05-24 23:01:14 -07:00

128 lines
3.6 KiB
Bash

# himi bash completion
# Source this or drop in ~/.local/share/bash-completion/completions/
_himi() {
local cur prev words cword
# Compatibility for older bash
if type _init_completion &>/dev/null; then
_init_completion || return
else
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
cword=$COMP_CWORD
words=("${COMP_WORDS[@]}")
fi
local commands="add enable disable remove rebuild list entropy test config uninstall"
local flags="-o -n -h --help"
local config_dir="${XDG_CONFIG_HOME:-$HOME/.config}/himi"
local lists_dir="${config_dir}/lists"
local pool_dir="${config_dir}/pool"
# Check if we're in a multi-arg command (enable/disable)
local cmd=""
local i
for ((i=1; i < cword; i++)); do
case "${words[i]}" in
enable|disable|add|entropy|test|config)
cmd="${words[i]}"
break
;;
esac
done
case "$cmd" in
enable)
# Show disabled lists + 'all' keyword
if [[ -d "$lists_dir" ]]; then
local available="all "
local f
for f in "$lists_dir"/*.txt; do
[[ -f "$f" ]] || continue
local name=$(basename "$f" .txt)
[[ ! -L "$pool_dir/$name.txt" ]] && available+="$name "
done
COMPREPLY=($(compgen -W "$available" -- "$cur"))
fi
return
;;
disable)
# Show enabled lists + 'all' keyword
if [[ -d "$pool_dir" ]]; then
local enabled="all "
local f
for f in "$pool_dir"/*.txt; do
[[ -L "$f" ]] || continue
enabled+="$(basename "$f" .txt) "
done
COMPREPLY=($(compgen -W "$enabled" -- "$cur"))
fi
return
;;
remove)
if [[ -d "$lists_dir" ]]; then
local lists=""
for f in "$lists_dir"/*.txt; do
[[ -f "$f" ]] || continue
lists+="$(basename "$f" .txt) "
done
COMPREPLY=($(compgen -W "$lists" -- "$cur"))
fi
return
;;
add)
COMPREPLY=($(compgen -f -X '!*.txt' -- "$cur"))
return
;;
entropy)
local templates="default easy secure pin diceware"
if [[ -f "${config_dir}/config.sh" ]]; then
local parsed
parsed=$(grep -E '^\s*"[a-z]+\|' "${config_dir}/config.sh" 2>/dev/null | sed 's/.*"\([a-z]*\)|.*/\1/' | tr '\n' ' ')
[[ -n "$parsed" ]] && templates="$parsed"
fi
COMPREPLY=($(compgen -W "$templates" -- "$cur"))
return
;;
test|config)
# No completion for test (user types pattern) or config (no args)
return
;;
esac
# Handle flags
case "$prev" in
-n)
COMPREPLY=($(compgen -W "1 3 5 10" -- "$cur"))
return
;;
-o)
local templates="default easy secure pin diceware"
if [[ -f "${config_dir}/config.sh" ]]; then
local parsed
parsed=$(grep -E '^\s*"[a-z]+\|' "${config_dir}/config.sh" 2>/dev/null | sed 's/.*"\([a-z]*\)|.*/\1/' | tr '\n' ' ')
[[ -n "$parsed" ]] && templates="$parsed"
fi
COMPREPLY=($(compgen -W "$templates" -- "$cur"))
return
;;
esac
# First argument: commands, flags, or templates
if [[ ${cword} -eq 1 ]]; then
local templates="default easy secure pin diceware"
if [[ -f "${config_dir}/config.sh" ]]; then
local parsed
parsed=$(grep -E '^\s*"[a-z]+\|' "${config_dir}/config.sh" 2>/dev/null | sed 's/.*"\([a-z]*\)|.*/\1/' | tr '\n' ' ')
[[ -n "$parsed" ]] && templates="$parsed"
fi
COMPREPLY=($(compgen -W "$commands $flags $templates" -- "$cur"))
return
fi
}
complete -F _himi himi