Ansi kaçış dizilerini kullanarak xterm'imin renklerini nasıl değiştirebilirim?


25

Xterm'imin renklerini (arka plan, yazı tipi, ön plan) komut satırından değiştirmek istiyorum. Bunun ANSI kaçış dizileri kullanılarak yapılabileceğini duydum.

Mümkünse:

  • Nasıl oldu?
  • Renk adları kullanabilir miyim yoksa RGB kodlarını mı kullanmalıyım?

Yanıtlar:


27

ANSI çıkış dizileri, Escape karakteri, 27 karakteri ile başlayan bir karakter dizisinden oluşur. Sonraki karakter genellikle (her zaman olmasa da) bir açık köşeli ayraçtır: [

Echo komutu, escape için belirtip -ekullanırsanız kaçış karakterleri gönderebilir \e.

ANSI standardı toplamda 16 olasılık veren 8 renk artı parlak bir mod tanımlar. Sıra:

\e[<number>m

Şunlardan <number>biri:

Ön Plan:

  • 30 Siyah
  • 31 Kırmızı
  • 32 Yeşil
  • 33 Sarı
  • 34 Mavi
  • 35 Kırmızı
  • 36 Mavi
  • 37 Beyaz

Arka fon:

  • 40 Siyah
  • 41 Kırmızı
  • 42 Yeşil
  • 43 Sarı
  • 44 Mavi
  • 45 Kırmızı
  • 46 Mavi
  • 47 Beyaz

  • 0 Tümünü sıfırla

  • 1 Kalın

Bu yüzden ön planınızı kırmızı ve arka planınızı sarı yapmak için:

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

Ve kalın harfleri etkinleştirmek için:

$ echo -e "\e[1m"

Elbette hepsini bir araya getirebilirsiniz:

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

Başka şeyler yapmak için birçok başka kaçış kodu var.

Örneğin - ekranı temizleyin ve imleci sola hareket ettirin:

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

Rengi değiştirirken kullanışlıdır:

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

Renkleri değiştirecek, ekranı temizleyiniz ve imleci sol üst tarafa yerleştiriniz. Neredeyse sol üst. Echo bir vagon dönüşü yapar, böylece bir çizgiden aşağı hareket eder. -nTelaşlıysanız bunu önlemek için yankıya ekleyebilirsiniz .

Hepsini karıştırırsanız ve ne yazdığınızı göremiyorsanız, aşağıdaki tuşlara basarak terminal renklerini normale döndürebilirsiniz:

Ctrl+v [ 0 m Return

Umut ettiğiniz şey komut istemidir. Bilinmeyen bir emir hakkında çıldırır, ancak ne yaptığınızı tekrar görebileceksiniz.


renk kodları yerine renk adlarını kullanabilir miyim?
Nathan Fellman

1
Hayır, ancak renk kodlarını değişkenlere atayabilirsiniz. FGRED = 31; echo -e "\ e [$ {FGRED} m"
Majenko

3
Bununla birlikte, birden fazla renk kodu numarasının ";" ile ayrılabileceği belirtilmelidir. Böylece ön planınızı kırmızı ve arka planınızı sarı yapmak için kısaltmayı da kullanabilirsiniz: echo -ne '\e[31;43m'(yukarıdakilerin yerine echo -e "\e[31m\e[43m").
Andreas Spindler

İmlecin rengini 34 Mavi olarak nasıl değiştiririm?
trusktr

28

Modern Xterms'in 32 bit rengi desteklediğini unutmayın!

Basit bir örnek. Değer # 53186f değerinde güzel bir koyu mor arka plan (her biri kendi başına) ayarlamak için şunları yapın:

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

Bunun yalnızca sonraki metnin değil, tüm pencerenin rengini anında değiştirdiğini unutmayın. Bu, özellikle bir sunucuyu ssh' ettikten sonra (örneğin) bir pencereyi açıkça farklı yapmak için çok hoş. Yukarıdaki 'echo'ları .bashrc içine koyun ve terminaliniz o sunucuya giriş yaptığınızda renkleri otomatik olarak değiştirir (ancak Ctrl-D çıkışında geri dönmeyecektir).

HOURS'i internette bunu aramak için harcayabilirsiniz - çoğu doküman yalnızca orijinal 16 ANSI rengi hakkında konuşur.

Kaynaklar: http://www.steike.com/code/xterm-colors/ ve http://rtfm.etla.org/xterm/ctlseq.html ("İşletim Sistemi Kontrolleri" altına bakın)

Lütfen dikkat: Yukarıdaki kaçış dizisi XTerm'ler için geçerlidir ve bir XTerm gibi "bakabilen" "XTerm benzeri" pencere terminali emülatörlerinin diğer uygulamaları için çalışmayabilir. Örneğin, "gnome-terminal" veya "konsole" farklı kaçış sekanslarına sahiptir veya hiç renk değişikliği uygulayamayabilir.


1
Bu benim için çalışmıyor, terminalde gözle görülür bir değişiklik olmadan boş bir çizgiyi yansıtıyor.
Richard,

1
Bu benim için çalıştı, oysa diğerleri yapmadı - çok yararlı, thx
vol7ron

1
+1, pencere arkaplanını değiştirir ve renk adlarına izin verir - "# 00ff00" yerine "yeşil" gibi.
Rob,

1
# 53186f 32 bit renkler nasıl? 24 bit
sayarım

GNOME ile aynı şeyi nasıl bilen var mı?
wjandrea

3

Evet. ANSI terminalleri ANSI Escape Kodlarını destekler . Her Control Sequence Introducer( CSI) Kod aşağıdaki formatta:

ESC[<<<CODE>>>

Ascii karakteri 27( ESCkarakter) veya 1bonaltılı, ardından bir sol köşeli ayraç ve sonra kullanılacak eylemi gösteren bir harf.

;Ayrılmış parametrelerin bir listesinin doğrudan <<<CODE>>>parametreden önce sağlanabileceğini unutmayın .

Şimdi, renkler bir CSIkod alt kümesi, kodlar kullanır Select Graphic Rendition. Bunlar formda:

ESC[<<<SGR>>>m

SGRKod, bir parametre olarak geçirilir CSI. Sorunuzla ilgili SGR30-49 kodları. Kodlar 30-39 ön plan rengini ayarlar. Kod 40-49, arka plan rengini ayarlar.

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

Kod 38 ve 48 özel kodlardır. Bunlar RGB değerlerini kullanmanıza izin verenlerdir. Bunlar için format:

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

Not: alternatif kullanımlar şunları içerir \x1b[<3 or 4>8;5;<web safe color index>m. Bu kullanım ile tamamen farklı bir renk kodlaması var. Daha fazla bilgi için bu cevabın başındaki linke bakınız.

39 ve 49 kodları, ön ve arka plan renklerini, terminal bazında tanımlanmış olan varsayılan değerlerine ayarlar.

Uygulamada, renkler 30-37 40-47, etiketlerinin söylediklerinden biraz farklıdır.

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

Açık renkler elde etmek için, SGI'yı kalın için kullanın 1. Kalın, yanıltıcı bir addır. Yazı tipini kalın yapmaz. Aslında metnin parlaklığını arttırır. Kalın uygulanmış renkler olur:

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

Dikkat: son iki renk bloğu numaraları hem ön hem de arka planla ilgilidir ( <index> + (30 or 40)).

Tüm stilleri kaldırmak için (varsayılan / normal moda geri dön) SGR0 kullanın .

CSIkodların hepsi grafik değildir. Örneğin, ESC[2Jterminalinizi temizleyecektir. ESC[<y>;<x>Himleç konumunu ayarlar (1 indeksli). Daha fazla bilgi için wikipedia makalesine bakın.

Not: Bunları test etmek için echo -eveya tuşlarını kullanın printf.


2

NOT: "^ [", çıkış karakteridir ve CTRL-V, CTRL- [ve ^ G ile eklenmiş bir zil karakteridir; CTRL-V, CTRL-G ile eklenmiş

Aşağıdaki blok benim .bash_profile dosyamda ve bu sistemdeki xterms'imin renklerimi değiştirebilecek başka bir sisteme giriş yaptıktan sonra bile HER ZAMAN siyah beyaz olmasını sağlıyor.

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

Ayrıca ScriptEchoColor projesini de kontrol edin
, burada
ubuntu için paketleri bulunan bash scriptlerinde tamamen yapılır ancak nasıl yapılacağını biliyorsanız (bu komut en son sayfasından da indirilebilir).

kısaltılmış veya uzatılmış renk adlarını kullanabilirsiniz:

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

Bir örnek: görüntü tanımını buraya girin

Ayrıca, xtermcontrol'e bir göz attığınızdan emin olun , xterm üzerinde daha kapsamlı bir kontrol sağlamak için (sadece karakterler değil).


0

ANSI CSI kodları arasında SGR denilen bir tane veya Grafik Seçimi Seçin. Bu, ESC'dir, [parametreler, mparametrelerin ASCII formatında bir veya daha fazla tam sayı olduğu, noktalı virgüllerle ayrılmış. Birçok farklı SGR parametresi yukarıdaki Vikipedi sayfasında listelenmiştir (her şey için tam olarak ayrıntıya girmese de).

Gibi bazı parametreler 1(kalın veya daha yüksek yoğunluk) ve 31(kırmızı metin) tek başına, ve tek tek veya kombine olarak edilebilir ESC[31mya da ESC[1;31msırasıyla standart kırmızı ve koyu kırmızı ön metni elde edildi.

Diğerleri, kodlardan sonra daha noktalı virgülle ayrılmış sayılar olarak sağlanan parametreleri kendileri alır. Örneğin, ESC[38;5;219mön plan metnini 219 genişletilmiş renkli sayısında ESC[38;2;150;100;50mgörüntüler ve bunu 150, 100, 50 RGB değerine sahip renkli olarak görüntüler 38. bir alt komut. Alt komut 2, kırmızı, yeşil ve mavi bileşenlerin değerleri olan üç parametre alır. Farklı olarak, alt komut 5terminalin yapılandırıldığı bir tablodan bir renk belirten 0 ile 255 arasında bir sayı, sadece bir değer alır.

Aşağıdaki kabuk işlevi bu kodları kullanmak için kullanışlı olabilir:

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

Bu şekilde kullanabilirsiniz:

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

sgr()Varsayılan olarak SGR kod 0'a parametre vermezseniz , tüm özellikleri devre dışı bırakmak anlamına gelir, metni o terminal için varsayılan değerden sıfırlamak anlamına gelir.


1
Teknik olarak bu ESC[38... mve ESC[38... mkutu / should (bilgilerinizde kaynağına bağlıdır - nihai bir varlık, ben inanıyorum, itu.int/rec/T-REC-T.416-199303-I ) kullanmalıdır, aksi takdirde, karakter :( parametre elemanlarını ayırmak için ) öyle ki ;sadece tam parametre dizeleri arasında kullanılır - yani ESC[38;2;150;100;50myazılmalıdır ESC[38:2::150:100:50m...
SlySven

... maalesef uygulamalar çoğu zaman ve ben arasındaki renk boşluğu kimliğini unutuyor - farkında olduğum hiç kimse olarak, orada hangi değerin girilmesi gerektiğini tanımlamıştı, boş varsayılan kullanılacak - ancak çoğu zaman kaçırıldı ve sadece bir ayırıcı olarak kullanılması , bilgiyi şartnameye uygun olarak güvenilir bir şekilde işlemeyi imkansız kılar. 2150;
SlySven
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.