Sări la conținut

Coduri de escape ANSI

Un cod de escape ANSI este o scurtă secvență de caractere pe care un program o tipărește pentru a spune terminalului să facă ceva altceva decât să afișeze acele caractere — să coloreze următoarele cuvinte în roșu, să mute cursorul două linii în sus, să șteargă ecranul. Terminalul înghite secvența și o execută, motiv pentru care un fișier jurnal plin de ele arată ca zgomot atunci când îl deschideți într-un editor.

Fiecare cod de mai jos începe cu byte-ul escape și, cu o singură excepție, cu o paranteză deschisă. Coloana parametru indică partea dintre paranteză și litera finală, care este piesa pe care o asamblați în cod; prima coloană arată întreaga secvență așa cum ați scrie-o într-un shell.

Suportul variază între terminale și această pagină o menționează acolo unde contează. Opt culori de bază și bold funcționează peste tot; blink, underline dublu și true color nu.

Anatomia unei secvențe

6

Fiecare cod de pe această pagină are aceeași formă: byte escape, paranteză deschisă, parametri și o literă care spune ce se face cu ei.

SecvențăParametruEfect
\e0x1BByte-ul escape care începe fiecare secvențăScris \e într-un shell, \033 în C, \x1b în majoritatea limbajelor și \u001b în JSON și Java.
\e[CSIControl Sequence Introducer — deschide o comandă parametrizată
\e[<n>mmSelect Graphic Rendition: orice culoare și stil se termină în m
\e[1;4;31m1;4;31Mai mulți parametri deodată, separați prin puncte și virguleBold, underlined și roșu într-o singură secvență — mai scurt decât trei separate și identic în efect.
\e[0m0Șterge orice atribut înapoi la setarea implicită a terminaluluiEmiți aceasta la sfârșitul ieșirii colorate. Un program care se termină fără aceasta lasă promptul utilizatorului colorat.
\e]8;;URL\e\\text\e]8;;\e\\OSC 8Un hyperlink clickabil, în terminale care o suportăO secvență OSC mai degrabă decât una CSI și terminată de ESC \ în loc de o literă.

Atribute de text

14

Suportul este inegal sub primele cinci. Blink este ignorat aproape peste tot, și câteva terminale redau dim și italic identic.

SecvențăParametruEfect
\e[1m1Bold sau bright
\e[2m2Dim
\e[3m3Italic
\e[4m4Underline
\e[5m5BlinkLarg ignorat; majoritatea terminalelor moderne o redau ca text obișnuit.
\e[7m7Reverse: schimbă foreground și background
\e[8m8Hidden: textul este acolo dar nu este desenat
\e[9m9Strikethrough
\e[21m21Underline dubluUnele terminale citesc 21 ca "anulează bold".
\e[22m22Intensitate normală: anulează bold și dim
\e[23m23Anulează italic
\e[24m24Anulează underline
\e[27m27Anulează reverse
\e[29m29Anulează strikethrough

Culoare text

17

Opt culori standard și omologii lor luminoși. Ceea ce cititorul vede de fapt este interpretarea temei sale terminal a fiecăruia — "roșu" este o poziție într-o paletă, nu o valoare hex.

SecvențăParametruEfect
\e[30m30Text negru
\e[31m31Text roșu
\e[32m32Text verde
\e[33m33Text galben
\e[34m34Text albastru
\e[35m35Text magenta
\e[36m36Text cyan
\e[37m37Text alb
\e[39m39Înapoi la culoarea de text implicită
\e[90m90Text negru luminos
\e[91m91Text roșu luminos
\e[92m92Text verde luminos
\e[93m93Text galben luminos
\e[94m94Text albastru luminos
\e[95m95Text magenta luminos
\e[96m96Text cyan luminos
\e[97m97Text alb luminos

Culoare fundal

17

Aceeași paletă deplasată cu zece. Un cod de fundal stabilește celula din spatele textului și rămâne efectiv până când este resetat.

SecvențăParametruEfect
\e[40m40Fundal negru
\e[41m41Fundal roșu
\e[42m42Fundal verde
\e[43m43Fundal galben
\e[44m44Fundal albastru
\e[45m45Fundal magenta
\e[46m46Fundal cyan
\e[47m47Fundal alb
\e[49m49Înapoi la fundal implicit
\e[100m100Fundal negru luminos
\e[101m101Fundal roșu luminos
\e[102m102Fundal verde luminos
\e[103m103Fundal galben luminos
\e[104m104Fundal albastru luminos
\e[105m105Fundal magenta luminos
\e[106m106Fundal cyan luminos
\e[107m107Fundal alb luminos

256 culori și true color

4

Două extensii la același mecanism SGR. Ambele sunt larg dar nu universal suportate; un terminal care nu le înțelege de obicei ignoră secvența decât să o tipărească.

SecvențăParametruEfect
\e[38;5;<n>m38;5;nText în culoare paletă n, 0–2550–15 sunt cele șaisprezece de mai sus, 16–231 un cub de culoare 6×6×6, 232–255 o rampă de gri.
\e[48;5;<n>m48;5;nFundal în culoare paletă n, 0–255
\e[38;2;<r>;<g>;<b>m38;2;r;g;bText într-o culoare exactă 24-bit
\e[48;2;<r>;<g>;<b>m48;2;r;g;bFundal într-o culoare exactă 24-bit

Mișcare cursor

11

Mișcările nu derulează și nu se înfășoară: un cursor deja în vârful ecranului ignoră o solicitare de a merge mai sus.

SecvențăParametruEfect
\e[<n>AASus n rânduri
\e[<n>BBJos n rânduri
\e[<n>CCDreapta n coloane
\e[<n>DDStânga n coloane
\e[<n>EEJos n rânduri, la începutul rândului
\e[<n>FFSus n rânduri, la începutul rândului
\e[<n>GGLa coloana n din rândul curent
\e[<row>;<col>HHLa rând și coloană absolute, numărând de la 1
\e[ssȚine minte poziția cursorului
\e[uuRevino la poziția ținută minte
\e[6n6nÎntreabă terminalul unde este cursorulTerminalul răspunde la intrarea standard ca \e[<rând>;<coloană>R — singura secvență aici care produce un răspuns.

Ștergere

7

Ștergerea scrie spații cu culoarea de fundal curentă; nu mută cursorul.

SecvențăParametruEfect
\e[0J0JȘterge de la cursor la sfârșitul ecranului
\e[1J1JȘterge de la începutul ecranului la cursor
\e[2J2JȘterge întregul ecranCursorul rămâne unde era, motiv pentru care aceasta este de obicei paired cu \e[H.
\e[3J3JȘterge și bufferul de derulare
\e[0K0KȘterge de la cursor la sfârșitul rândului
\e[1K1KȘterge de la începutul rândului la cursor
\e[2K2KȘterge rândul complet\r\e[2K este modul obișnuit de a redesena o linie de progres în loc.

Moduri terminal

8

Moduri private, marcate de semnul întrebării. Ele schimbă comportamentul terminalului mai degrabă decât aspectul unei bucăți de text, și fiecare trebuie întors înapoi înainte ca programul să se încheie.

SecvențăParametruEfect
\e[?25l?25lAscunde cursorul
\e[?25h?25hArată cursorul
\e[?1049h?1049hComută la ecranul alternativCeea ce folosește un program cu ecran plin pentru ca derularea shell-ului să supraviețuiască sub el.
\e[?1049l?1049lComută înapoi la ecranul principal
\e[?7h?7hÎnfășoară liniile lungi la marginea dreaptă
\e[?7l?7lLasă liniile lungi să curgă peste marginea dreaptă
\e[?2004h?2004hActivează bracketed pasteTextul lipit sosește înfășurat în \e[200~ și \e[201~, deci shell-ul poate distinge tastarea de lipire.
\e[?2004l?2004lDezactivează bracketed paste

FAQ

De ce ieșirea rămâne colorată după încheierea programului?
Pentru că nimic nu a resetat-o. Un cod de culoare rămâne efectiv până când un altul îl înlocuiește, deci un program care se termină în mijlocul unei culori lasă promptul shell-ului colorat. Tipăriți \e[0m înainte de a ieși — inclusiv pe calea erorii, care este cea pe care oamenii o uită.
Care este diferența între \e, \033 și \x1b?
Niciunul. Toate trei sunt același byte, 0x1B, scris în modul în care un limbaj particular îl scrie: \e în bash și zsh, \033 în C și în echo -e, \x1b în Python, Go, Rust și JavaScript, \u001b unde este permis doar un escape Unicode, cum ar fi JSON și Java.
Cum pot elimina aceste coduri dintr-un fișier jurnal?
Lipiți-l în instrumentul de eliminare a codurilor ANSI de pe acest site. Elimină secvențe de culoare, cursor și mod și poate, de asemenea, să convertească culorile la HTML sau Markdown în loc să le renunțe, ceea ce doriți dacă scopul jurnalului era evidențierea.
Ar trebui să codific culorile sau să folosesc o bibliotecă?
Pentru orice mai mult de câteva linii, folosiți o bibliotecă — verifică dacă ieșirea este cu adevărat un terminal. Codurile de culoare scrise într-o conductă sau într-un fișier ajung în fișier, și așa cum jurnalele de construcție dobândesc zgomotul lor.
Este bold același cu bright?
Din punct de vedere istoric da, și pe unele terminale încă. Codul 1 a fost definit ca bold, dar multe terminale l-au implementat comutând pe jumătatea luminoasă a paletei, deci bold roșu și bright roșu pot reda identic. Intervalul 90–97 există pentru ca să puteți cere bright fără a cere bold.