fix(autocompletion): store usernames locally for fast lookup
This commit is contained in:
@@ -1,5 +1,27 @@
|
|||||||
# autocomplete
|
# autocomplete
|
||||||
|
|
||||||
|
# Where to cache usernames (override with $CMR_USER_CACHE if you want)
|
||||||
|
: ${CMR_USER_CACHE:="$HOME/.cache/cmr_users"}
|
||||||
|
|
||||||
|
cmr_update_users() {
|
||||||
|
local cache="$CMR_USER_CACHE"
|
||||||
|
local dir="${cache:h}" # directory part
|
||||||
|
|
||||||
|
mkdir -p -- "$dir"
|
||||||
|
|
||||||
|
echo "Updating cmr user cache in $cache..." >&2
|
||||||
|
|
||||||
|
# Fetch ALL active users (using --paginate for multiple pages)
|
||||||
|
glab api "users?state=active&per_page=100" --paginate \
|
||||||
|
| jq -r '.[].username' \
|
||||||
|
| sort -u > "$cache"
|
||||||
|
|
||||||
|
local count
|
||||||
|
count=$(wc -l < "$cache" | tr -d ' ')
|
||||||
|
echo "Stored $count usernames in $cache" >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
_cmr() {
|
_cmr() {
|
||||||
emulate -L zsh
|
emulate -L zsh
|
||||||
setopt extended_glob
|
setopt extended_glob
|
||||||
@@ -13,16 +35,25 @@ _cmr() {
|
|||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Full current "word" at cursor (may contain commas)
|
# Load cached users
|
||||||
|
: ${CMR_USER_CACHE:="$HOME/.cache/cmr_users"}
|
||||||
|
local -a users
|
||||||
|
if [[ -r "$CMR_USER_CACHE" ]]; then
|
||||||
|
users=("${(@f)$(< "$CMR_USER_CACHE")}")
|
||||||
|
else
|
||||||
|
# No cache yet → nothing to complete
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Full current "word" (may contain commas)
|
||||||
local cur=$words[CURRENT]
|
local cur=$words[CURRENT]
|
||||||
|
|
||||||
# Split into prefix (before last comma) and fragment being typed (after last comma)
|
# Split into prefix (before last comma) and fragment being typed (after last comma)
|
||||||
local prefix last
|
local prefix last
|
||||||
prefix="${cur%,*}"
|
prefix="${cur%,*}"
|
||||||
last="${cur##*,}"
|
last="${cur##*,}"
|
||||||
local last_len=${#last}
|
|
||||||
|
|
||||||
# Tell zsh: "this part is fixed, don't match on it"
|
# Tell zsh what is fixed and what is being completed
|
||||||
if [[ "$prefix" != "$cur" ]]; then
|
if [[ "$prefix" != "$cur" ]]; then
|
||||||
IPREFIX="${prefix},"
|
IPREFIX="${prefix},"
|
||||||
PREFIX="$last"
|
PREFIX="$last"
|
||||||
@@ -31,30 +62,19 @@ _cmr() {
|
|||||||
PREFIX="$cur"
|
PREFIX="$cur"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Build GitLab query
|
# Filter users by the fragment (substring match)
|
||||||
local query="users?state=active&per_page=100"
|
if [[ -n "$last" ]]; then
|
||||||
|
|
||||||
# Only use &search= when fragment has 3+ chars
|
|
||||||
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, filter locally on the full list
|
|
||||||
if (( last_len > 0 && last_len < 3 )); then
|
|
||||||
local -a filtered
|
local -a filtered
|
||||||
local u
|
local u
|
||||||
for u in "${users[@]}"; do
|
for u in "${users[@]}"; do
|
||||||
# substring match; change to == ${last}* for prefix-only
|
|
||||||
[[ $u == *${last}* ]] && filtered+="$u"
|
[[ $u == *${last}* ]] && filtered+="$u"
|
||||||
done
|
done
|
||||||
users=("${filtered[@]}")
|
users=("${filtered[@]}")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Now just offer the usernames; zsh will prepend $IPREFIX automatically
|
(( ${#users} == 0 )) && return 0
|
||||||
|
|
||||||
|
# Offer usernames; zsh will prefix with $IPREFIX
|
||||||
compadd -Q -- "${users[@]}"
|
compadd -Q -- "${users[@]}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user