# 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='' # Include event numbers (( ! ${+ZSH_FZF_HISTORY_SEARCH_EVENT_NUMBERS} )) && typeset -g ZSH_FZF_HISTORY_SEARCH_EVENT_NUMBERS=1 fzf_history_search() { setopt extendedglob FC_ARGS="-li" CANDIDATE_LEADING_FIELDS=4 if (( ! $ZSH_FZF_HISTORY_SEARCH_EVENT_NUMBERS )); then FC_ARGS+=" -n" CANDIDATE_LEADING_FIELDS=3 fi candidates=(${(f)"$(fc ${=FC_ARGS} -1 0 | fzf ${=ZSH_FZF_HISTORY_SEARCH_FZF_ARGS} ${=ZSH_FZF_HISTORY_SEARCH_FZF_EXTRA_ARGS} -q "$BUFFER")"}) local ret=$? if [ -n "$candidates" ]; then BUFFER="${candidates[@]/(#m)*/${${(As: :)MATCH}[${CANDIDATE_LEADING_FIELDS},-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