77 lines
1.7 KiB
Bash
77 lines
1.7 KiB
Bash
# autocomplete
|
||
|
||
_cmr() {
|
||
local -a opts
|
||
opts=('--draft')
|
||
|
||
# If completing an option
|
||
if [[ $words[CURRENT] == -* ]]; then
|
||
_describe 'options' opts
|
||
return
|
||
fi
|
||
|
||
# Extract the full argument being completed (comma-separated)
|
||
local cur=$words[CURRENT]
|
||
local prefix last
|
||
prefix="${cur%,*}"
|
||
last="${cur##*,}"
|
||
|
||
# Build GitLab query
|
||
local query="users?state=active&per_page=100"
|
||
local last_len=${#last}
|
||
|
||
# Only use &search= when there are 3 or more characters
|
||
if (( last_len >= 3 )); then
|
||
query="${query}&search=${last}"
|
||
fi
|
||
|
||
# Fetch usernames
|
||
local -a users
|
||
users=("${(@f)$(glab api "$query" 2>/dev/null | jq -r '.[].username')}")
|
||
|
||
# If 1–2 chars, do local filtering over the full list
|
||
if (( last_len > 0 && last_len < 3 )); then
|
||
local -a filtered
|
||
local u
|
||
for u in "${users[@]}"; do
|
||
# substring match; change to == ${last}* for prefix-only
|
||
[[ $u == *${last}* ]] && filtered+="$u"
|
||
done
|
||
users=("${filtered[@]}")
|
||
fi
|
||
|
||
# Build final completion items
|
||
local -a completions
|
||
if [[ "$prefix" != "$cur" ]]; then
|
||
prefix="${prefix},"
|
||
completions=("${prefix}${^users}")
|
||
else
|
||
completions=("${users[@]}")
|
||
fi
|
||
|
||
_describe 'users' completions
|
||
}
|
||
|
||
function _tat_autocomplete() {
|
||
local -a projects files dirs
|
||
local expl
|
||
|
||
# Get tmuxinator projects
|
||
projects=(${(f)"$(tls)"})
|
||
|
||
# Get files and directories with proper completion
|
||
_alternative \
|
||
'projects:tmuxinator projects:compadd -a projects' \
|
||
'files:files:_files'
|
||
}
|
||
|
||
# Register the completion function for zsh
|
||
if [[ -n ${ZSH_VERSION-} ]]; then
|
||
compdef _tat_autocomplete tat
|
||
compdef _cmr cmr
|
||
else
|
||
# Fallback for bash
|
||
complete -f -F _tat_autocomplete -o default tat
|
||
complete -f -F _cmr -o default tat
|
||
fi
|