if [[ -f "./target/release/slick" ]]; then
SLICK_PATH="${PWD}/target/release/slick"
elif [[ -f "$HOME/.cargo/bin/slick" ]]; then
SLICK_PATH="$HOME/.cargo/bin/slick"
else
echo "Error: slick binary not found" >&2
return 1
fi
autoload -Uz add-zsh-hook
add-zsh-hook -D precmd slick_prompt_precmd
add-zsh-hook -D preexec slick_prompt_preexec
zmodload zsh/datetime
add-zsh-hook precmd slick_prompt_precmd
add-zsh-hook preexec slick_prompt_preexec
zle -N zle-keymap-select
zle -N zle-line-init
typeset -g slick_prompt_data
typeset -g slick_prompt_fd
typeset -g slick_prompt_timestamp
typeset -g slick_prompt_elapsed
function slick_prompt_refresh {
local exit_status=$?
local line
if read -r -u $1 line; then
slick_prompt_data="$line"
if [[ -n "$slick_prompt_elapsed" ]]; then
PROMPT=$($SLICK_PATH prompt -k "$KEYMAP" -r $exit_status -d ${slick_prompt_data:-""} -e $slick_prompt_elapsed)
else
PROMPT=$($SLICK_PATH prompt -k "$KEYMAP" -r $exit_status -d ${slick_prompt_data:-""})
fi
zle && zle reset-prompt
return fi
unset slick_prompt_timestamp
unset slick_prompt_elapsed
zle -F $1
exec {1}<&-
if [[ "$1" == "$slick_prompt_fd" ]]; then
unset slick_prompt_fd
fi
}
function zle-line-init zle-keymap-select {
PROMPT=$($SLICK_PATH prompt -k "$KEYMAP" -d ${slick_prompt_data:-""})
zle && zle reset-prompt
}
function slick_prompt_precmd() {
slick_prompt_data=""
if [[ -n "$slick_prompt_fd" ]]; then
zle -F $slick_prompt_fd
exec {slick_prompt_fd}<&-
unset slick_prompt_fd
fi
if [[ -n "$slick_prompt_timestamp" ]]; then
slick_prompt_elapsed=$(( $EPOCHSECONDS - $slick_prompt_timestamp ))
[[ $slick_prompt_elapsed -lt 0 ]] && slick_prompt_elapsed=0
else
unset slick_prompt_elapsed
fi
exec {slick_prompt_fd}< <($SLICK_PATH precmd)
zle -F $slick_prompt_fd slick_prompt_refresh
}
function slick_prompt_preexec() {
if [[ -n "$slick_prompt_fd" ]]; then
zle -F $slick_prompt_fd
exec {slick_prompt_fd}<&-
unset slick_prompt_fd
fi
slick_prompt_timestamp=$EPOCHSECONDS
echo -ne "\e[4 q"
}
echo "slick prompt loaded (2-phase: instant [user path branch] + async [git status])"