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


Je voudrais changer les couleurs (fond, 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 couleurs ou dois-je utiliser leurs codes RVB?

20
2018-04-13 06:49


origine




Réponses:


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 ouvert: [

La commande echo peut envoyer des caractères d'échappement si vous spécifiez -e et utilise \e pour é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> fait partie de:

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 Réinitialiser tout

  • 1 audacieux

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

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

Et pour activer gras:

$ echo -e "\e[1m"

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

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

Il y a beaucoup d'autres codes d'échappement pour faire d'autres choses.

Par exemple - effacez l'écran et déplacez le curseur vers le 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 changera les couleurs, effacez l'écran et placez le curseur en haut à gauche. Eh bien, presque en haut à gauche. Echo place un retour chariot, il descend donc d'une ligne. Vous pouvez ajouter -n faire écho pour empêcher cela si vous êtes difficile.

Si vous ne parvenez pas à voir ce que vous tapez, vous pouvez réinitialiser les couleurs du terminal en appuyant sur:

Ctrl+v [ 0 m Revenir

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


18
2018-04-13 08:45



puis-je utiliser des noms de couleur au lieu des codes de couleur? - Nathan Fellman
Non, mais vous pouvez attribuer les codes de couleur aux variables. FGRED = 31; echo -e "\ e [$ {FGRED} m" - Majenko
Il convient toutefois de noter 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 à 34 bleu? - trusktr


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

Exemple simple Pour définir un joli fond violet foncé (hé, chacun pour lui) de la valeur # 53186f, vous faites:

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 intéressant pour créer une fenêtre évidemment différente après ssh'ing sur un serveur (par exemple). Mettez le "echo" ci-dessus dans votre .bashrc et votre terminal change automatiquement de couleur lorsque vous vous connectez à ce serveur (mais ne reviendra pas lorsque vous sortez Ctrl-D)

Vous pouvez passer des heures sur le net à la recherche de ceci - 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 "Contrôles du système d'exploitation")

Remarque: la séquence d'échappement ci-dessus est valide pour XTerms et peut ne pas fonctionner pour d'autres implémentations d'émulateurs de terminaux de fenêtrage de type "XTerm-like" 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.


22
2017-12-11 10:36



Cela ne fonctionne pas pour moi, cela fait écho à une ligne blanche sans changement observable dans le terminal. - Richard
Cela a fonctionné pour moi, alors que les autres ne l'ont pas fait - très utile, merci - vol7ron
+1 change l'arrière-plan de la fenêtre et autorise les noms de couleur - comme "vert" au lieu de "# 00ff00". - Rob I
comment est le # 53186f couleurs 32 bits. Je compte 24 bits ... - jiggunjer
édité, merci - Greg Bell


Oui. Prise en charge des terminaux ANSI Codes d'échappement ANSI. Chaque Control Sequence Introducer(CSI) Code dans le format suivant:

ESC[<<<CODE>>>

Le personnage Ascii 27 (la ESC personnage) ou 1b en 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 peuvent être fournis directement avant le <<<CODE>>> paramètre.

Maintenant, les couleurs utilisent un sous-ensemble de CSI codes, le Select Graphic Rendition codes. Ce sont sous la forme:

ESC[<<<SGR>>>m

le SGR le code est passé en paramètre le CSI. Pertinents à votre question sont les SGR codes 30-49. 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 les valeurs RVB. Le format pour ceux-ci est:

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

Note: les utilisations alternatives incluent \x1b[<3 or 4>8;5;<web safe color index>m. Avec cette utilisation, il existe un codage des couleurs 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 sur leurs valeurs par défaut, définies 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 gras, 1. Bold est un nom trompeur. Cela ne rend pas la police en gras. Cela augmente effectivement 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 et l’arrière-plan (<index> + (30 or 40)).

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

CSI les codes ne sont pas tous graphiques. Par exemple, ESC[2J effacera votre terminal. ESC[<y>;<x>H définit la position du curseur (indexé en 1). Voir l'article de Wikipedia pour plus d'informations.

Remarque: pour les tester, utilisez echo -e ou printf.


3
2017-07-10 01:06





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 fichier .bash_profile et garantit que mes xterms sur ce système sont TOUJOURS blancs sur noir, même après la connexion à 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}
--> '

2
2018-05-09 00:34





vérifier aussi un projet ScriptEchoColor
il est complètement fait dans les 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 dernières peuvent être téléchargées à partir de git également).

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

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

un échantillon: enter image description here

Aussi, assurez-vous de jeter un oeil à xtermcontrol, pour un contrôle plus étendu du xterm sur lui-même (pas seulement les caractères).


0
2017-10-14 16:14





Parmi les nombreux ANSI Codes CSI est un appelé SGR ou Select Graphic Rendition. Ceci est ESC, [, paramètres, m, où les paramètres sont un ou plusieurs entiers au format ASCII, séparés par des points-virgules. Les nombreux paramètres SGR sont listés sur la page Wikipedia ci-dessus (même si elle ne contient pas tous les détails).

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

D'autres prennent eux-mêmes des paramètres, 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;219m afficherait le texte de premier plan avec le numéro de couleur étendu 219, et ESC[38;2;150;100;50m l'afficherait dans la couleur avec la valeur RVB 150, 100, 50. Dans ce cas, 38 est la commande "étendu de couleur de premier plan", qui est toujours suivie par une sous-commande. Sous-commande 2 prend trois paramètres, les valeurs des composants rouge, vert et bleu. Différemment, sous-commande 5 prend juste une valeur de plus, un nombre de 0 à 255 spécifiant une couleur à partir d'une table avec laquelle le terminal est configuré.

La fonction shell suivante peut être utile 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 donnez aucun paramètre à sgr() le code SGR par défaut est 0, ce qui signifie que tous les attributs sont désactivés, le texte est réinitialisé à la valeur par défaut pour ce terminal.


0
2017-08-31 04:50