autoload -U add-zsh-hook
zmodload zsh/datetime 2>/dev/null
_zsh_autosuggest_strategy_atuin() {
suggestion=$(ATUIN_QUERY="$1" atuin search --cmd-only --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=""
_atuin_preexec() {
local id
id=$(atuin history start -- "$1" 2>/dev/null)
export ATUIN_HISTORY_ID="$id"
__atuin_preexec_time=${EPOCHREALTIME-}
}
_atuin_precmd() {
local EXIT="$?" __atuin_precmd_time=${EPOCHREALTIME-}
[[ -z "${ATUIN_HISTORY_ID:-}" ]] && return
local duration=""
if [[ -n $__atuin_preexec_time && -n $__atuin_precmd_time ]]; then
printf -v duration %.0f $(((__atuin_precmd_time - __atuin_preexec_time) * 1000000000))
fi
(ATUIN_LOG=error atuin history end --exit $EXIT ${duration:+--duration=$duration} -- $ATUIN_HISTORY_ID &) >/dev/null 2>&1
export ATUIN_HISTORY_ID=""
}
__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_LOG=error 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_LOG=error ATUIN_QUERY=$BUFFER atuin search "${search_args[@]}" -i 3>&1 1>&2 2>&3
fi
}
_atuin_search() {
emulate -L zsh
zle -I
local output
output=$(__atuin_search_cmd $*)
zle reset-prompt
echo -n ${zle_bracketed_paste[1]} >/dev/tty
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
}
add-zsh-hook preexec _atuin_preexec
add-zsh-hook precmd _atuin_precmd
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_search_widget _atuin_search
zle -N _atuin_up_search_widget _atuin_up_search