Files
Dot-Zsh/Zsh/.zsh_completion
2026-06-01 15:39:04 +01:00

176 lines
5.0 KiB
Plaintext

# Completion behavior and wrapper bindings
autoload -Uz add-zsh-hook
if ! whence -w compdef >/dev/null 2>&1; then
autoload -Uz compinit
compinit -i >/dev/null 2>&1
fi
zmodload zsh/complist 2>/dev/null || true
zstyle ':completion:*' menu select
zstyle ':completion:*' verbose yes
zstyle ':completion:*' list-grouped yes
zstyle ':completion:*:descriptions' format '%F{240}%B%d%b%f'
typeset -ga DOTZSH_USED_COMMANDS
typeset -ga DOTZSH_ALL_COMMANDS
typeset -gA DOTZSH_USED_COMMAND_MAP
typeset -gA DOTZSH_ALL_COMMAND_MAP
typeset -g DOTZSH_USED_COMMANDS_INITIALIZED=0
typeset -g DOTZSH_ALL_COMMANDS_INITIALIZED=0
typeset -g DOTZSH_USED_COMMAND_LIMIT=120
_dotzsh_parse_history_line() {
local raw_line="$1"
local parsed_line="$raw_line"
case "$parsed_line" in
': '*';'*)
parsed_line="${parsed_line#*;}"
;;
esac
print -r -- "$parsed_line"
}
_dotzsh_extract_command_name() {
local line="$(_dotzsh_parse_history_line "$1")"
local command_name=""
local -a parts=()
local index=1
[ -n "$line" ] || return 1
[[ "$line" == '#'* ]] && return 1
parts=(${(z)line})
[ "${#parts[@]}" -gt 0 ] || return 1
while [ "$index" -le "${#parts[@]}" ]; do
command_name="${parts[$index]}"
case "$command_name" in
sudo|time|command|builtin|noglob|env)
((index++))
continue
;;
*=*)
((index++))
continue
;;
esac
break
done
[ -n "$command_name" ] || return 1
[[ "$command_name" == _* ]] && return 1
[[ "$command_name" =~ '^[A-Za-z0-9][A-Za-z0-9+._-]*$' ]] || return 1
print -r -- "$command_name"
}
_dotzsh_remember_command() {
local command_name="$1"
[ -n "$command_name" ] || return 0
DOTZSH_USED_COMMANDS=(${DOTZSH_USED_COMMANDS:#$command_name})
DOTZSH_USED_COMMANDS=("$command_name" "${DOTZSH_USED_COMMANDS[@]}")
DOTZSH_USED_COMMAND_MAP[$command_name]=1
}
_dotzsh_initialize_used_commands() {
local history_file="${HISTFILE:-$HOME/.zsh_history}"
local line=""
local command_name=""
[ "$DOTZSH_USED_COMMANDS_INITIALIZED" -eq 0 ] || return 0
DOTZSH_USED_COMMANDS=()
DOTZSH_USED_COMMAND_MAP=()
while IFS= read -r line; do
command_name="$(_dotzsh_extract_command_name "$line")" || continue
[[ -n ${DOTZSH_USED_COMMAND_MAP[$command_name]:-} ]] && continue
DOTZSH_USED_COMMANDS+=("$command_name")
DOTZSH_USED_COMMAND_MAP[$command_name]=1
[ "${#DOTZSH_USED_COMMANDS[@]}" -lt "$DOTZSH_USED_COMMAND_LIMIT" ] || break
done < <(
if [ -r "$history_file" ]; then
tac "$history_file" 2>/dev/null || tail -r "$history_file" 2>/dev/null || cat "$history_file"
else
fc -lnr 1 2>/dev/null
fi
)
DOTZSH_USED_COMMANDS_INITIALIZED=1
}
_dotzsh_initialize_all_commands() {
local command_name=""
[ "$DOTZSH_ALL_COMMANDS_INITIALIZED" -eq 0 ] || return 0
DOTZSH_ALL_COMMANDS=()
DOTZSH_ALL_COMMAND_MAP=()
for command_name in ${(k)aliases} ${(k)builtins} ${(k)commands} ${(k)functions}; do
[ -n "$command_name" ] || continue
[[ "$command_name" == _* ]] && continue
[[ -n ${DOTZSH_ALL_COMMAND_MAP[$command_name]:-} ]] && continue
DOTZSH_ALL_COMMANDS+=("$command_name")
DOTZSH_ALL_COMMAND_MAP[$command_name]=1
done
DOTZSH_ALL_COMMANDS_INITIALIZED=1
}
_dotzsh_record_command() {
local command_name=""
command_name="$(_dotzsh_extract_command_name "$1")" || return 0
_dotzsh_remember_command "$command_name"
}
_dotzsh_command_menu() {
local command_name=""
local -a other_commands=()
local -a filtered_used_commands=()
local -a used_display=()
local current_prefix="$PREFIX"
_dotzsh_initialize_used_commands
_dotzsh_initialize_all_commands
for command_name in "${DOTZSH_USED_COMMANDS[@]}"; do
[[ -n ${DOTZSH_ALL_COMMAND_MAP[$command_name]:-} ]] || continue
[ -z "$current_prefix" ] || [[ "$command_name" == ${~current_prefix}* ]] || continue
filtered_used_commands+=("$command_name")
used_display+=("* $command_name")
done
for command_name in "${DOTZSH_ALL_COMMANDS[@]}"; do
[[ -n ${DOTZSH_USED_COMMAND_MAP[$command_name]:-} ]] && continue
[ -z "$current_prefix" ] || [[ "$command_name" == ${~current_prefix}* ]] || continue
other_commands+=("$command_name")
done
[ "${#filtered_used_commands[@]}" -eq 0 ] || compadd -Q -U -o nosort -d used_display -- "${filtered_used_commands[@]}"
[ "${#other_commands[@]}" -eq 0 ] || compadd -Q -U -o nosort -- "${other_commands[@]}"
[ "${#filtered_used_commands[@]}" -gt 0 ] || [ "${#other_commands[@]}" -gt 0 ]
}
compdef _dotzsh_command_menu -command-
add-zsh-hook preexec _dotzsh_record_command
autoload -Uz _gvm _conda _go _node _npm _npx 2>/dev/null
compdef _gvm gvm
compdef _go go gofmt
compdef _conda conda
compdef _node node
compdef _npm npm
compdef _npx npx