92 lines
2.8 KiB
Bash
92 lines
2.8 KiB
Bash
# 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 --preview-window=hidden'
|
|
|
|
# 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
|
|
|
|
# Include full date timestamps in ISO8601 `yyyy-mm-dd hh:mm' format
|
|
(( ! ${+ZSH_FZF_HISTORY_SEARCH_DATES_IN_SEARCH} )) &&
|
|
typeset -g ZSH_FZF_HISTORY_SEARCH_DATES_IN_SEARCH=1
|
|
|
|
# Remove duplicate entries in history
|
|
(( ! ${+ZSH_FZF_HISTORY_SEARCH_REMOVE_DUPLICATES} )) &&
|
|
typeset -g ZSH_FZF_HISTORY_SEARCH_REMOVE_DUPLICATES=''
|
|
|
|
# Define fzf query, when $BUFFER is not empty
|
|
(( ! ${+ZSH_FZF_HISTORY_SEARCH_FZF_QUERY_PREFIX} )) &&
|
|
typeset -g ZSH_FZF_HISTORY_SEARCH_FZF_QUERY_PREFIX=''
|
|
|
|
fzf_history_search() {
|
|
setopt extendedglob
|
|
|
|
FC_ARGS="-l"
|
|
CANDIDATE_LEADING_FIELDS=2
|
|
|
|
if (( ! $ZSH_FZF_HISTORY_SEARCH_EVENT_NUMBERS )); then
|
|
FC_ARGS+=" -n"
|
|
((CANDIDATE_LEADING_FIELDS--))
|
|
fi
|
|
|
|
if (( $ZSH_FZF_HISTORY_SEARCH_DATES_IN_SEARCH )); then
|
|
FC_ARGS+=" -i"
|
|
((CANDIDATE_LEADING_FIELDS+=2))
|
|
fi
|
|
|
|
history_cmd="fc ${=FC_ARGS} -1 0"
|
|
|
|
if [ -n "${ZSH_FZF_HISTORY_SEARCH_REMOVE_DUPLICATES}" ];then
|
|
if (( $+commands[awk] )); then
|
|
history_cmd="$history_cmd | awk '!seen[\$0]++'"
|
|
else
|
|
# In case awk is not installed fallback to uniq. It will only remove commands that are repeated consecutively.
|
|
history_cmd="$history_cmd | uniq"
|
|
fi
|
|
fi
|
|
|
|
if (( $#BUFFER )); then
|
|
candidates=(${(f)"$(eval $history_cmd | fzf ${=ZSH_FZF_HISTORY_SEARCH_FZF_ARGS} ${=ZSH_FZF_HISTORY_SEARCH_FZF_EXTRA_ARGS} -q "${=ZSH_FZF_HISTORY_SEARCH_FZF_QUERY_PREFIX}$BUFFER")"})
|
|
else
|
|
candidates=(${(f)"$(eval $history_cmd | fzf ${=ZSH_FZF_HISTORY_SEARCH_FZF_ARGS} ${=ZSH_FZF_HISTORY_SEARCH_FZF_EXTRA_ARGS})"})
|
|
fi
|
|
|
|
local ret=$?
|
|
if [ -n "$candidates" ]; then
|
|
if (( $CANDIDATE_LEADING_FIELDS != 1 )); then
|
|
BUFFER="${candidates[@]/(#m)[0-9 \-\:\*]##/$(
|
|
printf '%s' "${${(As: :)MATCH}[${CANDIDATE_LEADING_FIELDS},-1]}" | sed 's/%/%%/g'
|
|
)}"
|
|
else
|
|
BUFFER="${(j| && |)candidates}"
|
|
fi
|
|
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
|