dukungan tmux, TERM dan 256 warna

48

pengantar

Pertanyaan saya muncul dari perlunya memahami mengapa saya sekarang (setelah beberapa percobaan) Terminal dan tmux mendukung 256 warna dan tput colorsmengatakan kepada saya hanya ada 8 dari mereka.


Latar Belakang

Mari kita mulai dari awal.

Saya menggunakan kotak Ubuntu , Guake , tmux , Vim dan saya suka tema Solarized . Mereka terlihat sangat mengerikan, jadi saya memutuskan untuk mengaktifkan dukungan 256 warna dan sedikit bermain-main.

Mari kita lihat apa yang terjadi pada Terminal saya . tput colorsmengatakan ada 8 warna. Saya pribadi mengaturnya menjadi ungu, di sebelah kiri, dan tentu saja di sebelah kanan kita memiliki 2 warna biru yang berbeda. $TERMkata xterm. (Untuk memiliki warna lssaya eval ini di .bashrc.)

masukkan deskripsi gambar di sini

Vim juga terlihat baik-baik saja, meskipun saya menyebutnya dengan 256bendera di lingkungan di mana 256 warna tidak didukung.

set t_Co=256
let g:solarized_termcolors=256
colorscheme solarized

Satu-satunya pria yang mengeluh tentang ruang warna berkurang adalah tmux . Memanggil tmuxmemberikan hasil yang diharapkan "salah".

masukkan deskripsi gambar di sini

Tetapi memanggil tmuxdengan -2bendera membuat semuanya bekerja dengan baik, secara ajaib .

masukkan deskripsi gambar di sini

Sekarang satu-satunya hal yang saya mengerti adalah yang -2setara dengan export TERM=screen-256color( sumber ).

Guake berperilaku analog dengan Terminal dan keduanya menjawab xtermpertanyaan itu echo $TERM.


Pertanyaan

Pada dasarnya, adakah yang mengerti mengapa semuanya bekerja bahkan jika tidak?

  • Apakah saya sadis bahwa saya mengeluh mengapa sesuatu bekerja? Mungkin.
  • Apakah ada alasan yang lebih baik? Tentu: Saya ingin memperbaiki tampilan kotak Ubuntu lainnya di kantor saya, dan saya ingin memahami mengapa semuanya bekerja atau tidak.

Eksperimen tambahan

Menjalankan skrip ini (sedikit dimodifikasi) pada saya xtermmemberikan hasil berikut: 256 warna, tetapi hanya 16 yang ditampilkan dengan benar.

masukkan deskripsi gambar di sini

Kemudian, mengubah profil terminal, juga 16 warna ini berubah.

masukkan deskripsi gambar di sini

Tes lebih lanjut mengikuti.

Dari kiri ke kanan, atas ke bawah, kami memiliki tema warna Terpolarisasi , dircolor ansi-darkdan 256dark, kemudian skema warna default ( Tango ), dircolor ansi-darkdan 256dark.

masukkan deskripsi gambar di sini

Pengamatan : secara teori skema warna dircolor ansi-darkon Solarized harus cocok dengan dircolor 256dark. Ini tidak jelas terjadi untuk file yang terdaftar spesifik. Sebaliknya, ini cukup terjadi ketika di direktori kerja ada folder , file teks dan tautan simbolik . Kesimpulan : tidak banyak perhatian yang dibayarkan saat mengkode 256darkwarna.


Kesimpulan awal

xtermmendukung 256 warna, terlepas dari apa yang tput colorsdikatakan. Program dapat merujuk pada ansipalet (dapat disesuaikan oleh pengguna) atau menentukan warna mereka, memilih dari total 256 warna.

Atcold
sumber
1
Baca jawaban ini dan komentar di bawahnya. Apakah itu menjawab pertanyaan Anda? Lihat juga skrip ini untuk mendapatkan jumlah warna asli yang didukung.
terdon
Hum ... Saya masih sedikit bingung ... Tapi, saya kira saya setidaknya mengerti itu tput colorsadalah tes yang tidak dapat diandalkan. Bisakah Anda memeriksa kesimpulan awal saya ?
Atcold
2
Bacaan saya atas jawaban Gille adalah bahwa tput colorshanya dapat mengembalikan satu nilai dan di terminal yang mendukung 2,8,16,88 atau 256 warna, hanya nilai pertama (8 dalam kasus Anda) yang dikembalikan. Untuk mendapatkan nilai sebenarnya, gunakan skrip dari komentar terakhir saya. Apa yang kembali?
terdon
Periksa eksperimen tambahan saya di atas :)
Atcold
Ah, maaf, salahku.
terdon

Jawaban:

33

Ada beberapa informasi tentang dukungan 256-warna di FAQ tmux .

Mendeteksi jumlah warna yang didukung terminal sayangnya tidak mudah, karena alasan historis. Lihat Memeriksa berapa banyak warna yang didukung oleh emulator terminal saya untuk penjelasan. Ini artinya

  • tmux tidak dapat secara andal menentukan apakah terminal mendukung lebih dari 8 warna;
  • tmux tidak dapat berkomunikasi dengan andal ke aplikasi yang mendukung lebih dari 8 warna.

Ketika Anda berada di tmux, terminal yang berinteraksi dengan Anda adalah tmux. Itu tidak mendukung semua urutan kontrol xterm. Secara khusus, itu tidak mendukung OSC 4 ; …urutan kontrol untuk kueri atau menetapkan nilai warna. Anda perlu menggunakannya saat langsung berjalan di xterm, di luar tmux.

Jika Anda menjalankan tmux -2, maka tmux dimulai dengan dukungan 256-warna, bahkan jika itu tidak berpikir bahwa terminal Anda mendukung 256 warna (yang sangat umum).

Secara default, tmux mengiklankan dirinya sendiri screentanpa dukungan 256 warna. Anda dapat mengubah nilai TERMdalam .tmux.confuntuk menunjukkan dukungan 256 warna:

set -g default-terminal "screen-256color"

Anda dapat menggunakan TERM=xterm-256coloratau TERM=screen-256colordi Ubuntu. Nilai-nilai ini hanya akan menyebabkan masalah jika Anda masuk ke mesin jarak jauh yang tidak memiliki entri termcap / terminfo untuk nama-nama ini. Anda dapat menyalin entri ke direktori home Anda di mesin jarak jauh; ini bekerja dengan sebagian besar implementasi terminfo modern.

# From the Ubuntu machine to a machine that doesn't have *-256color terminfo entries
ssh somewhere.example.com mkdir -p .terminfo/s .terminfo/x
scp -p /lib/terminfo/s/screen-256color somewhere.example.com:.terminfo/s/
scp -p /lib/terminfo/x/xterm-256color somewhere.example.com:.terminfo/x/
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya menghargai penjelasannya, tapi saya tidak yakin itu menargetkan pertanyaan saya .. Ya, saya setuju bahwa pertanyaan saya cukup luas, tetapi saya tidak berfokus secara khusus pada tmux . Sebenarnya, tmux adalah satu-satunya pria yang berperilaku sesuai harapan. Apa yang jauh lebih misterius adalah bagaimana xtermbisa menunjukkan kepada saya 256 warna meskipun tput colorsmengatakan 8. Saya kira jawaban untuk pertanyaan khusus ini telah ditanggapi oleh @terdon dalam komentarnya untuk pertanyaan itu sendiri.
Atcold
@Atcold Ini pertanyaan panjang, tapi sejauh yang saya tahu saya sudah menjawabnya. Bagian-bagian yang tidak terkait tmux dicakup oleh jawaban yang terhubung dengan saya dan terdon (dan yang saya tulis). Pertanyaan Anda akan menjadi duplikat dari pertanyaan itu jika bukan karena aspek tmux. Apa lagi yang Anda harapkan dari sebuah jawaban?
Gilles 'SO- stop being evil'
1
@ Gilles , aku tidak ingin terdengar kejam. Saya mencoba mengakreditasi @terdon hal "jawaban yang diterima", meskipun ia merujuk pada jawaban Anda dalam pertanyaan lain. Meskipun demikian, set -g default_terminal "screen-256color"perintah ini tidak cukup untuk mengaktifkan 256 warna dalam tmux . Anda perlu alias tmux='export TERM=screen-256color; /usr/bin/tmux'( referensi ).
Atcold
@Atcold Tidak, alias tidak diperlukan (saya diuji). Lebih jauh lagi, alias ini tidak masuk akal: ia berpura-pura tmux bahwa itu berjalan di dalam layar atau tmux. Namun, Anda harus menjalankan tmux -2sesuai paragraf saya sebelumnya, jika tmux tidak berpikir terminal Anda saat ini mendukung 256 warna, jadi alias tmux='tmux -2'masuk akal.
Gilles 'SO- stop being evil'
2
@Atcold Jawaban U&L itu TERM=xterm-256color tmux, yang masuk akal, tidak seperti TERM=screen-256color tmux. tmux -2lebih unggul karena berfungsi meskipun screen-256colortidak ada dalam basis data terminfo lokal.
Gilles 'SO- stop being evil'
20

Saya terkesan dengan betapa kayanya format dan detail jawaban (dan pertanyaannya!). Sementara mereka memberikan info dan solusi berharga tentang alat yang Anda sebutkan, mereka memberikan sedikit sekali wawasan tentang apa yang sedang terjadi , dan, yang paling penting, mengapa hal-hal (agak) bekerja untuk beberapa alat ketika mereka seharusnya tidak melakukannya.

Jadi, inilah beberapa wawasan tentang pertanyaan mendasar Anda:

  • Apa yang didukung terminal dan apa yang dilaporkan adalah hal yang berbeda. Terminal Gnome misalnya mampu menampilkan 256 warna, tetapi ia mengumumkan dirinya ke lingkungan (via $TERMvariabel) sebagai xtermemulator (8 warna).

  • Alat-alat seperti tputikuti apa pun TERMyang diatur ke: tput colorsdapat mencetak 8, sementara env TERM=xterm-256color tput colorsakan mencetak 256, terlepas dari apakah terminal Anda benar-benar mendukung kemampuan tersebut.

  • vimjuga mengikuti TERMsecara default, tetapi seperti yang Anda katakan untuk menggunakan 256 warna (melalui bendera atau set t_Co=256), itu akan menggunakan 256 warna. Dan itu berfungsi karena terminal Anda benar-benar mendukungnya .

  • tmux, seperti halnya Terminal Gnome, juga secara default melaporkan dirinya sebagai terminal 8-warna. Tapi, tidak seperti Terminal Gnome, itu hanya memungkinkan kemampuan 256-warna jika Anda menggunakan -2flag, yang juga membuatnya melaporkan dirinya sebagai xterm-256coloremulator yang kompatibel.

  • xterm, seperti pada perangkat lunak terminal emulator untuk X11 , pasti mendukung 256 warna. Tapi xtermseperti dalam TERM=xterm8-warna "standar". Itu berarti kemampuan aslinya xterm . Ketika ditingkatkan untuk mendukung 256 warna, dahulu kala, ia menciptakan xterm-256coloristilah untuk itu.

Jadi semuanya bermuara pada:

  • Kemampuan apa yang sebenarnya didukung terminal Anda (dan diaktifkan untuk melakukannya)

  • Cara melaporkan kemampuan seperti itu ke lingkungan melalui TERM

  • Bagaimana alat menafsirkan TERMdan menyesuaikan diri sesuai.

  • Seperti yang dapat Anda simpulkan dari yang di atas, hindari memalu export TERM=xterm-256colordalam ~/.bashrcskrip Anda dan semacamnya . Ketika file-file tersebut dieksekusi terlepas dari terminal yang sebenarnya Anda gunakan, itu akan membuat semua terminal Anda, termasuk koneksi jarak jauh dari Windows dengan Putty, terminal konsol Linux, dll., Melaporkan diri mereka sebagai kompatibel xterm-256color. Yang mungkin benar untuk beberapa orang tetapi tentu saja tidak untuk semua. Misalnya, gettykonsol linux yang Anda akses CTRL+ALT+1..6, tidak.

  • Terminal harus melaporkan diri mereka sebagai "standar" yang paling cocok dengan mereka. Jika Anda tahu mereka dapat menangani 256 warna, konfigurasikan untuk mengiklankannya.

Terakhir namun tidak sedikit, bacaan yang menakjubkan tentang TERMdan 256 warna adalah:

http://blog.sanctum.geek.nz/term-strings/

http://blog.sanctum.geek.nz/256-colour-terminals/

MestreLion
sumber
Satu atau dua contoh skenario akan menjadi tambahan yang bagus untuk jawaban ini.
Elijah Lynn
5

Saya akan memberikan jawaban komplementer yang hanya membahas eksperimen tambahan Anda sejauh yang terkait dengan warna direktori terlarut .

Mempersiapkan

Kami memiliki keluaran warna yang sama dari skrip uji. Satu-satunya perbedaan adalah bahwa saya digunakan lxterminalpada Openbox dengan ramping , xcompmgr dan tidak ada DM. Karenanya saya tidak dapat dengan mudah mengatur palet kustom seperti yang Anda lakukan karena emulator terminal tidak menawarkan pengaturan tersebut dalam GUI dan tidak ada tema khusus untuk itu (yang hanya ada untuk beberapa terminal emulator). Jadi saya hanya menggunakan beberapa transparensi, terminal yang tidak didekorasi dan yang biru sebagai warna latar depan dengan latar belakang Gentoo biru . Karena saya tidak dapat menggunakan versi ansi dari file warna, saya fokus secara eksklusif untuk mendapatkan hasil dengan dircolors.256darkversi sederhana "terdegradasi".

Saya menggunakan konfigurasi yang relevan berikut dan Inconsolata huruf menengah:

echo $TERM
xterm

.bashrc:
eval `dircolors /path/to/dircolors.256dark`

.vimrc:
set t_Co=256
let g:solarized_termcolors=256
syntax enable
set background=dark
colorscheme solarized

.tmux.conf:
nothing at all related to colors!
start tmux with "tmux -2"

Dircolors

Gambar di bawah ini menunjukkan apa yang terjadi di dalam dan di luar tmux dengan pengaturan ini. Yang ketiga pertama ke kiri menunjukkan windows lxterminal undecorated ditumpuk secara vertikal (3). Di sebelah kanan Anda memiliki rakitan tmux yang menunjukkan program identik yang sama (3) Saya juga menyertakan 1 solarized yang menampilkan nano menggunakan file .Xresources yang disertakan dalam paket lengkap (dan mencicipi dengan ):xtermxrdb -load ~/.Xresources

masukkan deskripsi gambar di sini silakan klik kanan / lihat gambar untuk memeriksa dengan resolusi penuh

Terminal pertama di sudut kiri atas menampilkan warna direktori default. Tepat di bawah ini adalah versi solarized yang terdegradasi . Kecuali untuk pink di latar belakang biru untuk .cfile yang saya tambahkan, itu identik dengan apa yang diharapkan dari ini (lihat gambar di bawah untuk referensi). Dibandingkan dengan default, itu dibangun lebih lanjut pada atribut yang diperluas yaitu tebal / terang / mundur dll dan warnanya berbeda jelas. Penetapan warna default untuk .txtfile dalam banyak distribusi berwarna hijau, tetapi seharusnya berwarna abu-abu saat disatukan . File ansi yang merender file .txt sebagai warna hijau tidak dapat ditampilkan dengan benar atau tidak ditampilkan sama sekali. Hasil sisi kanan yang Anda tunjukkan adalah yang benar (256dark) dalam kaitannya dengan referensi berikut:

masukkan deskripsi gambar di sini peta referensi dircolors "terdegradasi" terlarutkan

Pengamatan

Dengan konfigurasi yang saya gunakan, hasilnya tampak identik di dalam dan di luar tmux (saya telah membalikkan komentar (#) in vi tetapi jika tidak, plugin berperilaku sebagaimana mestinya dan multiplexer tidak berdampak pada ini). Font memainkan peran besar dalam definisi fitur yang solarized , dan font yang baik diperlukan untuk memaksimalkan pengalaman. The solarized warna direktori menggunakan 256dark berkas sesuai referensi dan tidak memerlukan konfigurasi emulator tertentu terminal.


Kesimpulan

Sebenarnya rendering ansi dari warna direktori sama sekali berbeda dari degradasi yang terdegradasi (256dark). Sedemikian rupa sehingga di bawah file ansi .txt berwarna hijau. Satu tidak dapat digunakan untuk memvalidasi rendering yang lain. Kedua solusi memerlukan konfigurasi yang berbeda dan menghasilkan hasil yang sama sekali berbeda.


sumber
"Saya tidak mengerti kesimpulan Anda tentang tidak banyak perhatian telah dibayarkan pada pengkodean 256dark di mana sebenarnya itu satu-satunya file warna yang menghasilkan daftar direktori terlarut?" Kebingungan saya muncul dari kenyataan bahwa saya mempertimbangkan ansi-darkoutput yang benar (karena menggunakan versi yang tidak terdegradasi). Kemudian, jika Anda mengambil referensi dari output 256dark, maka Anda memiliki pola pikir terbalik.
Atcold
"Dengan konfigurasi yang saya gunakan, hasilnya tampak identik di dalam dan di luar tmux" Tentu, jika Anda menggunakan 256 warna, maka tentu saja, mereka akan merender dengan cara yang sama di mana pun Anda memiliki 256 warna dukungan. "Tidak jelas apa solusi ansi lebih lanjut akan memberikan dalam konteks ini ..." Hasilnya akan memiliki Solarisasi sejati mereka (bukan perkiraan).
Atcold
Saya mengerti. Saya belum meneliti bagian ansi benar-benar jadi saya tidak bisa memahami dari mana Anda berasal. Bagaimanapun saya menemukan Q Anda cukup memungkinkan, terima kasih. Mungkin saya akan menggunakan vi lagi sekarang saya merasa cukup lol. Adapun hasil ansi, sebenarnya sekarang saya telah melihat tampilannya ... mereka hanya menampilkan itu untuk dir-warna di sini . Mengapa h. apakah mereka memiliki pengkodean berbeda di bawah itu ... Maksudku, aku melihat .txt hijau ... bagaimana abu-abu dekat dengan hijau? Saya tidak mengerti proyek mereka dengan serius.
Ya, saya menghubungi penulis secara pribadi dan jawabannya adalah "itu adalah kustomisasi pribadinya, karena dia suka seperti itu". Saya terdiam ... Saya senang Q saya membantu seseorang :)
Atcold