Bagaimana saya bisa mengubah warna xterm saya menggunakan urutan pelarian Ansi?

25

Saya ingin mengubah warna (latar belakang, font, latar depan) dari xterm saya dari commandline. Saya pernah mendengar bahwa ini dapat dilakukan dengan menggunakan urutan pelarian ANSI.

Jika memungkinkan:

  • Bagaimana ini dilakukan?
  • Bisakah saya menggunakan nama warna atau saya harus menggunakan kode RGB mereka?
Nathan Fellman
sumber

Jawaban:

27

Urutan escape ANSI terdiri dari urutan karakter yang dimulai dengan karakter Escape, karakter 27. Karakter berikutnya sering (meskipun tidak selalu) merupakan kurung siku-siku: [

Perintah echo dapat mengirim karakter escape jika Anda menentukan -edan menggunakannya \euntuk escape.

Standar ANSI mendefinisikan 8 warna, ditambah mode cerah, memberikan total 16 kemungkinan. Urutannya adalah:

\e[<number>m

Di mana <number>salah satu dari:

Latar depan:

  • 30 Hitam
  • 31 Merah
  • 32 Hijau
  • 33 Kuning
  • 34 Biru
  • 35 Magenta
  • 36 Cyan
  • 37 Putih

Latar Belakang:

  • 40 Hitam
  • 41 Merah
  • 42 Hijau
  • 43 Kuning
  • 44 Biru
  • 45 Magenta
  • 46 Cyan
  • 47 Putih

  • 0 Setel ulang semua

  • 1 Tebal

Jadi untuk membuat latar depan Anda merah dan latar belakang Anda kuning:

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

Dan untuk mengaktifkan huruf tebal:

$ echo -e "\e[1m"

Tentu saja, Anda dapat menggabungkan semuanya:

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

Ada banyak kode pelarian lainnya untuk melakukan hal-hal lain.

Misalnya - hapus layar dan gerakkan kursor ke kiri atas:

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

Yang berguna saat mengganti warna:

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

Yang akan mengubah warna, menghapus layar, dan meletakkan kursor di kiri atas. Yah, hampir kiri atas. Echo mengembalikan kereta, sehingga bergerak turun garis. Anda dapat menambahkan -ngema untuk mencegah hal ini jika Anda cerewet.

Jika Anda mengacaukan semuanya dan tidak dapat melihat apa yang Anda ketikkan, Anda dapat mengatur ulang warna terminal menjadi normal dengan menekan:

Ctrl+v [ 0 m Return

Apa yang Anda harapkan adalah command prompt. Ini akan mengomel tentang perintah yang tidak dikenal, tetapi Anda akan dapat melihat apa yang Anda lakukan lagi.

Majenko
sumber
dapatkah saya menggunakan nama warna alih-alih kode warna?
Nathan Fellman
1
Tidak, tetapi Anda dapat menetapkan kode warna ke variabel. FGRED = 31; echo -e "\ e [$ {FGRED} m"
Majenko
3
Namun perlu dicatat bahwa beberapa nomor kode warna dapat dipisahkan dengan ";". Jadi untuk membuat latar depan Anda merah dan latar belakang Anda kuning, Anda juga dapat menggunakan yang lebih pendek: echo -ne '\e[31;43m'(bukan yang di atas echo -e "\e[31m\e[43m").
Andreas Spindler
Bagaimana cara mengubah warna kursor ke 34 Biru?
trusktr
28

Perhatikan bahwa Xterms modern mendukung warna 32-bit!

Contoh sederhana. Untuk menetapkan latar belakang ungu tua yang bagus (hei, masing-masing ke miliknya) dengan nilai # 53186f, Anda harus:

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

Perhatikan bahwa ini secara instan mengubah warna seluruh jendela, bukan hanya teks berikutnya. Ini terutama bagus untuk membuat jendela yang jelas berbeda setelah ssh'ing ke server (misalnya). Masukkan 'echo' di atas ke dalam .bashrc Anda dan terminal Anda secara otomatis berubah warna ketika Anda masuk ke server itu (tetapi tidak akan berubah kembali ketika Anda Ctrl-D keluar)

Anda dapat menghabiskan JAM di internet mencari ini - sebagian besar dokumen hanya berbicara tentang 16 warna ANSI asli.

Sumber: http://www.steike.com/code/xterm-colors/ dan http://rtfm.etla.org/xterm/ctlseq.html (lihat di bawah "Kontrol Sistem Operasi")

Harap dicatat: urutan pelarian di atas berlaku untuk XTerms, dan mungkin tidak berfungsi untuk implementasi lain dari emulator terminal windowing "seperti XTerm yang mungkin" terlihat "seperti XTerm. Misalnya, "gnome-terminal" atau "konsole" memiliki urutan escape yang berbeda, atau mungkin tidak menerapkan perubahan warna sama sekali.

Greg
sumber
1
Ini tidak bekerja untuk saya, itu menggemakan garis kosong tanpa perubahan yang terlihat di terminal.
Richard
1
Ini bekerja untuk saya, sedangkan yang lain tidak - sangat membantu, thx
vol7ron
1
+1 mengubah latar belakang jendela, dan memungkinkan nama warna - seperti "hijau" alih-alih "# 00ff00".
Rob I
1
bagaimana # 53186f warna 32-bit. Saya menghitung 24 bit ...
jiggunjer
Adakah yang tahu cara menyelesaikan hal yang sama dengan terminal gnome?
wjandrea
3

Iya nih. Terminal ANSI mendukung Kode Escape ANSI . Masing-masing Control Sequence Introducer( CSI) Kode dalam format berikut:

ESC[<<<CODE>>>

Karakter Ascii 27( ESCkarakter) atau 1bdalam heksadesimal, diikuti oleh tanda kurung siku kiri, dan kemudian sebuah surat yang menunjukkan tindakan yang akan digunakan.

Perhatikan bahwa daftar ;parameter yang terpisah dapat diberikan secara langsung sebelum <<<CODE>>>parameter.

Sekarang, warna menggunakan subset CSIkode, Select Graphic Renditionkode. Ini dalam bentuk:

ESC[<<<SGR>>>m

The SGRkode dilewatkan sebagai parameter CSI. Yang relevan dengan pertanyaan Anda adalah SGRkode 30-49. Kode 30-39 mengatur warna latar depan. Kode 40-49 mengatur warna latar belakang.

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

Kode 38 dan 48 adalah kode khusus. Ini adalah yang memungkinkan Anda untuk menggunakan nilai RGB. Format untuk ini adalah:

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

Catatan: penggunaan alternatif termasuk \x1b[<3 or 4>8;5;<web safe color index>m. Dengan penggunaan ini, ada penyandian warna yang sangat berbeda. Lihat tautan di bagian atas jawaban ini untuk informasi lebih lanjut.

Kode 39 dan 49 mengatur warna foreground dan background menjadi default, yang didefinisikan berdasarkan terminal-per-terminal.

Dalam praktiknya, warna 30-37 40-47 sedikit berbeda dari apa yang label mereka katakan.

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

Untuk mendapatkan warna terang, Anda menggunakan SGI untuk cetak tebal 1,. Bold adalah nama yang menyesatkan. Itu tidak membuat font menjadi tebal. Ini sebenarnya meningkatkan kecerahan teks. Dengan berani diterapkan warna menjadi:

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

Perhatikan: dua blok terakhir dari nomor warna relevan untuk latar depan dan belakang ( <index> + (30 or 40)).

Untuk menghapus semua gaya (kembali ke mode default / normal) gunakan SGR0.

CSIkode tidak semuanya grafis. Misalnya, ESC[2Jakan menghapus terminal Anda. ESC[<y>;<x>Hmengatur posisi kursor (1-diindeks). Lihat artikel wikipedia untuk informasi lebih lanjut.

Catatan: untuk menguji ini, gunakan echo -eatau printf.

Élektra
sumber
2

CATATAN: "^ [" adalah karakter pelarian, dan disisipkan dengan CTRL-V, CTRL- [, dan ^ G adalah karakter bel, dimasukkan dengan CTRL-V, CTRL-G

Blok berikut ada di .bash_profile saya dan memastikan bahwa xterms saya pada sistem ini SELALU putih-hitam, bahkan setelah masuk ke sistem lain yang mungkin telah mengubah warna saya.

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}
--> '
Mike
sumber
0

periksa juga proyek ScriptEchoColor
itu benar-benar dibuat dalam skrip bash
ia memiliki paket untuk ubuntu di sini
tetapi skrip ini dapat diinstal pada distro apa pun jika Anda tahu caranya (terbaru dapat diunduh dari gitnya juga).

Anda dapat menggunakan nama warna yang diperpendek atau diperluas seperti:

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

sebuah sampel: masukkan deskripsi gambar di sini

Juga, pastikan untuk melihat xtermcontrol , untuk kontrol yang lebih luas atas xterm dengan sendirinya (tidak hanya karakter).

Kekuatan Aquarius
sumber
0

Di antara banyak kode ANSI CSI adalah yang disebut SGR, atau Select Graphic Rendition. Ini adalah ESC,, [parameter,, di mmana parameternya adalah satu atau lebih bilangan bulat dalam format ASCII, dipisahkan oleh titik koma. Banyak parameter SGR yang berbeda tercantum pada halaman Wikipedia di atas (meskipun tidak masuk ke detail lengkap untuk semuanya).

Beberapa parameter, seperti 1(tebal atau peningkatan intensitas) dan 31(teks merah) berdiri sendiri, dan dapat digunakan secara individual atau gabungan, seperti dalam ESC[31matau ESC[1;31muntuk memberikan teks standar foreground merah dan tebal, secara berurutan.

Lainnya mengambil parameter sendiri, yang hanya disediakan setelah kode sebagai angka yang lebih dipisahkan koma. Jadi, misalnya, ESC[38;5;219makan menampilkan teks latar depan dalam nomor warna diperluas 219, dan ESC[38;2;150;100;50makan menampilkannya dalam warna dengan nilai RGB 150, 100, 50. Dalam hal ini, 38adalah perintah "extended set foreground color", yang selalu diikuti oleh sebuah perintah tambahan. Subcommand 2mengambil tiga parameter, nilai-nilai komponen merah, hijau dan biru. Secara berbeda, subperintah 5hanya mengambil satu nilai lagi, angka dari 0 hingga 255 yang menentukan warna dari tabel yang dikonfigurasikan dengan terminal.

Fungsi shell berikut dapat berguna untuk menggunakan kode-kode ini:

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

Anda bisa menggunakannya seperti ini:

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

Perhatikan bahwa jika Anda tidak memberikan parameter ke sgr()default untuk kode SGR 0, yang berarti untuk mematikan semua atribut, mengatur ulang teks ke apa pun default untuk terminal itu.

Curt J. Sampson
sumber
1
Secara teknis itu ESC[38... mdan ESC[38... mbisa / harus (tergantung pada sumber informasi Anda - yang paling utama, saya percaya, itu.int/rec/T-REC-T.416-199303-I ) harus menggunakan, jika tidak disediakan, karakter :(untuk memisahkan elemen parameter ) sehingga ;hanya digunakan di antara string parameter lengkap - yaitu ESC[38;2;150;100;50mharus ditulis ESC[38:2::150:100:50m...
SlySven
... sayangnya implementasi sering lupa id ruang warna antara 2dan 150- karena tidak ada seorang pun, yang saya ketahui , pernah mendefinisikan nilai apa yang harus dimasukkan ke sana default kosong yang akan digunakan - tetapi sering dilewatkan dan menggunakan hanya ;sebagai pemisah membuatnya tidak mungkin untuk memproses informasi sesuai dengan spesifikasi.
SlySven