[Pkg-zsh-devel] Bug#613162: zsh: Loading colors script fails, bad set of key/value pairs

Frank Terbeck ft at bewatermyfriend.org
Sun Feb 13 17:12:29 UTC 2011


Benjamin Peter wrote:
[...]
> (%:~)- (set -x; colors;) 2>&1 | cat -v
> +/bin/zsh:3> colors
> +colors:4> typeset -Ag color colour
> +colors:6> color=( 00 none 01 bold 02 faint 22 normal 03 standout 23
> no-standout 04 underline 24 no-underline 05 blink 25 no-blink 07
> reverse 27 no-reverse 08 conceal 28 no-conceal 30 black 40 bg-black 31
> red 41 bg-red 32 green 42 bg-green 33 yellow 43 bg-yellow 34 blue 44
> bg-blue 35 magenta 45 bg-magenta 36 cyan 46 bg-cyan 37 white 47
> bg-white 39 default 49 bg-default )

Initialisation looks good.

> +colors:74> local k
> +colors:75> k=bg-blue
> +colors:75> color[${color[$k]}]=bg-blue

This looks wrong already. The actual code is this:

for k in ${(k)color}; do
    color[${color[$k]}]=$k
done

So this should iterate over all keys in `$color'. Those should be 00,
01, 02, etc. And not even "bg-blue", which is the *value* to the key 44.

> +colors:79> k=30
> +colors:79> color[fg-${color[$k]}]=30
> +colors:79> k=31
> +colors:79> color[fg-${color[$k]}]=31
> +colors:79> k=32
> +colors:79> color[fg-${color[$k]}]=32
> +colors:79> k=33
> +colors:79> color[fg-${color[$k]}]=33
> +colors:79> k=34
> +colors:79> color[fg-${color[$k]}]=34
> +colors:79> k=35
> +colors:79> color[fg-${color[$k]}]=35
> +colors:79> k=36
> +colors:79> color[fg-${color[$k]}]=36
> +colors:79> k=37
> +colors:79> color[fg-${color[$k]}]=37
> +colors:79> k=39
> +colors:79> color[fg-${color[$k]}]=39

This is this loop:

for k in ${color[(I)3?]}; do
    color[fg-${color[$k]}]=$k
done

Looks good.

> +colors:83> color[grey]=''
> +colors:84> color[fg-grey]=''
> +colors:85> color[bg-grey]=''

Just a few assignments.

After this, the colours= assignment follows, which is missing in here as
expected, since you commented to out..

> +colors:95> local 'lc=^[[' 'rc=m'
> +colors:97> typeset -Hg reset_color bold_color
> +colors:98> reset_color='^[[m'
> +colors:99> bold_color='^[[m'
> +colors:103> typeset -AHg fg fg_bold fg_no_bold

A few more assignments.

[...]

What follows is the construction of the `$fg[]' and `$bg[]' associative
arrays (and friends). It looks correct but a little short, which I blame
on the first loop from above screwing up.

My suspicion is that this is an effect of an option. Could it be, that
you're setting the `ksharrays' option? I strongly suspect that you do.

[[ -o ksharrays ]] && print option set || print option unset

If you do, a workaround would be to set the ksharrays option *after*
you're running the `colors' function.

A fix would be to either locally unset the `ksharrays' option in this
function, or to use an array expansion, that works independently of this
particular setting. Could you try if this patch fixes the issue even if
`ksharrays' is set?


diff --git a/Functions/Misc/colors b/Functions/Misc/colors
index bef93c8..dfa169a 100644
--- a/Functions/Misc/colors
+++ b/Functions/Misc/colors
@@ -72,7 +72,7 @@ color=(
 # but it's clearer to include them all both ways.
 
 local k
-for k in ${(k)color}; do color[${color[$k]}]=$k; done
+for k in "${(k)color[@]}"; do color[${color[$k]}]=$k; done
 
 # Add "fg-" keys for all the text colors, for clarity.
 
@@ -86,7 +86,7 @@ color[bg-grey]=${color[bg-black]}
 
 # Assistance for the color-blind.
 
-colour=(${(kv)color})	# A case where ksh namerefs would be useful ...
+colour=( "${(kv)color[@]}" )	# A case where ksh namerefs would be useful ...
 
 # The following are terminal escape sequences used by colored prompt themes.
 


I think that should fix the issue. However, the simpler fix is to just
say this in the first line of code in the `colors' file:

    setopt localoption no_ksharrays

If you could verify my suspicion, that'd be swell.

Regards, Frank






More information about the Pkg-zsh-devel mailing list