autoload -U add-zsh-hook
zmodload zsh/datetime 2>/dev/null
_zsh_autosuggest_strategy_atuin() {
suggestion=$(ATUIN_QUERY="$1" atuin search --cmd-only --author '$all-user' --limit 1 --search-mode prefix 2>/dev/null)
}
if [ -n "${ZSH_AUTOSUGGEST_STRATEGY:-}" ]; then
ZSH_AUTOSUGGEST_STRATEGY=("atuin" "${ZSH_AUTOSUGGEST_STRATEGY[@]}")
else
ZSH_AUTOSUGGEST_STRATEGY=("atuin")
fi
if [[ -z "${ATUIN_SESSION:-}" || "${ATUIN_SHLVL:-}" != "$SHLVL" ]]; then
export ATUIN_SESSION=$(atuin uuid)
export ATUIN_SHLVL=$SHLVL
fi
ATUIN_HISTORY_ID=""
if [[ -z ${__atuin_pty_proxy_owns_tty-} ]]; then
__atuin_pty_proxy_owns_tty=0
if [[ -n ${ATUIN_PTY_PROXY_ACTIVE-} ]]; then
if __atuin_pty_proxy_answer=$(atuin __internal pty-proxy-active 2>/dev/null) &&
[[ $__atuin_pty_proxy_answer = 1 ]]
then
__atuin_pty_proxy_owns_tty=1
fi
unset __atuin_pty_proxy_answer
fi
fi
__atuin_mark_output_start() {
[[ ${__atuin_pty_proxy_owns_tty-} = 1 ]] || return 0
if [[ -n ${__atuin_needs_osc133_reset-} ]]; then
unset -v __atuin_needs_osc133_reset
printf '\033]133;B\a'
fi
[[ -n "${ATUIN_HISTORY_ID:-}" ]] || return 0
if [[ ${ATUIN_PTY_PROXY_ACTIVE-} = 1 ]]; then
printf '\033]133;C\a'
else
printf '\033]18188735;C;%s\a' "$ATUIN_HISTORY_ID"
fi
}
__atuin_mark_output_end() {
[[ ${__atuin_pty_proxy_owns_tty-} = 1 ]] || return 0
[[ -n "${ATUIN_HISTORY_ID:-}" ]] || return 0
if [[ ${ATUIN_PTY_PROXY_ACTIVE-} = 1 ]]; then
printf '\033]133;D;%s;history_id=%s\a' "$1" "$ATUIN_HISTORY_ID"
else
printf '\033]18188735;D;%s\a' "$ATUIN_HISTORY_ID"
fi
}
_atuin_preexec() {
local id
id=$(ATUIN_SHELL=zsh atuin history start --hook -- "$1" 2>/dev/null)
export ATUIN_HISTORY_ID="$id"
__atuin_mark_output_start
__atuin_preexec_time=${EPOCHREALTIME-}
}
_atuin_precmd() {
local EXIT="$?" __atuin_precmd_time=${EPOCHREALTIME-}
[[ -z "${ATUIN_HISTORY_ID:-}" ]] && return 0
local duration=""
if [[ -n $__atuin_preexec_time && -n $__atuin_precmd_time ]]; then
printf -v duration %.0f $(((__atuin_precmd_time - __atuin_preexec_time) * 1000000000))
((duration < 0)) && duration=0
fi
__atuin_mark_output_end "$EXIT"
(atuin history end --hook --exit $EXIT ${duration:+--duration=$duration} -- $ATUIN_HISTORY_ID >/dev/null 2>&1 &)
export ATUIN_HISTORY_ID=""
}
setopt interactive_comments
_atuin_zshaddhistory() {
[[ -o interactive_comments ]] || return 0
local line=${1%$'\n'}
[[ $line == \#* && $line != *$'\n'* ]] || return 0
local id
id=$(ATUIN_SHELL=zsh atuin history start --hook -- "$line" 2>/dev/null)
[[ -n $id ]] && (atuin history end --hook --exit 0 --duration=0 -- "$id" >/dev/null 2>&1 &)
return 0
}
__atuin_tmux_popup_check() {
[[ -n "${TMUX-}" ]] || return 1
[[ "${ATUIN_TMUX_POPUP:-true}" != "false" ]] || return 1
local tmux_version
tmux_version=$(tmux -V 2>/dev/null | sed -n 's/^[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/p') [[ -z "$tmux_version" ]] && return 1
local m1 m2
m1=${tmux_version%%.*}
m2=${tmux_version#*.}
m2=${m2%%.*}
[[ "$m1" =~ ^[0-9]+$ ]] || return 1
[[ "$m2" =~ ^[0-9]+$ ]] || m2=0
(( m1 > 3 || (m1 == 3 && m2 >= 2) ))
}
__atuin_popup_tmpdir=""
__atuin_tmux_popup_cleanup() {
[[ -n "$__atuin_popup_tmpdir" && -d "$__atuin_popup_tmpdir" ]] && command rm -rf "$__atuin_popup_tmpdir"
__atuin_popup_tmpdir=""
}
__atuin_search_cmd() {
local -a search_args=("$@")
if __atuin_tmux_popup_check; then
__atuin_popup_tmpdir=$(mktemp -d) || return 1
local result_file="$__atuin_popup_tmpdir/result"
trap '__atuin_tmux_popup_cleanup' EXIT HUP INT TERM
local escaped_query escaped_args
escaped_query=$(printf '%s' "$BUFFER" | sed "s/'/'\\\\''/g")
escaped_args=""
for arg in "${search_args[@]}"; do
escaped_args+=" '$(printf '%s' "$arg" | sed "s/'/'\\\\''/g")'"
done
local cdir popup_width popup_height
cdir=$(pwd)
popup_width="${ATUIN_TMUX_POPUP_WIDTH:-80%}" popup_height="${ATUIN_TMUX_POPUP_HEIGHT:-60%}"
tmux display-popup -d "$cdir" -w "$popup_width" -h "$popup_height" -E -E -- \
sh -c "PATH='$PATH' ATUIN_SESSION='$ATUIN_SESSION' ATUIN_SHELL=zsh ATUIN_QUERY='$escaped_query' atuin search $escaped_args -i 2>'$result_file'"
if [[ -f "$result_file" ]]; then
cat "$result_file"
fi
__atuin_tmux_popup_cleanup
trap - EXIT HUP INT TERM
else
ATUIN_SHELL=zsh ATUIN_QUERY=$BUFFER atuin search "${search_args[@]}" -i 3>&1 1>&2 2>&3 3>&-
fi
}
_atuin_search() {
emulate -L zsh
zle -I
local output __atuin_status
output=$(__atuin_search_cmd $*)
__atuin_status=$?
zle reset-prompt
echo -n ${zle_bracketed_paste[1]} >/dev/tty
if (( __atuin_status != 0 )); then
[[ -n $output ]] && print -r -- "$output" >/dev/tty
return $__atuin_status
fi
if [[ -n $output ]]; then
RBUFFER=""
LBUFFER=$output
if [[ $LBUFFER == __atuin_accept__:* ]]
then
LBUFFER=${LBUFFER#__atuin_accept__:}
zle accept-line
fi
fi
}
_atuin_search_vicmd() {
_atuin_search --keymap-mode=vim-normal
}
_atuin_search_viins() {
_atuin_search --keymap-mode=vim-insert
}
_atuin_up_search() {
if [[ ! $BUFFER == *$'\n'* ]]; then
_atuin_search --shell-up-key-binding "$@"
else
zle up-line
fi
}
_atuin_up_search_vicmd() {
_atuin_up_search --keymap-mode=vim-normal
}
_atuin_up_search_viins() {
_atuin_up_search --keymap-mode=vim-insert
}
_atuin_ai_resume() {
emulate -L zsh
zle -I
local output __atuin_status
output=$(ATUIN_SHELL=zsh ATUIN_QUERY=$BUFFER atuin threads resume --shell-widget "$@" 3>&1 1>&2 2>&3 3>&-)
__atuin_status=$?
zle reset-prompt
echo -n ${zle_bracketed_paste[1]} >/dev/tty
if (( __atuin_status != 0 )); then
[[ -n $output ]] && print -r -- "$output" >/dev/tty
return $__atuin_status
fi
if [[ -n $output ]]; then
RBUFFER=""
LBUFFER=$output
if [[ $LBUFFER == __atuin_accept__:* ]]
then
LBUFFER=${LBUFFER#__atuin_accept__:}
zle accept-line
fi
fi
}
_atuin_ai_resume_vicmd() {
_atuin_ai_resume --keymap-mode=vim-normal
}
_atuin_ai_resume_viins() {
_atuin_ai_resume --keymap-mode=vim-insert
}
add-zsh-hook preexec _atuin_preexec
add-zsh-hook precmd _atuin_precmd
add-zsh-hook zshaddhistory _atuin_zshaddhistory
zle -N atuin-search _atuin_search
zle -N atuin-search-vicmd _atuin_search_vicmd
zle -N atuin-search-viins _atuin_search_viins
zle -N atuin-up-search _atuin_up_search
zle -N atuin-up-search-vicmd _atuin_up_search_vicmd
zle -N atuin-up-search-viins _atuin_up_search_viins
zle -N atuin-ai-resume _atuin_ai_resume
zle -N atuin-ai-resume-vicmd _atuin_ai_resume_vicmd
zle -N atuin-ai-resume-viins _atuin_ai_resume_viins
zle -N _atuin_search_widget _atuin_search
zle -N _atuin_up_search_widget _atuin_up_search
(ATUIN_SHELL=zsh atuin __internal prepare-search-index >/dev/null 2>&1 &)
if [[ ${__atuin_pty_proxy_owns_tty-} = 1 ]] && [[ ${ATUIN_PTY_PROXY_ACTIVE-} = 1 ]]; then
__atuin_needs_osc133_reset=1
fi