128 lines
3.6 KiB
Bash
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
|