diff options
Diffstat (limited to 'dotfiles/system/.zsh/lib/-ftb-generate-complist')
| -rw-r--r-- | dotfiles/system/.zsh/lib/-ftb-generate-complist | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/dotfiles/system/.zsh/lib/-ftb-generate-complist b/dotfiles/system/.zsh/lib/-ftb-generate-complist new file mode 100644 index 0000000..42dd033 --- /dev/null +++ b/dotfiles/system/.zsh/lib/-ftb-generate-complist @@ -0,0 +1,113 @@ +#!/hint/zsh + +local dsuf dpre k _v filepath first_word show_group default_color prefix bs=$'\b' +local -a list_colors group_colors tcandidates reply match mbegin mend +local -i same_word=1 colorful=0 +local -Ua duplicate_groups=() +local -A word_map=() + +(( $#_ftb_compcap == 0 )) && return + +-ftb-zstyle -s show-group show_group || show_group=full +-ftb-zstyle -s default-color default_color || default_color=$'\x1b[37m' +-ftb-zstyle -s prefix prefix || { + zstyle -m ':completion:*:descriptions' format '*' && prefix='ยท' +} +-ftb-zstyle -a group-colors group_colors || group_colors=($_ftb_group_colors) +zstyle -a ":completion:$_ftb_curcontext" list-colors list_colors + +# init colorize +if (( $+builtins[fzf-tab-candidates-generate] )); then + fzf-tab-candidates-generate -i list_colors +else + local -A namecolors=(${(@s:=:)${(@s.:.)list_colors}:#[[:alpha:]][[:alpha:]]=*}) + local -A modecolors=(${(@Ms:=:)${(@s.:.)list_colors}:#[[:alpha:]][[:alpha:]]=*}) + (( $#namecolors == 0 && $#modecolors == 0 )) && list_colors=() +fi + +if (( $#_ftb_groups == 1 )); then + -ftb-zstyle -m single-group prefix || prefix='' + -ftb-zstyle -m single-group color || group_colors=("$default_color") +fi + +if (( $+builtins[fzf-tab-candidates-generate] )); then + fzf-tab-candidates-generate +else + for k _v in "${(@ps:\2:)_ftb_compcap}"; do + local -A v=("${(@0)_v}") + [[ $v[word] == ${first_word:=$v[word]} ]] || same_word=0 + + # add character and color to describe the type of the files + dsuf='' dpre='' + if (( $+v[realdir] )); then + filepath=$v[realdir]${(Q)v[word]} + if [[ -d $filepath ]]; then + dsuf=/ + fi + # add color and resolve symlink if have list-colors + # detail: http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcomplist-Module + if (( $#list_colors )) && [[ -a $filepath || -L $filepath ]]; then + -ftb-colorize $filepath + colorful=1 + elif [[ -L $filepath ]]; then + dsuf=@ + fi + if [[ $options[list_types] == off ]]; then + dsuf='' + fi + fi + + # add color to description if they have group index + if (( $+v[group] )); then + local color=$group_colors[$v[group]] + # add a hidden group index at start of string to keep group order when sorting + # first group index is for builtin sort, sencond is for GNU sort + tcandidates+=$v[group]$'\b'$color$prefix$dpre$'\0'$v[group]$'\b'$k$'\0'$dsuf + else + tcandidates+=$default_color$dpre$'\0'$k$'\0'$dsuf + fi + + # check group with duplicate member + if [[ $show_group == brief ]]; then + if (( $+word_map[$v[word]] && $+v[group] )); then + duplicate_groups+=$v[group] # add this group + duplicate_groups+=$word_map[$v[word]] # add previous group + fi + word_map[$v[word]]=$v[group] + fi + done +fi + +(( same_word )) && tcandidates[2,-1]=() + +# sort and remove sort group or other index +zstyle -T ":completion:$_ftb_curcontext" sort +if (( $? != 1 )); then + if (( colorful )); then + # if enable list_colors, we should skip the first field + if [[ ${commands[sort]:A:t} != (|busybox*) ]]; then + # this is faster but doesn't work if `find` is from busybox + tcandidates=(${(f)"$(command sort -u -t '\0' -k 2 <<< ${(pj:\n:)tcandidates})"}) + else + # slower but portable + tcandidates=(${(@o)${(@)tcandidates:/(#b)([^$'\0']#)$'\0'(*)/$match[2]$'\0'$match[1]}}) + tcandidates=(${(@)tcandidates/(#b)(*)$'\0'([^$'\0']#)/$match[2]$'\0'$match[1]}) + fi + else + tcandidates=("${(@o)tcandidates}") + fi +fi +typeset -gUa _ftb_complist=("${(@)tcandidates//[0-9]#$bs}") + +# hide needless group +if (( $#_ftb_groups )); then + local i to_hide indexs=({1..$#_ftb_groups}) + case $show_group in + brief) to_hide=(${indexs:|duplicate_groups}) ;; + none) to_hide=($indexs) ;; + esac + for i in $to_hide; do + # NOTE: _ftb_groups is unique array + _ftb_groups[i]="__hide__$i" + done +fi |
