foxshell/fn/-z4h-set-list-colors
2025-07-04 11:48:40 -05:00

57 lines
2.2 KiB
Bash

#!/usr/bin/env zsh
eval "$_z4h_opt"
setopt octalzeroes
local curcontext=$1
local list_types=$2
local -a list_colors
zstyle -a :completion:$curcontext:default list-colors list_colors || return
(( $#list_colors )) || return
if [[ ${list_types}${(pj:\0:)list_colors} != $_z4h_last_list_colors ]]; then
# This takes ~20ms. Can be easily optimized.
typeset -g _z4h_last_list_colors=${list_types}${(pj:\0:)list_colors}
typeset -gA _z4h_name_colors=(${(@s:=:)${(@s.:.)list_colors}:#[[:alpha:]][[:alpha:]]=*})
typeset -gA _z4h_mode_colors=(${(@Ms:=:)${(@s.:.)list_colors}:#[[:alpha:]][[:alpha:]]=*})
typeset -gA _z4h_mode_codes=()
() {
local -i8 a b c d
local -a codes
local suf
for a in 0140000 0120000 0100000 0060000 0040000 0020000 0010000; do
for b in 0 02000 04000 06000; do
for c in 0 01000 00002 01002; do
for d in 0 0001 0010 0011 0100 0101 0110 0111; do
suf=
codes=()
if (( a == 0120000 )); then
_z4h_mode_codes[$((a|b|c|d))]=$'@\0.'
continue
fi
if (( a == 0100000 )); then
(( d )) && suf='*'
else
if (( a == 0140000 )); then codes+=($_z4h_mode_colors[so]); suf='=';
elif (( a == 0060000 )); then codes+=($_z4h_mode_colors[bd]); suf='' ;
elif (( a == 0040000 )); then codes+=($_z4h_mode_colors[di]); suf='/';
elif (( a == 0020000 )); then codes+=($_z4h_mode_colors[cd]); suf='' ;
elif (( a == 0010000 )); then codes+=($_z4h_mode_colors[pi]); suf='|'; fi
if (( c == 01000 )); then codes+=($_z4h_mode_colors[st]);
elif (( c == 00002 )); then codes+=($_z4h_mode_colors[ow]);
elif (( c == 01002 )); then codes+=($_z4h_mode_colors[tw]); fi
fi
(( b & 04000 )) && codes+=($modecolors[su])
(( b & 02000 )) && codes+=($modecolors[sg])
(( $#codes || a != 0100000 || !d )) || codes+=($_z4h_mode_colors[ex])
(( list_types )) || suf=
_z4h_mode_codes[$((a|b|c|d))]=$suf$'\0'${(j:;:)codes}
done
done
done
done
}
fi
return 0