Test de LS_COLORS dans zsh


10

Il y a quelques années, j'ai trouvé un extrait de code intéressant qui imprime chaque type de fichier dans sa couleur correspondante en fonction des couleurs définies dans LS_COLORS. Malheureusement, je ne me souviens plus du lien.

Voici l'extrait test_colors.shen question

eval $(echo "no:global default;fi:normal file;di:directory;ln:symbolic link;pi:named pipe;so:socket;do:door;bd:block device;cd:character device;or:orphan symlink;mi:missing file;su:set uid;sg:set gid;tw:sticky other writable;ow:other w\
ritable;st:sticky;ex:executable;"|sed -e 's/:/="/g; s/\;/"\n/g')                                                                                                                                                                            
{                                                                                                                                                                                                                                           
  IFS=:                                                                                                                                                                                                                                     
  for i in $LS_COLORS                                                                                                                                                                                                                       
  do                                                                                                                                                                                                                                        
    echo -e "\e[${i#*=}m$( x=${i%=*}; [ "${!x}" ] && echo "${!x}" || echo "$x" )\e[m"                                                                                                                                                       
  done                                                                                                                                                                                                                                      
}   

L'extrait fonctionne très bien dans bash, mais pas dans zsh, et je ne peux pas dire pourquoi. Lorsque je l'exécute, zshj'obtiens l'erreur suivante:

> sh .test_colors.sh
.eval_colors:1: * not found
[00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.flac=01;35:*.mp3=01;35:*.mpc=01;35:*.ogg=01;35:*.wav=01;35:m

Mise à jour (1er novembre 2011)

J'ai testé le script de @ Stéphane Gimenez ci-dessous. J'ai remarqué que certains personnages ne semblent pas s'échapper correctement. Des pensées pourquoi?

Réponse: Voir les commentaires sur la réponse de @ Stéphane Gimenez.

                                                      entrez la description de l'image ici

Réponses:


7

La même chose écrite pour zsh d'une manière beaucoup plus propre:

#!/bin/zsh

typeset -A names
names[no]="global default"
names[fi]="normal file"
names[di]="directory"
names[ln]="symbolic link"
names[pi]="named pipe"
names[so]="socket"
names[do]="door"
names[bd]="block device"
names[cd]="character device"
names[or]="orphan symlink"
names[mi]="missing file"
names[su]="set uid"
names[sg]="set gid"
names[tw]="sticky other writable"
names[ow]="other writable"
names[st]="sticky"
names[ex]="executable"

for i in ${(s.:.)LS_COLORS}
do
    key=${i%\=*}
    color=${i#*\=}
    name=${names[(e)$key]-$key}
    printf '\e[%sm%s\e[m\n' $color $name
done

Vous voudrez peut-être le remplacer \npar un espace à la fin du printfpour la compacité peut-être.
Stéphane Gimenez

Merci @ Stéphane Gimenez. J'ai mis à jour mon OP avec un problème que j'obtiens lors de l'impression de certains caractères à l'aide de votre script. Je ne sais pas si cela est strictement lié à votre script (il peut s'agir de mon propre terminal?)
Amelio Vazquez-Reina

1
@intrpc: fonctionnant zshcomme shvous utilisez un mode de compatibilité. Appelez votre script en tant que zsh ./test_color_schemeou ajoutez des guillemets doubles autour de $coloret $name.
Stéphane Gimenez

@ Stéphane Gimenez: J'ai été dirigé ici à partir de ma question connexe ici: unix.stackexchange.com/questions/52659/… . Votre extension des abréviations est très utile. J'ai trois abréviations, rs, caet mhqui ne figurent pas ci - dessus. Pouvez-vous me dire où trouver leurs extensions? Merci.
chandra

Interprété à partir de dircolors -p rs = reset, ca = capacité, mh = multi-hard_link
weldabar

3

Vous devez échapper à =in ${i%=*}car sinon le modèle de suffixe =*subit une =expansion , il =est donc interprété comme un nom de commande. C'est la cause de l' * not founderreur.

Zsh ne divise pas les mots sur les substitutions de variables par défaut, il se $LS_COLORSdéveloppe donc en un seul mot. Pour que la forboucle fonctionne sur les parties séparées par deux-points de $LS_COLORS, utilisez for i in $=LS_COLORS. Ou plus idiomatiques en zsh, ne pas utiliser IFSmais préciser explicitement comment diviser: for i in ${(s.:.)LS_COLORS}.

La syntaxe ${!x}qui signifie «la valeur de la variable dont le nom est $x» est spécifique à bash. Zsh a une construction équivalente, le P drapeau d'extension de paramètres : ${(P)x}.


1
Il y a deux autres raisons pour lesquelles ce script ne fonctionne pas dans zsh. Pas de séparation automatique des mots LS_COLORSet =doit être échappé dans les modèles de substitution.
Stéphane Gimenez

@ StéphaneGimenez Vous avez raison, merci, je ne sais que là où bash n'est pas standard mais ce sont deux fonctionnalités zsh non standard qui doivent également être traitées. Vous devriez développer votre réponse pour avoir toutes les explications, puis je pourrai supprimer la mienne.
Gilles 'SO- arrête d'être méchant'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.