41 lines
1.3 KiB
Plaintext
41 lines
1.3 KiB
Plaintext
|
#!/hint/zsh
|
||
|
|
||
|
if zmodload -s zsh/pcre; then
|
||
|
setopt localoptions rematch_pcre
|
||
|
fi
|
||
|
|
||
|
local key qtype tmp query_string
|
||
|
typeset -g _ftb_query=
|
||
|
-ftb-zstyle -a query-string query_string || query_string=(prefix input first)
|
||
|
for qtype in $query_string; do
|
||
|
if [[ $qtype == prefix ]]; then
|
||
|
# find the longest common prefix among descriptions
|
||
|
local -a keys=(${_ftb_compcap%$'\2'*})
|
||
|
tmp=$keys[1]
|
||
|
local MATCH match mbegin mend prefix=(${(s::)tmp})
|
||
|
for key in ${keys:1}; do
|
||
|
(( $#tmp )) || break
|
||
|
[[ $key == $tmp* ]] && continue
|
||
|
# interpose characters from the current common prefix and $key and see how
|
||
|
# many pairs of equal characters we get at the start of the resulting string
|
||
|
[[ ${(j::)${${(s::)key[1,$#tmp]}:^prefix}} =~ '^(((.)\3)*)' ]]
|
||
|
# truncate common prefix and maintain loop invariant: ${(s::)tmp} == $prefix
|
||
|
tmp[$#MATCH/2+1,-1]=""
|
||
|
prefix[$#MATCH/2+1,-1]=()
|
||
|
done
|
||
|
elif [[ $qtype == input ]]; then
|
||
|
local fv=${_ftb_compcap[1]#*$'\2'}
|
||
|
local -A v=("${(@0)fv}")
|
||
|
tmp=$v[PREFIX]
|
||
|
if (( $RBUFFER[(i)$v[SUFFIX]] != 1 )); then
|
||
|
tmp=${tmp/%$v[SUFFIX]}
|
||
|
fi
|
||
|
tmp=${${tmp#$v[hpre]}#$v[apre]}
|
||
|
fi
|
||
|
if (( $query_string[(I)longest] )); then
|
||
|
(( $#tmp > $#_ftb_query )) && _ftb_query=$tmp
|
||
|
elif [[ -n $tmp ]]; then
|
||
|
_ftb_query=$tmp && break
|
||
|
fi
|
||
|
done
|