#!/usr/bin/env zsh () { eval "$_z4h_opt" local -i list_types [[ $1 == on ]] && list_types=1 typeset -ga _z4h_naturals if (( $#_z4h_naturals < $#_z4h_words )); then _z4h_naturals+=({$(($#_z4h_naturals+1))..$#_z4h_words}) fi local -A seen local -a indices local word idx for word idx in "${(@)_z4h_words:^_z4h_naturals}"; do if (( ! ${+seen[$word]} )); then seen[$word]=1 indices+=($idx) fi done -z4h-set-list-colors "$_z4h_curcontext" "$list_types" local -i list_colors=$((!$?)) zstyle -t :completion:${_z4h_curcontext}:default sort local -i sort=$((!$?)) autoload +X -Uz -- -z4h-cursor-show -z4h-fzf local -i pct=60 (( _z4h_can_save_restore_screen )) && pct=100 local -i height=$(( 100 * ($#indices + 4) < pct * LINES ? $#indices + 4 : pct * LINES / 100 )) (( height >= 6 )) || (( height = 6 )) (( height <= LINES - 1 )) || (( height = LINES - 1 )) local opts=( --query=${_z4h_word_prefix:+"^$_z4h_word_prefix"} --color=hl:201,hl+:201 --with-nth=2 --delimiter='\000' --ansi --exact --no-mouse --tiebreak=length,begin,index --multi --cycle --border=horizontal ) local cursor_y cursor_x -z4h-get-cursor-pos || return if (( _z4h_can_save_restore_screen )); then opts+=(--no-clear) if { (( height <= cursor_y - 1 )) && zstyle -T :z4h: prompt-at-bottom } || (( cursor_y - 1 > LINES - cursor_y && cursor_y - 1 > 6 )) && { (( height > LINES - cursor_y )) || zstyle -T :z4h: prompt-at-bottom }; then (( height <= cursor_y - 1 )) || (( height = cursor_y - 1 )) local move=$'\e[0m\e['$((cursor_y-height))';1H' opts+=(--layout=default) elif (( LINES - cursor_y > 6 )); then (( height <= LINES - cursor_y )) || (( height = LINES - cursor_y )) local move=$'\e[0m\n\r' opts+=(--layout=reverse) else local -i extra=$((height - LINES + cursor_y)) print -rnu $_z4h_tty_fd -- ${(pl:$height::\n:)} || return (( cursor_y += LINES - cursor_y - height )) local move=$'\e[0m\e['$((cursor_y+1))';1H' opts+=(--layout=reverse) fi local _z4h_saved_screen -z4h-save-screen || return else print >&$_z4h_tty_fd || return local move= opts+=(--layout=reverse) fi opts+=(--height=$height) { local choice choice="$( unsetopt pipe_fail exec 2>/dev/null { # TODO: colorize files. if (( sort )); then local rows=() for idx in $indices; do rows+=($_z4h_descrs[idx]$'\0'$idx) done printf '%2$s\0%1$s\n' "${(@0)${(@o)rows}}" else for idx in $indices; do printf '%s\0%s\n' $idx "$_z4h_descrs[idx]" done fi } | { print -rnu $_z4h_tty_fd -- $move -z4h-cursor-show 2>&$_z4h_tty_fd -z4h-fzf $opts } )" } always { -z4h-cursor-hide if (( _z4h_can_save_restore_screen )); then -z4h-restore-screen print -rn -- $'\e[0m\e['$cursor_y';'$cursor_x'H' else builtin echoti cuu 1 (( cursor_x > 1 )) && builtin echoti cuf $((cursor_x-1)) fi } [[ -n $choice ]] || return choice=("${(@f)choice}") typeset -g _z4h_reply=(0 ${${choice:1}%$'\0'*}) [[ -z $choice[1] ]] || _z4h_reply[1]=1 } "${options[list_types]}"