From 6cba7534cf6f8b1aaf9d1051c95f3e59386debaa Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Mon, 10 Nov 2025 09:36:53 +0000 Subject: [PATCH] feat(zsh): add atuin+fzf for enhanced command history --- config/mise/config.toml | 1 + zsh/atuin.zsh | 62 +++++++++++++++++++++++++++++++++++++++++ zshrc | 1 + 3 files changed, 64 insertions(+) create mode 100644 zsh/atuin.zsh diff --git a/config/mise/config.toml b/config/mise/config.toml index a94ef2d..6dcc212 100644 --- a/config/mise/config.toml +++ b/config/mise/config.toml @@ -89,6 +89,7 @@ ruby_install = true actionlint = "latest" argo-rollouts = "latest" argocd = "latest" +atuin = "latest" aws-cli = "latest" bat = "latest" bat-extras = "latest" diff --git a/zsh/atuin.zsh b/zsh/atuin.zsh new file mode 100644 index 0000000..6a67439 --- /dev/null +++ b/zsh/atuin.zsh @@ -0,0 +1,62 @@ +# +# atuin +# + +if command-exists atuin; then + # Atuin + FZF integration, stolen/adapted from: + # - https://github.com/atuinsh/atuin/issues/68 + atuin-setup() { + if ! which atuin &>/dev/null; then return 1; fi + bindkey '^E' _atuin_search_widget + + export ATUIN_NOBIND="true" + eval "$(atuin init zsh)" + + zle -N fzf-atuin-history-widget + bindkey '^R' fzf-atuin-history-widget + } + + fzf-atuin-history-widget() { + local selected num + setopt localoptions noglobsubst noposixbuiltins pipefail no_aliases 2>/dev/null + + # local atuin_opts="--cmd-only --limit ${ATUIN_LIMIT:-5000}" + local atuin_opts="--cmd-only" + local fzf_opts=( + # from $FZF_DEFAULT_OPTS + --bind=ctrl-k:kill-line + --bind=ctrl-v:half-page-down + --bind=alt-v:half-page-up + --tabstop=4 + --highlight-line + + # from $FZF_CTRL_R_OPTS + --tmux=75% + --border=rounded + "--preview=echo {}" + --preview-window=down:3:hidden:wrap + "--bind=ctrl-/:toggle-preview" + "--bind=ctrl-y:execute-silent(echo -n {2..} | pbcopy)+abort" + + --tac + "-n2..,.." + --tiebreak=index + "--query=${LBUFFER}" + "+m" + "--bind=ctrl-r:reload(atuin search $atuin_opts)" + ) + + selected=$(atuin search ${atuin_opts} | fzf "${fzf_opts[@]}") + local ret=$? + if [ -n "$selected" ]; then + # the += lets it insert at current pos instead of replacing + LBUFFER+="${selected}" + fi + + zle reset-prompt + return $ret + } + + atuin-setup + setup-completions atuin "$(mise-which atuin)" atuin gen-completions --shell zsh +fi diff --git a/zshrc b/zshrc index e2ef82a..be19962 100644 --- a/zshrc +++ b/zshrc @@ -309,6 +309,7 @@ if [[ "$OSTYPE" == "linux"* ]]; then source "$DOTZSH/linux.zsh"; fi # Utils source "$DOTZSH/1password.zsh" source "$DOTZSH/ansi.zsh" +source "$DOTZSH/atuin.zsh" source "$DOTZSH/copilot.zsh" source "$DOTZSH/emacs.zsh" source "$DOTZSH/cursor.zsh"