summaryrefslogtreecommitdiff
path: root/dotfiles/system/.zsh/lib/-ftb-generate-complist
diff options
context:
space:
mode:
Diffstat (limited to 'dotfiles/system/.zsh/lib/-ftb-generate-complist')
-rw-r--r--dotfiles/system/.zsh/lib/-ftb-generate-complist113
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