Lista sekwencji ucieczki kolorów ANSI

225

Na większości terminali można pokolorować wyjście za pomocą \033sekwencji ucieczki ANSI.

Szukam listy wszystkich obsługiwanych kolorów i opcji (takich jak jasne i migające).

Ponieważ prawdopodobnie istnieją różnice między terminalami, które je obsługują, interesują mnie głównie sekwencje obsługiwane przez terminale kompatybilne z xterm.

ThiefMaster
źródło
W rzeczywistości można używać kolorów w cmd systemu Windows. stackoverflow.com/questions/41207496/…
Joel
I z MSDN
Joel

Odpowiedzi:

510

Sekwencje specjalne ANSI, których szukasz, to podzbiór Select Graphic Rendition. Wszystkie mają formę

\033[XXXm

gdzie XXXjest serią parametrów oddzielonych średnikami.

Można powiedzieć, aby tekst był czerwony, pogrubiony i podkreślony (omówimy wiele innych opcji poniżej) w języku C, który możesz napisać:

printf("\033[31;1;4mHello\033[0m");

W C ++ byś użył

std::cout<<"\033[31;1;4mHello\033[0m";

W Python3 używałbyś

print("\033[31;1;4mHello\033[0m")

a w Bashu używałbyś

echo -e "\033[31;1;4mHello\033[0m"

gdzie pierwsza część powoduje, że tekst jest czerwony ( 31), pogrubiony ( 1), podkreślony ( 4), a ostatnia usuwa wszystko ( 0).

Jak opisano w poniższej tabeli, istnieje wiele właściwości tekstu, które można ustawić, takich jak pogrubienie, czcionka, podkreślenie i c. (Czy to nie głupie, że StackOverflow nie pozwala ci na wstawianie odpowiednich tabel w odpowiedziach?)

Efekty czcionek

╔══════════╦════════════════════════════════╦═════════════════════════════════════════════════════════════════════════╗
║  Code    ║             Effect             ║                                   Note                                  ║
╠══════════╬════════════════════════════════╬═════════════════════════════════════════════════════════════════════════╣
║ 0        ║  Reset / Normal                ║  all attributes off                                                     ║
║ 1        ║  Bold or increased intensity   ║                                                                         ║
║ 2        ║  Faint (decreased intensity)   ║  Not widely supported.                                                  ║
║ 3        ║  Italic                        ║  Not widely supported. Sometimes treated as inverse.                    ║
║ 4        ║  Underline                     ║                                                                         ║
║ 5        ║  Slow Blink                    ║  less than 150 per minute                                               ║
║ 6        ║  Rapid Blink                   ║  MS-DOS ANSI.SYS; 150+ per minute; not widely supported                 ║
║ 7        ║  [[reverse video]]             ║  swap foreground and background colors                                  ║
║ 8        ║  Conceal                       ║  Not widely supported.                                                  ║
║ 9        ║  Crossed-out                   ║  Characters legible, but marked for deletion.  Not widely supported.    ║
║ 10       ║  Primary(default) font         ║                                                                         ║
║ 11–19    ║  Alternate font                ║  Select alternate font `n-10`                                           ║
║ 20       ║  Fraktur                       ║  hardly ever supported                                                  ║
║ 21       ║  Bold off or Double Underline  ║  Bold off not widely supported; double underline hardly ever supported. ║
║ 22       ║  Normal color or intensity     ║  Neither bold nor faint                                                 ║
║ 23       ║  Not italic, not Fraktur       ║                                                                         ║
║ 24       ║  Underline off                 ║  Not singly or doubly underlined                                        ║
║ 25       ║  Blink off                     ║                                                                         ║
║ 27       ║  Inverse off                   ║                                                                         ║
║ 28       ║  Reveal                        ║  conceal off                                                            ║
║ 29       ║  Not crossed out               ║                                                                         ║
║ 30–37    ║  Set foreground color          ║  See color table below                                                  ║
║ 38       ║  Set foreground color          ║  Next arguments are `5;<n>` or `2;<r>;<g>;<b>`, see below                       ║
║ 39       ║  Default foreground color      ║  implementation defined (according to standard)                         ║
║ 40–47    ║  Set background color          ║  See color table below                                                  ║
║ 48       ║  Set background color          ║  Next arguments are `5;<n>` or `2;<r>;<g>;<b>`, see below                       ║
║ 49       ║  Default background color      ║  implementation defined (according to standard)                         ║
║ 51       ║  Framed                        ║                                                                         ║
║ 52       ║  Encircled                     ║                                                                         ║
║ 53       ║  Overlined                     ║                                                                         ║
║ 54       ║  Not framed or encircled       ║                                                                         ║
║ 55       ║  Not overlined                 ║                                                                         ║
║ 60       ║  ideogram underline            ║  hardly ever supported                                                  ║
║ 61       ║  ideogram double underline     ║  hardly ever supported                                                  ║
║ 62       ║  ideogram overline             ║  hardly ever supported                                                  ║
║ 63       ║  ideogram double overline      ║  hardly ever supported                                                  ║
║ 64       ║  ideogram stress marking       ║  hardly ever supported                                                  ║
║ 65       ║  ideogram attributes off       ║  reset the effects of all of 60-64                                      ║
║ 90–97    ║  Set bright foreground color   ║  aixterm (not in standard)                                              ║
║ 100–107  ║  Set bright background color   ║  aixterm (not in standard)                                              ║
╚══════════╩════════════════════════════════╩═════════════════════════════════════════════════════════════════════════╝

2-bitowe kolory

Już to masz!

4-bitowe kolory

Standardy implementujące kolory terminali rozpoczęły się od ograniczonych (4-bitowych) opcji. Poniższa tabela zawiera wartości RGB kolorów tła i pierwszego planu używanych do nich przez różne emulatory terminali:

Tabela kolorów ANSI zaimplementowanych przez różne emulatory terminali

Korzystając z powyższego, możesz zrobić czerwony tekst na zielonym tle (ale dlaczego?), Używając:

\033[31;42m

11 kolorów (interludium)

W swojej książce „Podstawowe warunki kolorystyczne: ich uniwersalność i ewolucja” Brent Berlin i Paul Kay wykorzystali dane zebrane z dwudziestu różnych języków z różnych rodzin językowych, aby zidentyfikować jedenaście możliwych podstawowych kategorii kolorów: biały, czarny, czerwony, zielony, żółty, niebieski, brązowy, fioletowy, różowy, pomarańczowy i szary.

Berlin i Kay odkryli, że w językach, w których jest mniej niż jedenaście maksymalnie 11 kategorii kolorów, kolory mają określony wzór ewolucyjny. Ten wzór jest następujący:

  1. Wszystkie języki zawierają terminy czarny (fajne kolory) i biały (jasne kolory).
  2. Jeśli język zawiera trzy terminy, wówczas zawiera termin czerwony.
  3. Jeśli język zawiera cztery terminy, to zawiera termin zielony lub żółty (ale nie oba).
  4. Jeśli język zawiera pięć terminów, wówczas zawiera zarówno terminy zielony, jak i żółty.
  5. Jeśli język zawiera sześć terminów, zawiera termin niebieski.
  6. Jeśli język zawiera siedem terminów, zawiera termin brązowy.
  7. Jeśli język zawiera osiem lub więcej terminów, wówczas zawiera terminy dla fioletowego, różowego, pomarańczowego lub szarego.

Być może dlatego historia Beowulf zawiera tylko kolory czarny, biały i czerwony. Być może dlatego Biblia nie ma koloru niebieskiego. Homera Odyseja zawiera prawie 200 razy czarny i biały około 100 razy. Czerwony pojawia się 15 razy, a żółty i zielony pojawiają się tylko 10 razy. ( Więcej informacji tutaj )

Interesujące są również różnice między językami: zwróć uwagę na obfitość wyrazów w różnych kolorach używanych przez angielski lub chiński. Jednak zagłębianie się w te języki pokazuje, że każdy używa kolorów na różne sposoby. ( Więcej informacji )

Nazwy kolorów chińskich a angielskich.  Zdjęcie pochodzi z „muyueh.com”

Ogólnie rzecz biorąc, nazywanie, używanie i grupowanie kolorów w ludzkich językach jest fascynujące. Wróćmy do programu.

8-bitowe (256) kolory

Zaawansowana technologia i dostępne są tabele 256 wstępnie wybranych kolorów, jak pokazano poniżej.

256-bitowy tryb kolorów dla sekwencji ucieczkowych ANSI

Korzystając z powyższych, możesz zrobić różowy tekst w taki sposób:

\033[38;5;206m     #That is, \033[38;5;<FG COLOR>m

I zrób niebieskie tło wcześnie rano

\033[48;5;57m      #That is, \033[48;5;<BG COLOR>m

I oczywiście możesz połączyć te:

\033[38;5;206;48;5;57m

8-bitowe kolory są ułożone w następujący sposób:

0x00-0x07:  standard colors (same as the 4-bit colours)
0x08-0x0F:  high intensity colors
0x10-0xE7:  6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
0xE8-0xFF:  grayscale from black to white in 24 steps

WSZYSTKIE KOLORY

Teraz żyjemy w przyszłości, a pełne spektrum RGB jest dostępne za pomocą:

\033[38;2;<r>;<g>;<b>m     #Select RGB foreground color
\033[48;2;<r>;<g>;<b>m     #Select RGB background color

Możesz więc umieścić różowawy tekst na brązowawym tle za pomocą

\033[38;2;255;82;197;48;2;155;106;0mHello

Wsparcie dla terminali „true color” jest wymieniony tutaj .

Wiele z powyższych pochodzi ze strony Wikipedii „ Kod ucieczki ANSI ”.

Poręczny skrypt do przypomnienia sobie

Ponieważ często próbuję zapamiętać, jakie są kolory, mam przydatny skrypt o nazwie ~/bin/ansi_colours:

#!/usr/bin/python

print "\\033[XXm"

for i in range(30,37+1):
    print "\033[%dm%d\t\t\033[%dm%d" % (i,i,i+60,i+60);

print "\033[39m\\033[39m - Reset colour"
print "\\033[2K - Clear Line"
print "\\033[<L>;<C>H OR \\033[<L>;<C>f puts the cursor at line L and column C."
print "\\033[<N>A Move the cursor up N lines"
print "\\033[<N>B Move the cursor down N lines"
print "\\033[<N>C Move the cursor forward N columns"
print "\\033[<N>D Move the cursor backward N columns"
print "\\033[2J Clear the screen, move to (0,0)"
print "\\033[K Erase to end of line"
print "\\033[s Save cursor position"
print "\\033[u Restore cursor position"
print " "
print "\\033[4m  Underline on"
print "\\033[24m Underline off"
print "\\033[1m  Bold on"
print "\\033[21m Bold off"

To drukuje

Proste kolory ANSI

Richard
źródło
4
Komplet kodów ucieczkowych ANSI: ascii-table.com/ansi-escape-sequences-vt-100.php
formixian
3
@giusti: Obie echo -e "\033[38;05;34;1mHi"i echo -e "\033[38;05;34m\033[1mHi"pracował dla mnie, chociaż anti-aliasing efekty czcionki nie powodują pojawienie się koloru, aby nieco zmienić pod pogrubienie w terminalu I testował to dalej.
Richard
4
\033[Kody SGR ( ) rozpoczynające się od 38 i 48 powinny być oddzielone z innym zastrzeżonym :jako pod-separatorem, chociaż nie jest to całkowicie jasne z głównych źródeł na stronie: ecma-international.org/publications/files/ECMA-ST/Ecma -048.pdf i itu.int/rec/… . Również niektóre interpretacje zapominają o identyfikatorze przestrzeni kolorów w formularzach 2(16M-kolor RGB) / 3(16M-kolor CMY) / 4(??? CMYK) - np. Powinno być \033[38:2::255:255:255mna białym planie 16M, a nie \033[38:2:255:255:255m!
SlySven,
2
Powodem, dla którego mówię o tym, jest to, że kod projektu Mudlet I musi obsługiwać obie formy, a ostatnio podniosłem się do łokci, aby lepiej działał ...
SlySven
4
Chciałem tylko znaleźć listę kolorów ANSI i spędziłem zbyt dużo czasu na czytaniu artykułów na temat „podstawowych terminów kolorów”. Dzięki za świetną rozrywkę! :)
mzuther
14

Co powiesz na:

ECMA-48 - Funkcje kontrolne dla zestawów znaków kodowanych, wydanie 5 (czerwiec 1991 r.) - Standard definiujący kody kontroli kolorów, który najwyraźniej jest obsługiwany również przez xterm.

SGR 38 i 48 były pierwotnie zastrzeżone przez ECMA-48, ale zostały opracowane kilka lat później we wspólnej normie ITU, IEC i ISO, która składa się z kilku części i która (wśród wielu innych rzeczy) dokumentuje SGR Sekwencje kontrolne 38/48 dla koloru bezpośredniego i koloru indeksowanego :

W tej tabeli na stronie Wikipedii znajduje się kolumna dotycząca xtermu dla kodów ucieczki ANSI

sinelaw
źródło
4

Jest to absolutnie związane z twoim terminalem. VTE nie obsługuje migać Jeśli używasz gnome-terminal, tilda, guake, terminator, xfce4-terminali tak dalej, zgodnie z VTE, będziesz nie ma migać.
Jeśli używasz lub chcesz użyć migania na VTE, musisz użyć xterm.
Możesz użyć polecenia infocmp z nazwą terminala:

#infocmp vt100 
#infocmp xterm 
#infocmp vte 

Na przykład :

# infocmp vte
#   Reconstructed via infocmp from file: /usr/share/terminfo/v/vte
vte|VTE aka GNOME Terminal,
    am, bce, mir, msgr, xenl,
    colors#8, cols#80, it#8, lines#24, ncv#16, pairs#64,
    acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
    bel=^G, bold=\E[1m, civis=\E[?25l, clear=\E[H\E[2J,
    cnorm=\E[?25h, cr=^M, csr=\E[%i%p1%d;%p2%dr,
    cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=^J,
    cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
    cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
    dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J,
    el=\E[K, enacs=\E)0, home=\E[H, hpa=\E[%i%p1%dG, ht=^I,
    hts=\EH, il=\E[%p1%dL, il1=\E[L, ind=^J, invis=\E[8m,
    is2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8,
    kDC=\E[3;2~, kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~,
    kLFT=\E[1;2D, kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\E[1;2C,
    kb2=\E[E, kbs=\177, kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB,
    kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, kend=\EOF, kf1=\EOP,
    kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[1;2P,
    kf14=\E[1;2Q, kf15=\E[1;2R, kf16=\E[1;2S, kf17=\E[15;2~,
    kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~,
    kf21=\E[20;2~, kf22=\E[21;2~, kf23=\E[23;2~,
    kf24=\E[24;2~, kf25=\E[1;5P, kf26=\E[1;5Q, kf27=\E[1;5R,
    kf28=\E[1;5S, kf29=\E[15;5~, kf3=\EOR, kf30=\E[17;5~,
    kf31=\E[18;5~, kf32=\E[19;5~, kf33=\E[20;5~,
    kf34=\E[21;5~, kf35=\E[23;5~, kf36=\E[24;5~,
    kf37=\E[1;6P, kf38=\E[1;6Q, kf39=\E[1;6R, kf4=\EOS,
    kf40=\E[1;6S, kf41=\E[15;6~, kf42=\E[17;6~,
    kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~,
    kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~,
    kf49=\E[1;3P, kf5=\E[15~, kf50=\E[1;3Q, kf51=\E[1;3R,
    kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~,
    kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~,
    kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~,
    kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, kf7=\E[18~,
    kf8=\E[19~, kf9=\E[20~, kfnd=\E[1~, khome=\EOH,
    kich1=\E[2~, kind=\E[1;2B, kmous=\E[M, knp=\E[6~,
    kpp=\E[5~, kri=\E[1;2A, kslt=\E[4~, meml=\El, memu=\Em,
    op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, ritm=\E[23m,
    rmacs=^O, rmam=\E[?7l, rmcup=\E[2J\E[?47l\E8, rmir=\E[4l,
    rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m, rs1=\Ec,
    rs2=\E7\E[r\E8\E[m\E[?7h\E[!p\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[?25h,
    sc=\E7, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
    sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p5%t;2%;%?%p7%t;8%;%?%p1%p3%|%t;7%;m%?%p9%t\016%e\017%;,
    sgr0=\E[0m\017, sitm=\E[3m, smacs=^N, smam=\E[?7h,
    smcup=\E7\E[?47h, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m,
    smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n,
    u8=\E[?%[;0123456789]c, u9=\E[c, vpa=\E[%i%p1%dd,
Zatoka Perska
źródło
VTE 0.52 / terminal gnome 3.28 dodaje obsługę migającego tekstu (a więc będzie działał również w innych emulatorach opartych na VTE).
egmont
1

Dla tych, którzy nie uzyskać odpowiednie wyniki innych niż wymienionych języków, jeśli używasz C #, aby wydrukować tekst na konsoli okno (terminal) należy zastąpić „\ 033” z „\ x1B ”. W języku Visual Basic byłby to Chrw (27) .

HolyRandom
źródło