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?

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.


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.


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.


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}
--> '

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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.