Comment puis-je changer les couleurs de mon xterm en utilisant des séquences d'échappement Ansi?

25

Je voudrais changer les couleurs (arrière-plan, police, premier plan) de mon xterm à partir de la ligne de commande. J'ai entendu dire que cela peut être fait en utilisant des séquences d'échappement ANSI.

Si cela est possible:

  • Comment est-il fait?
  • Puis-je utiliser des noms de couleur ou dois-je utiliser leurs codes RVB?
Nathan Fellman
la source

Réponses:

27

Les séquences d'échappement ANSI consistent en une séquence de caractères commençant par le caractère d'échappement, le caractère 27. Le caractère suivant est souvent (mais pas toujours) un crochet carré ouvert: [

La commande echo peut envoyer des caractères d'échappement si vous spécifiez -eet utilisez \epour échapper.

La norme ANSI définit 8 couleurs, plus un mode lumineux, donnant un total de 16 possibilités. La séquence est la suivante:

\e[<number>m

<number>est l'un des:

Premier plan:

  • 30 Noir
  • 31 Rouge
  • 32 Vert
  • 33 Jaune
  • 34 Bleu
  • 35 Magenta
  • 36 Cyan
  • 37 Blanc

Contexte:

  • 40 Noir
  • 41 Rouge
  • 42 Vert
  • 43 Jaune
  • 44 Bleu
  • 45 Magenta
  • 46 Cyan
  • 47 Blanc

  • 0 Tout réinitialiser

  • 1 gras

Donc, pour rendre votre premier plan rouge et votre arrière-plan jaune:

$ echo -e "\e[31m\e[43m"

Et pour activer le gras:

$ echo -e "\e[1m"

Bien sûr, vous pouvez les combiner tous ensemble:

$ echo -e "\e[31m\e[43m\e[1m"

Il existe de nombreux autres codes d'échappement pour faire autre chose.

Par exemple - effacez l'écran et déplacez le curseur en haut à gauche:

$ echo -e "\e[2J\e[1;1H"

Ce qui est utile lors du changement de couleur:

$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"

Ce qui va changer les couleurs, effacer l'écran et placer le curseur en haut à gauche. Eh bien, presque en haut à gauche. Echo met un retour chariot, donc il descend d'une ligne. Vous pouvez ajouter -nà l'écho pour éviter cela si vous êtes pointilleux.

Si vous vous trompez et que vous ne voyez pas ce que vous tapez, vous pouvez réinitialiser les couleurs du terminal à la normale en appuyant sur:

Ctrl+v [ 0 m Return

À ce que vous espérez est l'invite de commande. Il se plaindra d'une commande inconnue, mais vous pourrez voir à nouveau ce que vous faites.

Majenko
la source
puis-je utiliser des noms de couleurs au lieu de codes de couleurs?
Nathan Fellman
1
Non, mais vous pouvez attribuer les codes couleur aux variables. FGRED = 31; echo -e "\ e [$ {FGRED} m"
Majenko
3
Il convient de noter, cependant, que plusieurs numéros de code couleur peuvent être séparés par ";". Donc, pour rendre votre premier plan rouge et votre arrière-plan jaune, vous pouvez également utiliser le plus court: echo -ne '\e[31;43m'(au lieu de ce qui précède echo -e "\e[31m\e[43m").
Andreas Spindler
Comment changer la couleur du curseur en 34 Bleu?
trusktr
28

Notez que les Xterms modernes prennent en charge les couleurs 32 bits!

Exemple simple. Pour définir un joli fond violet foncé (hé, chacun à son goût) de valeur # 53186f, vous devez:

echo -ne "\033]11;#53186f\007"

Notez que cela change instantanément la couleur de la fenêtre entière, pas seulement du texte suivant. Ceci est particulièrement utile pour rendre une fenêtre évidemment différente après avoir été envoyée à un serveur (par exemple). Mettez l '"écho" ci-dessus dans votre .bashrc et votre terminal change automatiquement de couleur lorsque vous vous connectez à ce serveur (mais ne changera pas lorsque vous vous déconnecterez)

Vous pouvez passer des HEURES sur le net à la recherche de cela - la plupart des documents ne parlent que des 16 couleurs ANSI originales.

Sources: http://www.steike.com/code/xterm-colors/ et http://rtfm.etla.org/xterm/ctlseq.html (regardez sous "Operating System Controls")

Remarque: la séquence d'échappement ci-dessus est valide pour les XTerms et peut ne pas fonctionner pour d'autres implémentations d'émulateurs de terminaux de fenêtrage "de type XTerm" qui peuvent "ressembler" à un XTerm. Par exemple, "gnome-terminal" ou "konsole" ont des séquences d'échappement différentes, ou peuvent ne pas implémenter de changement de couleur du tout.

Greg
la source
1
Cela ne fonctionne pas pour moi, cela fait écho à une ligne vierge sans changement observable dans le terminal.
Richard
1
Cela a fonctionné pour moi, alors que les autres n'ont pas - très utile, thx
vol7ron
1
+1 modifie l'arrière-plan de la fenêtre et autorise les noms de couleur - comme "vert" au lieu de "# 00ff00".
Rob I
1
comment sont les couleurs # 53186f 32 bits. Je compte 24 bits ...
jiggunjer
Est-ce que quelqu'un sait comment accomplir la même chose avec gnome-terminal?
wjandrea
3

Oui. Les terminaux ANSI prennent en charge les codes d'échappement ANSI . Chaque Control Sequence Introducer( CSI) code dans le format suivant:

ESC[<<<CODE>>>

Le caractère Ascii 27(le ESCcaractère) ou 1ben hexadécimal, suivi d'un crochet gauche, puis d'une lettre indiquant l'action à utiliser.

Notez qu'une liste de ;paramètres séparés peut être fournie directement avant le <<<CODE>>>paramètre.

Maintenant, les couleurs utilisent un sous-ensemble de CSIcodes, les Select Graphic Renditioncodes. Ce sont sous la forme:

ESC[<<<SGR>>>m

Le SGRcode est transmis en tant que paramètre le CSI. Les SGRcodes 30-49 sont pertinents pour votre question . Les codes 30-39 définissent la couleur de premier plan. Les codes 40-49 définissent la couleur d'arrière-plan.

30 - Foreground Black
31 - Foreground Red
32 - Foreground Green
33 - Foreground Yellow
34 - Foreground Blue
35 - Foreground Magenta
36 - Foreground Cyan
37 - Foreground White

40 - Background Black
41 - Background Red
42 - Background Green
43 - Background Yellow
44 - Background Blue
45 - Background Magenta
46 - Background Cyan
47 - Background White

Les codes 38 et 48 sont des codes spéciaux. Ce sont ceux qui vous permettent d'utiliser des valeurs RVB. Le format de ceux-ci est:

ESC[38;2;<r>;<g>;<b>m (Foreground)
ESC[48;2;<r>;<g>;<b>m (Background)

Remarque: les utilisations alternatives incluent \x1b[<3 or 4>8;5;<web safe color index>m. Avec cette utilisation, il existe un codage couleur complètement différent. Voir le lien en haut de cette réponse pour plus d'informations.

Les codes 39 et 49 définissent les couleurs de premier plan et d'arrière-plan à leurs valeurs par défaut, qui sont définies terminal par terminal.

En pratique, les couleurs 30-37 40-47 sont légèrement différentes de ce que disent leurs étiquettes.

0 - Black
1 - Darker Red
2 - Darker Green
3 - Dark/Yellow or Brown (varies between terminals)
4 - Dark Blue
5 - Dark Magenta
6 - Dark Cyan
7 - Light Grey

Pour obtenir des couleurs claires, vous utilisez le SGI pour le gras, 1. Bold est un nom trompeur. Cela ne rend pas la police en gras. Cela augmente en fait la luminosité du texte. En gras, les couleurs deviennent:

0 - Dark Grey
1 - Bright Red
2 - Bright Green
3 - Bright Yellow
4 - Bright Blue
5 - Bright Magenta
6 - Bright Cyan
7 - White

Remarque: les deux derniers blocs de numéros de couleurs sont pertinents pour l'avant-plan et l'arrière-plan ( <index> + (30 or 40)).

Pour supprimer tous les styles (retour au mode par défaut / normal), utilisez SGR0.

CSIles codes ne sont pas tous graphiques. Par exemple, ESC[2Jeffacera votre terminal. ESC[<y>;<x>Hdéfinit la position du curseur (indexé 1). Voir l'article wikipedia pour plus d'informations.

Remarque: pour les tester, utilisez echo -eou printf.

Élektra
la source
2

Remarque: le «^ [» est le caractère d'échappement et est inséré avec un CTRL-V, CTRL- [et ^ G est un caractère de cloche, inséré avec CTRL-V, CTRL-G

Le bloc suivant se trouve dans mon .bash_profile et garantit que mes xterms sur ce système sont TOUJOURS blanc sur noir, même après avoir ouvert une session sur un autre système qui peut avoir changé mes couleurs.

perl -e '$e=chr(27);print "${e}[37m ${e}[40m ${e}[2J ${e}[1;1H";'
export PS1='^[[37m^[]0;${HOST}: ${PWD}^G^[[40m${USER}@${HOST}:${PWD}
--> '
Mike
la source
0

vérifiez également un projet ScriptEchoColor,
il est entièrement fait dans des scripts bash,
il a des paquets pour Ubuntu ici,
mais ces scripts peuvent être installés sur n'importe quelle distribution si vous savez comment (les plus récents peuvent être téléchargés depuis son git également).

vous pouvez utiliser des noms de couleur raccourcis ou étendus comme:

echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"

un échantillon: entrez la description de l'image ici

Assurez-vous également de jeter un œil à xtermcontrol , pour un contrôle plus étendu sur l'xterm sur lui-même (pas seulement sur les personnages).

Puissance du Verseau
la source
0

Parmi les nombreux codes ANSI CSI se trouve celui appelé SGR, ou Select Graphic Rendition. Il s'agit de ESC,, [parameters,, moù les paramètres sont un ou plusieurs entiers au format ASCII, séparés par des points-virgules. Les nombreux paramètres SGR différents sont répertoriés sur la page Wikipedia ci-dessus (bien qu'il ne soit pas détaillé dans tous).

Certains paramètres, tels que 1(gras ou intensité accrue) et 31(texte rouge) sont autonomes et peuvent être utilisés individuellement ou combinés, comme dans ESC[31mou ESC[1;31mpour donner du texte de premier plan rouge standard et rouge gras, respectivement.

D'autres prennent les paramètres eux-mêmes, qui sont simplement fournis après le code sous forme de nombres séparés par des points-virgules. Ainsi, par exemple, ESC[38;5;219mafficherait le texte de premier plan dans la couleur étendue numéro 219 et ESC[38;2;150;100;50ml'afficherait dans la couleur avec la valeur RVB 150, 100, 50. Dans ce cas, 38est la commande "Extended set foreground color", qui est toujours suivie par une sous-commande. La sous-commande 2prend trois paramètres, les valeurs des composants rouge, vert et bleu. Différemment, la sous-commande ne 5prend qu'une seule valeur de plus, un nombre compris entre 0 et 255 spécifiant une couleur à partir d'une table avec laquelle le terminal est configuré.

La fonction shell suivante peut être pratique pour utiliser ces codes:

sgr() {
    local codes=${1:-0}; shift
    for c in "$@"; do codes="$codes;$c"; done
    echo -n -e "\e[${codes}m"
}

Vous pouvez l'utiliser comme ceci:

normal=$(sgr 0)
red=$(sgr 31)
echo "Text can be $(sgr 1)made boldface$(sgr 0)" \
     " or ${red}colored red${normal}" \
     " or $(sgr 31 1)even both at the same time$(sgr)."

Notez que si vous ne lui donnez aucun paramètre par sgr()défaut, le code SGR 0, ce qui signifie désactiver tous les attributs, réinitialiser le texte à la valeur par défaut pour ce terminal.

Curt J. Sampson
la source
1
Techniquement, ceux ESC[38... met ESC[38... mpeuvent / devraient (dépend de votre source d'information - l'ultime étant, je crois, itu.int/rec/T-REC-T.416-199303-I ) devrait utiliser le, sinon réservé, caractère :(pour séparer les éléments de paramètre ) de sorte que le ;soit utilisé uniquement entre des chaînes de paramètres complètes - c'est-à-dire qu'il ESC[38;2;150;100;50mdevrait être écrit ESC[38:2::150:100:50m...
SlySven
... malheureusement, les implémentations oublient souvent l' identifiant de l'espace colorimétrique entre le 2et le 150- comme personne, à ma connaissance , n'a jamais défini quelle valeur doit y entrer, la valeur par défaut vide doit être utilisée - mais elle est souvent omise et l'utilisation uniquement ;comme séparateur rend impossible le traitement fiable des informations conformément à la spécification.
SlySven