Files
zsh-fzf-history-search/zsh-fzf-history-search.zsh
Javi Merino 76c6588204 Add an option to remove dates from search
Let the user decide if they want full date timestamps in ISO8601
format in the search.
2022-05-12 07:01:53 +01:00

63 lines
1.7 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'
# 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
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
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