2009-10-26 26 views
1

En utilisant des séquences terminales, je peux colorer le texte dans un émulateur de terminal:Peut-on mettre en surbrillance des caractères de tabulation dans le terminal?

$ echo -e '\e[37;41m--this is white on red--\e[0m' 

Et cela fonctionne.

suivant imprime un rectangle rouge, à savoir des espaces ont un fond rouge et un premier plan vide:

$ echo -e '\e[37;41m  \e[0m ' 

Mais les impressions suivantes deux rectangles rouges séparés par un onglet:

$ echo -e '\e[37;41m \t \e[0m ' 

Ce est, le caractère de tabulation ne reçoit pas la mise en évidence de fond rouge. Il prend la couleur de fond du terminal par défaut. Pourquoi les onglets ne sont-ils pas mis en surbrillance comme de l'espace? Puis-je forcer cela d'une autre manière?

Répondre

2

J'ai trouvé la réponse: non, l'onglet ne peut pas être surligné dans un émulateur de terminal conforme aux normes. Tab n'est pas vraiment un espace dans le terminal; il s'agit explicitement d'un caractère de mouvement du curseur pour passer à l'arrêt de tabulation suivant. Donc, en fait, mon exemple dit "imprimer deux espaces sur un fond rouge, avancer à la prochaine tabulation, puis imprimer deux autres espaces sur fond rouge".

La solution de contournement serait la suggestion d'ankon de convertir les onglets en espaces avant l'impression.

+0

Fonctionne sous Mac OS X Terminal (j'utilise 10.8). Il colore les onglets avec la couleur d'arrière-plan actuelle. Avez-vous une référence à la documentation qui dit que ça ne devrait pas? –

2

Si vous n'avez pas besoin d'onglets pour les onglets, vous pouvez prétraiter votre texte via expand (1).

+0

C'est une bonne suggestion, et il y a des chances que je finisse par faire quelque chose comme ça. – Dhskjlkakdh

0

Parce qu'il était difficile pour moi de trouver une bonne solution (et cette page a été premier résultat de recherche) ... Voilà ce que j'ai dans le fichier .bashrc (de http://pastebin.com/Pn1fkkJq avec des modifications):

catt() { # Highlight whitespace on the terminal -- rolfwr 
    local C=`printf '\033[0;36m'` R=`printf '\033[0m'` 
    #cat "[email protected]" | sed -e "s/  /${C}▹▹▹▹▹▹▹▹$R/g" -e "s/ /${C}·$R/g" -e "s/$/${C}⁋$R/" 
    #cat "[email protected]" | sed -e "s/ /${C}·$R/g" -e "s/\t/${C} ▹▹ $R/g" -e "s/$/${C}⁋$R/" 
    cat "[email protected]" | sed -e "s/ /${C}·$R/g" | expand | sed -e "s/ \(*\)/${C}▹\1$R/g" -e "s/$/${C}⁋$R/" 
    #cat "[email protected]" | sed -e "s/ /${C}.$R/g" | expand | sed -e "s/ \(*\)/${C}>\1$R/g" -e "s/$/${C}P$R/" 
} 

J'espère que cela aidera quelqu'un d'autre aussi.

+0

Pourquoi la downvote? –

+0

qui sait, c'est une bonne idée :-) bien que peut-être un peu mal exécuté, je préfère: 'hl-nonprinting() {local C = $ (printf '\ 033 [0; 36m') R = $ (printf '\ 033 [0m '); sed -e "s/\ t/$ {C} ▹ & $ R/g" -e "s/$/$ {C} ⁋ $ R /";} ' - cela me donne ' $ echo -e 'foo \ tbar fie' | hl-non-impression foo▹ bar fie⁋ ' – unhammer