Jak mogę zmienić kolory mojego xtermu za pomocą sekwencji ucieczki Ansi?

25

Chciałbym zmienić kolory (tło, czcionka, pierwszy plan) mojego xtermu z wiersza poleceń. Słyszałem, że można to zrobić za pomocą sekwencji ucieczki ANSI.

Jeśli to możliwe:

  • Jak to jest zrobione?
  • Czy mogę używać nazw kolorów, czy muszę używać ich kodów RGB?
Nathan Fellman
źródło

Odpowiedzi:

27

Sekwencje specjalne ANSI składają się z sekwencji znaków rozpoczynającej się od znaku Escape, postać 27. Następnym znakiem jest często (choć nie zawsze) nawias kwadratowy: [

Polecenie echo może wysyłać znaki zmiany znaczenia, jeśli określisz -ei użyjesz \edo zmiany znaczenia.

Standard ANSI definiuje 8 kolorów plus tryb jasności, dając w sumie 16 możliwości. Sekwencja jest następująca:

\e[<number>m

Gdzie <number>jest jeden z:

Pierwszoplanowy:

  • 30 czarny
  • 31 czerwony
  • 32 zielony
  • 33 żółty
  • 34 niebieski
  • 35 magenta
  • 36 Cyjan
  • 37 Biały

Tło:

  • 40 czarny
  • 41 czerwony
  • 42 zielony
  • 43 Żółty
  • 44 niebieski
  • 45 magenta
  • 46 Cyjan
  • 47 Biały

  • 0 Zresetuj wszystko

  • 1 pogrubienie

Aby twój pierwszy plan był czerwony, a tło żółty:

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

Aby włączyć pogrubienie:

$ echo -e "\e[1m"

Oczywiście możesz połączyć je wszystkie razem:

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

Istnieje wiele innych kodów ucieczki do robienia innych rzeczy.

Na przykład - wyczyść ekran i przesuń kursor w lewy górny róg:

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

Co jest przydatne przy zmianie koloru:

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

Co zmieni kolory, wyczyści ekran i umieści kursor w lewym górnym rogu. Cóż, prawie w lewym górnym rogu. Echo umieszcza powrót karetki, więc przesuwa się wzdłuż linii. Możesz dodać -ndo echa, aby temu zapobiec, jeśli jesteś wybredny.

Jeśli wszystko zepsujesz i nie widzisz, co piszesz, możesz zresetować kolory terminala do normalnego, naciskając:

Ctrl+v [ 0 m Return

Na nadzieję, że masz wiersz polecenia. Będzie krzyczeć na nieznane polecenie, ale będziesz mógł zobaczyć, co robisz ponownie.

Majenko
źródło
czy mogę używać nazw kolorów zamiast kodów kolorów?
Nathan Fellman,
1
Nie, ale możesz przypisać kody kolorów do zmiennych. FGRED = 31; echo -e "\ e [$ {FGRED} m"
Majenko,
3
Należy jednak zauważyć, że wiele numerów kodów kolorów można oddzielić znakiem „;”. Aby twój pierwszy plan był czerwony, a tło żółty, możesz również użyć krótszego: echo -ne '\e[31;43m'(zamiast powyższego echo -e "\e[31m\e[43m").
Andreas Spindler
Jak zmienić kolor kursora na 34 Niebieski?
trusktr
28

Pamiętaj, że nowoczesne Xterms obsługują 32-bitowy kolor!

Prosty przykład. Aby ustawić ładne ciemnofioletowe tło (hej, każdy dla siebie) o wartości # 53186f, wykonujesz:

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

Zauważ, że to natychmiast zmienia kolor całego okna, a nie tylko kolejnego tekstu. Jest to szczególnie przydatne do tego, aby okno wyraźnie się różniło po ssh'ing do serwera (na przykład). Umieść powyższe „echo” w swoim .bashrc, a twój terminal automatycznie zmieni kolory po zalogowaniu się na tym serwerze (ale nie zmieni się z powrotem po wylogowaniu z Ctrl-D)

Możesz spędzić GODZINY w sieci, szukając tego - większość dokumentów mówi tylko o oryginalnych 16 kolorach ANSI.

Źródła: http://www.steike.com/code/xterm-colors/ i http://rtfm.etla.org/xterm/ctlseq.html (patrz „Elementy sterujące systemu operacyjnego”)

Uwaga: powyższa sekwencja ucieczki jest ważna dla XTerms i może nie działać w przypadku innych implementacji emulatorów terminalu okienkowego typu „XTerm”, które mogą „wyglądać” jak XTerm. Na przykład „terminal gnome” lub „konsola” mają różne sekwencje specjalne lub mogą wcale nie wprowadzać zmiany kolorów.

Greg
źródło
1
To nie działa dla mnie, wyświetla echo pustej linii bez widocznych zmian w terminalu.
Richard,
1
To działało dla mnie, podczas gdy inni nie - bardzo pomocni, dzięki
vol7ron
1
+1 zmienia tło okna i dopuszcza nazwy kolorów - na przykład „zielony” zamiast „# 00ff00”.
Rob I
1
jak to jest # 53186f 32-bitowe kolory. Liczę 24 bity ...
jiggunjer
Czy ktoś wie, jak osiągnąć to samo z terminalem gnome?
wjandrea
3

Tak. Terminale ANSI obsługują kody ucieczki ANSI . Każdy Control Sequence Introducer( CSI) kod w następującym formacie:

ESC[<<<CODE>>>

Znak Ascii 27( ESCznak) lub 1bszesnastkowy, następnie lewy nawias kwadratowy, a następnie litera oznaczająca akcję, która ma zostać użyta.

Należy pamiętać, że lista ;oddzielnych parametrów może zostać dostarczona bezpośrednio przed <<<CODE>>>parametrem.

Teraz kolory używają podzbioru CSIkodów, Select Graphic Renditionkodów. Są to w formie:

ESC[<<<SGR>>>m

SGRKod jest przekazywana jako parametr w CSI. Odpowiednie dla twojego pytania są SGRkody 30-49. Kody 30–39 ustawiają kolor pierwszego planu. Kody 40–49 ustawiają kolor tła.

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

Kody 38 i 48 są kodami specjalnymi. Są to te, które pozwalają na użycie wartości RGB. Ich format to:

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

Uwaga: alternatywne zastosowania obejmują \x1b[<3 or 4>8;5;<web safe color index>m. Przy takim użyciu istnieje zupełnie inne kodowanie kolorów. Aby uzyskać więcej informacji, zobacz link u góry tej odpowiedzi.

Kody 39 i 49 ustawiają domyślne kolory pierwszego planu i tła, które są definiowane na zasadzie terminal-terminal.

W praktyce kolory 30–37 40–47 różnią się nieznacznie od tych, które podają na etykietach.

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

Aby uzyskać jasne kolory, należy użyć SGI odważne, 1. Pogrubienie to mylące imię. Nie pogrubia czcionki. W rzeczywistości zwiększa jasność tekstu. Po zastosowaniu pogrubienia kolory stają się:

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

Uwaga: ostatnie dwa bloki liczb kolorów odnoszą się zarówno do przedniego, jak i do tła ( <index> + (30 or 40)).

Aby usunąć wszystkie style (powrót do trybu domyślnego / normalnego), użyj SGR0.

CSIkody nie są wszystkie graficzne. Na przykład ESC[2Jwyczyści twój terminal. ESC[<y>;<x>Hustawia pozycję kursora (1-indeksowany). Więcej informacji znajduje się w artykule na Wikipedii.

Uwaga: aby je przetestować, użyj echo -elub printf.

Élektra
źródło
2

UWAGA: „^ [” jest znakiem ucieczki i jest wstawiany z CTRL-V, CTRL- [, a ^ G to znak dzwonka, wstawiany z CTRL-V, CTRL-G

Poniższy blok znajduje się w moim .bash_profile i zapewnia, że ​​moje xtermy w tym systemie ZAWSZE są biało-czarne, nawet po zalogowaniu się do innego systemu, który mógł zmienić moje kolory.

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}
--> '
Mikrofon
źródło
0

sprawdź także projekt ScriptEchoColor
jest on w całości wykonany w skryptach bash
, ma tutaj pakiety dla Ubuntu ,
ale te skrypty można zainstalować na dowolnej dystrybucji, jeśli wiesz, jak to zrobić (najnowszą wersję można również pobrać z jej git).

możesz użyć skróconych lub rozszerzonych nazw kolorów, takich jak:

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

próbka: wprowadź opis zdjęcia tutaj

Upewnij się także, że rzucisz okiem na xtermcontrol , aby uzyskać szerszą kontrolę nad samym xtermem (nie tylko postaciami).

Wodnik Moc
źródło
0

Wśród wielu kodów ANSI CSI jest jeden o nazwie SGR lub Select Graphic Rendition. Jest to ESC, [parametry, mgdzie parametrami są jedna lub więcej liczb całkowitych w formacie ASCII, oddzielone średnikami. Wiele różnych parametrów SGR znajduje się na powyższej stronie Wikipedii (choć nie dla wszystkich z nich szczegółowo).

Niektóre parametry, takie jak 1(pogrubienie lub zwiększenie intensywności) i 31(czerwony tekst) są niezależne i mogą być używane osobno lub łącznie, tak jak w ESC[31mlub w ESC[1;31mcelu uzyskania odpowiednio czerwonego i pogrubionego czerwonego tekstu pierwszego planu.

Inni sami przyjmują parametry, które są po prostu podawane po kodzie jako liczby oddzielone średnikami. Na przykład ESC[38;5;219mwyświetlałby tekst pierwszego planu w rozszerzonym kolorze o numerze 219 i ESC[38;2;150;100;50mwyświetlałby go w kolorze o wartości RGB 150, 100, 50. W tym przypadku 38jest to polecenie „rozszerzonego zestawu kolorów pierwszego planu”, po którym zawsze następuje podkomenda. Podkomenda 2przyjmuje trzy parametry, wartości składników czerwonego, zielonego i niebieskiego. Inaczej podkomenda 5przyjmuje tylko jedną wartość, liczbę od 0 do 255 określającą kolor z tabeli, w której skonfigurowany jest terminal.

Następująca funkcja powłoki może być przydatna do używania tych kodów:

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

Możesz użyć tego w następujący sposób:

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)."

Zauważ, że jeśli nie podasz żadnych parametrów sgr(), domyślnie jest to kod SGR 0, co oznacza wyłączenie wszystkich atrybutów, resetowanie tekstu do wartości domyślnych dla tego terminalu.

Curt J. Sampson
źródło
1
Technicznie tych ESC[38... mi ESC[38... mpuszka / powinien (zależy od źródła informacji - ostateczny jeden byt, ja wierzę, itu.int/rec/T-REC-T.416-199303-I ) należy użyć, w przeciwnym razie zastrzeżony, znak :(w celu oddzielenia elementów parametru ), aby ;był używany tylko między kompletnymi ciągami parametrów - tj. ESC[38;2;150;100;50mpowinien być zapisany ESC[38:2::150:100:50m...
SlySven
... niestety implementacje często zapominają o identyfikatorze przestrzeni kolorów między 2i 150- ponieważ nikt, o czym jestem świadomy , nigdy nie zdefiniował, jaką wartość należy tam wprowadzić, należy użyć pustej wartości domyślnej - ale często jest pomijany a użycie tylko ;jako separatora uniemożliwia niezawodne przetwarzanie informacji zgodnie ze specyfikacją.
SlySven