Przejdź do treści

Kody escape ANSI

Kod escape ANSI to krótka sekwencja znaków, którą program wypisuje, aby powiedzieć terminalowi aby zrobił coś innego niż wyświetlić te znaki — zabarwić następne słowa na czerwono, przesunąć kursor o dwa wiersze w górę, wyczyścić ekran. Terminal połyka sekwencję i na nią reaguje; dlatego plik dziennika pełny takich kodów wygląda jak szum w edytorze.

Każdy kod poniżej zaczyna się bajtem escape i — z jednym wyjątkiem — nawiasem otwierającym. Kolumna parametru podaje część między nawiasem a ostatnią literą, czyli to co montuje się w kodzie; pierwsza kolumna pokazuje całą sekwencję tak jak byś ją napisał w powłoce.

Obsługa różni się między terminalami, a ta strona wskazuje gdzie to ma znaczenie. Osiem podstawowych kolorów i pogrubienie działają wszędzie; migotanie, podwójne podkreślenie i true color nie.

Anatomia sekwencji

6

Każdy kod na tej stronie ma ten sam kształt: bajt escape, nawias otwierający, parametry i jedna litera mówiąca co z nimi zrobić.

SekwencjaParameterEfekt
\e0x1BBajt escape rozpoczynający każdą sekwencjęW powłoce pisze się \e, w C \033, w większości języków \x1b i w JSON i Javie \u001b.
\e[CSIControl Sequence Introducer — otwiera sparametryzowany rozkaz
\e[<n>mmSelect Graphic Rendition: wszystko wokół koloru i stylu kończy się na m
\e[1;4;31m1;4;31Kilka parametrów naraz, oddzielonych średnikamiPogrubienie, podkreślenie i czerwień w jednej sekwencji — krótsze niż trzy osobne i taki sam efekt.
\e[0m0Resetuje wszystkie atrybuty do ustawień domyślnych terminalaWypisz to na końcu kolorowego wyjścia. Program kończący się bez tego zostawia użytkownikowi zabarwiony prompt.
\e]8;;URL\e\\text\e]8;;\e\\OSC 8Klikalny hiperlink w terminalach które go obsługująTo jest sekwencja OSC, nie CSI, i kończy się ESC \ zamiast litery.

Atrybuty tekstu

14

Obsługa jest nierówna poza pierwszymi pięcioma. Migotanie jest prawie wszędzie ignorowane, kilka terminali renderuje przyciemnienie i kursywę identycznie.

SekwencjaParameterEfekt
\e[1m1Pogrubienie albo jasne
\e[2m2Przyciemnienie
\e[3m3Kursywa
\e[4m4Podkreślenie
\e[5m5MigotanieSzeroko ignorowane; większość nowoczesnych terminali renderuje to jako zwykły tekst.
\e[7m7Odwrócenie: zamienia pierwszy plan i tło
\e[8m8Ukryty: tekst istnieje ale się nie renderuje
\e[9m9Przekreślenie
\e[21m21Podwójne podkreślenieNiektóre terminale czytają 21 jako "wyłącz pogrubienie".
\e[22m22Normalna intensywność: anuluje pogrubienie i przyciemnienie
\e[23m23Anuluje kursywę
\e[24m24Anuluje podkreślenie
\e[27m27Anuluje odwrócenie
\e[29m29Anuluje przekreślenie

Kolor tekstu

17

Osiem standardowych kolorów i ich jasne odpowiedniki. To co czytelnik faktycznie widzi to interpretacja ich motywu terminala — "czerwień" to pozycja w palecie, nie wartość heksadecymalna.

SekwencjaParameterEfekt
\e[30m30Czarny tekst
\e[31m31Czerwony tekst
\e[32m32Zielony tekst
\e[33m33Żółty tekst
\e[34m34Niebieski tekst
\e[35m35Purpurowy tekst
\e[36m36Cyjanowy tekst
\e[37m37Biały tekst
\e[39m39Powrót do domyślnego koloru tekstu
\e[90m90Jasny czarny tekst
\e[91m91Jasny czerwony tekst
\e[92m92Jasny zielony tekst
\e[93m93Jasny żółty tekst
\e[94m94Jasny niebieski tekst
\e[95m95Jasny purpurowy tekst
\e[96m96Jasny cyjanowy tekst
\e[97m97Jasny biały tekst

Kolor tła

17

Ta sama paleta przesunięta o dziesięć. Kod tła ustawia komórkę za tekstem i obowiązuje dopóki nie zostanie wyresetowany.

SekwencjaParameterEfekt
\e[40m40Czarne tło
\e[41m41Czerwone tło
\e[42m42Zielone tło
\e[43m43Żółte tło
\e[44m44Niebieskie tło
\e[45m45Purpurowe tło
\e[46m46Cyjanowe tło
\e[47m47Białe tło
\e[49m49Powrót do domyślnego tła
\e[100m100Jasne czarne tło
\e[101m101Jasne czerwone tło
\e[102m102Jasne zielone tło
\e[103m103Jasne żółte tło
\e[104m104Jasne niebieskie tło
\e[105m105Jasne purpurowe tło
\e[106m106Jasne cyjanowe tło
\e[107m107Jasne białe tło

256 kolorów i true color

4

Dwa rozszerzenia tego samego mechanizmu SGR. Obydwa są szeroko obsługiwane ale nie wszędzie; terminal który ich nie rozumie zwykle ignoruje sekwencję zamiast ją wypisywać.

SekwencjaParameterEfekt
\e[38;5;<n>m38;5;nTekst w kolorze palety n, 0–2550–15 to szesnaście wyżej, 16–231 to kostka kolorów 6×6×6, 232–255 to gradacja szarości.
\e[48;5;<n>m48;5;nTło w kolorze palety n, 0–255
\e[38;2;<r>;<g>;<b>m38;2;r;g;bTekst w dokładnym 24-bitowym kolorze
\e[48;2;<r>;<g>;<b>m48;2;r;g;bTło w dokładnym 24-bitowym kolorze

Ruch kursora

11

Ruchy nie przewijają i nie zawijają: kursor już na górze ekranu ignoruje polecenie pójścia wyżej.

SekwencjaParameterEfekt
\e[<n>AAO n wierszy w górę
\e[<n>BBO n wierszy w dół
\e[<n>CCO n kolumn w prawo
\e[<n>DDO n kolumn w lewo
\e[<n>EEO n wierszy w dół, na początek wiersza
\e[<n>FFO n wierszy w górę, na początek wiersza
\e[<n>GGDo kolumny n w bieżącym wierszu
\e[<row>;<col>HHDo bezwzględnego wiersza i kolumny, licząc od 1
\e[ssZapamiętaj pozycję kursora
\e[uuWróć do zapamiętanej pozycji
\e[6n6nZapytaj terminal gdzie jest kursorTerminal odpowiada na standardowe wejście jako \e[<wiersz>;<kolumna>R — jedyna sekwencja tu która zwraca odpowiedź.

Czyszczenie

7

Czyszczenie zapisuje spacje z bieżącym kolorem tła; nie przesuwa kursora.

SekwencjaParameterEfekt
\e[0J0JWyczyść od kursora do końca ekranu
\e[1J1JWyczyść od początku ekranu do kursora
\e[2J2JWyczyść cały ekranKursor pozostaje gdzie był — dlatego zwykle kombinuje się z \e[H.
\e[3J3JWyczyść też bufor historii przewijania
\e[0K0KWyczyść od kursora do końca wiersza
\e[1K1KWyczyść od początku wiersza do kursora
\e[2K2KWyczyść cały wiersz\r\e[2K to zwykły sposób aby przerysować wiersz postępu na miejscu.

Tryby terminala

8

Tryby prywatne, oznaczone znakiem zapytania. Zmieniają jak terminal się zachowuje a nie jak wygląda jeden kawałek tekstu, i każdy z nich trzeba wyłączyć przed zakończeniem programu.

SekwencjaParameterEfekt
\e[?25l?25lUkryj kursor
\e[?25h?25hPokaż kursor
\e[?1049h?1049hPrzełącz na alternatywny ekranTo co używają programy pełnoekranowe żeby historia powłoki poniżej przetrwała.
\e[?1049l?1049lPrzełącz z powrotem na główny ekran
\e[?7h?7hZawijaj długie wiersze na prawej krawędzi
\e[?7l?7lPozwól długim wierszom wychodzić za prawy okraj
\e[?2004h?2004hWłącz bracketed pasteWklejony tekst przychodzi owinięty w \e[200~ i \e[201~, więc powłoka rozróżnia pisanie od wklejania.
\e[?2004l?2004lWyłącz bracketed paste

Częste pytania

Dlaczego moja wyjście pozostaje zabarwione po zakończeniu programu?
Bo nic go nie wyresetowało. Kod koloru obowiązuje dopóki inny go nie zastąpi, więc program kończący się w środku koloru pozostawia powłoce zabarwiony prompt. Wypisz \e[0m przed zakończeniem — również na ścieżce błędu, którą najczęściej się zapomina.
Jaka jest różnica między \e, \033 i \x1b?
Żadna. Wszystkie trzy to ten sam bajt 0x1B, napisany tak jak notuje go dany język: \e w bashu i zsh, \033 w C i w echo -e, \x1b w Pythonie, Go, Ruscie i JavaScripcie, \u001b gdzie dozwolony jest tylko escape Unicode, jak w JSON i Javie.
Jak je usunąć z pliku dziennika?
Wklej go do narzędzia usuwającego kody ANSI na tej stronie. Usuwa sekwencje koloru, kursora i trybów i potrafi też konwertować kolory na HTML lub Markdown zamiast je usuwać — to co chcesz gdy celem dziennika było podświetlenie.
Czy powinienem kodować kolory na stałe czy użyć biblioteki?
Do czegokolwiek dłuższego niż kilka linii użyj biblioteki — sprawdza czy wyjście w ogóle jest terminalem. Kody koloru wpisane do pipe'a lub pliku kończą się w pliku, i tak właśnie logi budowania zbierają szum.
Czy pogrubienie to to samo co jasne?
Historycznie tak i na niektórych terminalach nadal. Kod 1 był zdefiniowany jako pogrubienie, ale wiele terminali implementowało go przez przełączenie na jasną połowę palety, więc pogrubiona czerwień i jasna czerwień mogą wyglądać identycznie. Zakres 90–97 istnieje żeby móc prosić o jasne bez pogrubienia.