#! /usr/bin/env zsh # shellcheck disable=SC2034,SC2153,SC2086,SC2155 # Above line is because shellcheck doesn't support zsh, per # https://github.com/koalaman/shellcheck/wiki/SC1071, and the ignore: param in # ludeeus/action-shellcheck only supports _directories_, not _files_. So # instead, we manually add any error the shellcheck step finds in the file to # the above line ... if ! [[ $options[zle] = on ]]; then return 0 fi # Source this in your ~/.zshrc autoload -U add-zsh-hook zmodload zsh/datetime 2>/dev/null # If zsh-autosuggestions is installed, configure it to use Atuin's search. If # you'd like to override this, then add your config after the $(atuin init zsh) # in your .zshrc _zsh_autosuggest_strategy_atuin() { suggestion=$(ATUIN_QUERY="$1" atuin search --cmd-only --limit 1 --search-mode prefix) } if [ -n "${ZSH_AUTOSUGGEST_STRATEGY:-}" ]; then ZSH_AUTOSUGGEST_STRATEGY=("atuin" "${ZSH_AUTOSUGGEST_STRATEGY[@]}") else ZSH_AUTOSUGGEST_STRATEGY=("atuin") fi export ATUIN_SESSION=$(atuin uuid) ATUIN_HISTORY_ID="" _atuin_preexec() { local id id=$(atuin history start -- "$1") 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_search() { emulate -L zsh zle -I # swap stderr and stdout, so that the tui stuff works # TODO: not this local output # shellcheck disable=SC2048 output=$(ATUIN_SHELL_ZSH=t ATUIN_LOG=error ATUIN_QUERY=$BUFFER atuin search $* -i 3>&1 1>&2 2>&3) zle reset-prompt 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() { # Only trigger if the buffer is a single line 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 # These are compatibility widget names for "atuin <= 17.2.1" users. zle -N _atuin_search_widget _atuin_search zle -N _atuin_up_search_widget _atuin_up_search bindkey -M emacs '^r' atuin-search bindkey -M viins '^r' atuin-search-viins bindkey -M vicmd '/' atuin-search bindkey -M emacs '^[[A' atuin-up-search bindkey -M vicmd '^[[A' atuin-up-search-vicmd bindkey -M viins '^[[A' atuin-up-search-viins bindkey -M emacs '^[OA' atuin-up-search bindkey -M vicmd '^[OA' atuin-up-search-vicmd bindkey -M viins '^[OA' atuin-up-search-viins bindkey -M vicmd 'k' atuin-up-search-vicmd # vim: ft=zsh