# do nothing if fzf is not installed (( ! $+commands[fzf] )) && return # Bind for fzf history search (( ! ${+ZSH_FZF_HISTORY_SEARCH_BIND} )) && typeset -g ZSH_FZF_HISTORY_SEARCH_BIND='^r' # Args for fzf (( ! ${+ZSH_FZF_HISTORY_SEARCH_FZF_ARGS} )) && typeset -g ZSH_FZF_HISTORY_SEARCH_FZF_ARGS='+s +m -x -e' # Extra args for fzf (( ! ${+ZSH_FZF_HISTORY_SEARCH_FZF_EXTRA_ARGS} )) && typeset -g ZSH_FZF_HISTORY_SEARCH_FZF_EXTRA_ARGS='' # Cursor to end-of-line (( ! ${+ZSH_FZF_HISTORY_SEARCH_END_OF_LINE} )) && typeset -g ZSH_FZF_HISTORY_SEARCH_END_OF_LINE='' fzf_history_search() { setopt extendedglob candidates=(${(f)"$(fc -li -1 0 | fzf $(echo $ZSH_FZF_HISTORY_SEARCH_FZF_ARGS) $(echo $ZSH_FZF_HISTORY_SEARCH_FZF_EXTRA_ARGS) -q "$BUFFER")"}) local ret=$? if [ -n "$candidates" ]; then BUFFER="${candidates[@]/(#m)*/${${(As: :)MATCH}[4,-1]}}" BUFFER="${BUFFER[@]/(#b)(?)\\n/$match[1] }" zle vi-fetch-history -n $BUFFER if [ -n "${ZSH_FZF_HISTORY_SEARCH_END_OF_LINE}" ]; then zle end-of-line fi fi zle reset-prompt return $ret } autoload fzf_history_search zle -N fzf_history_search bindkey $ZSH_FZF_HISTORY_SEARCH_BIND fzf_history_search