Supporto per tmux, TERM e 256 colori


48

introduzione

La mia domanda nasce dalla necessità di capire perché ora ho (dopo più prove) Terminal e tmux che supportano 256 colori e tput colorsmi dicono che ce ne sono solo 8.


sfondo

Cominciamo dall'inizio.

Sto usando una scatola Ubuntu , Guake , tmux , Vim e adoro il tema Solarized . Sembravano orribili, quindi ho deciso di abilitare il supporto a 256 colori e giocare un po '.

Vediamo cosa succede per il mio terminale . tput colorsdice che ci sono 8 colori. Personalmente li imposto sul viola, a sinistra, e ovviamente a destra abbiamo 2 diverse tonalità di blu. $TERMdice xterm. (Per avere l' lsio colorato eval questo nel mio .bashrc.)

inserisci qui la descrizione dell'immagine

Anche Vim ha un bell'aspetto, nonostante il fatto che io lo chiami con la 256bandiera in un ambiente in cui 256 colori non sono supportati.

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

L'unico ragazzo che si lamenta dello spazio cromatico ridotto è tmux . La chiamata tmuxfornisce i risultati previsti "errati".

inserisci qui la descrizione dell'immagine

Ma chiamare tmuxcon la -2bandiera fa funzionare tutto bene, magicamente .

inserisci qui la descrizione dell'immagine

Ora l'unica cosa che capisco è che -2è equivalente a export TERM=screen-256color( fonte ).

Guake si comporta in modo analogo a Terminal ed entrambi rispondono xtermalla domanda echo $TERM.


Domanda

Fondamentalmente, qualcuno capisce perché tutto funziona anche se non dovrebbe?

  • Sono sadico di lamentarmi perché le cose funzionano? Può essere.
  • C'è una ragione migliore? Certo: vorrei correggere l'aspetto di altre scatole di Ubuntu nel mio ufficio e vorrei capire perché le cose funzionano o non funzionano.

Esperimenti aggiuntivi

L'esecuzione di questo script (leggermente modificato) su my xtermfornisce il seguente risultato: 256 colori, ma solo 16 vengono visualizzati correttamente.

inserisci qui la descrizione dell'immagine

Quindi, cambiando il profilo del terminale, cambiano anche questi 16 colori.

inserisci qui la descrizione dell'immagine

Altri test stanno seguendo.

Da sinistra a destra, dall'alto verso il basso, abbiamo il tema del colore Solarizzatodircolor ansi-dark e 256dark, quindi, la combinazione di colori predefinita ( Tango ) dircolor ansi-darke 256dark.

inserisci qui la descrizione dell'immagine

Osservazione : in teoria la combinazione di colori dircolor ansi-darksu Solarized dovrebbe corrispondere strettamente alla dircolor 256dark. Ciò non sta chiaramente accadendo per i file elencati specifici. Invece, questo accade abbastanza quando nella directory di lavoro ci sono cartelle , file di testo e collegamenti simbolici . Conclusione : non è stata prestata molta attenzione alla codifica dei 256darkcolori.


Conclusioni preliminari

xtermsupporta 256 colori, nonostante ciò che tput colorsdice. I programmi possono fare riferimento alla ansitavolozza (personalizzabile dall'utente) o definirne i colori, scegliendo tra un totale di 256 colori.


1
Leggi questa risposta e i commenti sottostanti. Risponde alla tua domanda? Dai un'occhiata anche a questo script per ottenere il numero reale di colori supportati.
terdon

Hum ... Sono ancora un po 'confuso ... Ma, credo di capire almeno che tput colorsè un test inaffidabile. Potresti controllare le mie conclusioni preliminari ?
Atcold

2
La mia lettura della risposta di Gilleś è che tput colorspuò restituire solo un valore e nei terminali che supportano 2,8,86,88 o 256 colori, viene restituito solo il primo valore (8 nel tuo caso). Per ottenere il vero valore usa lo script dal mio ultimo commento. Cosa ritorna?
terdon

Controlla i miei esperimenti aggiuntivi sopra :)
Atcold

Ah, scusa, mio ​​male.
Terdon

Risposte:


33

Ci sono alcune informazioni sul supporto a 256 colori nelle FAQ di tmux .

Rilevare il numero di colori supportati dal terminale non è purtroppo semplice, per ragioni storiche. Vedere Verifica di quanti colori supporta il mio emulatore di terminale per una spiegazione. Ciò significa che

  • tmux non può determinare in modo affidabile se il terminale supporta più di 8 colori;
  • tmux non può comunicare in modo affidabile all'applicazione che supporta più di 8 colori.

Quando sei in tmux, il terminale con cui interagisci è tmux. Non supporta tutte le sequenze di controllo di xterm. In particolare, non supporta la OSC 4 ; …sequenza di controllo per eseguire query o impostare valori di colore. È necessario utilizzarlo mentre si esegue direttamente in xterm, al di fuori di tmux.

Se esegui tmux -2, tmux inizia con il supporto a 256 colori, anche se non pensa che il tuo terminale supporti 256 colori (il che è abbastanza comune).

Per impostazione predefinita, tmux si pubblicizza come screensenza supporto a 256 colori. È possibile modificare il valore di TERMin .tmux.confper indicare il supporto a 256 colori:

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

Puoi usare TERM=xterm-256coloro TERM=screen-256colorsu Ubuntu. Questi valori causeranno problemi solo se si accede a un computer remoto che non ha una voce termcap / terminfo per questi nomi. È possibile copiare le voci nella directory principale sul computer remoto; funziona con le più moderne implementazioni terminfo.

# 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/

Apprezzo molto la spiegazione, ma non sono sicuro che sia indirizzata alla mia domanda .. Beh, sono d'accordo sul fatto che la mia domanda fosse piuttosto ampia, ma non mi concentravo specificamente su tmux . In realtà, tmux era l'unico ragazzo che si stava comportando secondo le aspettative. Ciò che è stato molto più misterioso è stato come è xtermstato in grado di mostrarmi 256 colori, anche se tput colorsdiceva 8. Credo che la risposta a questa domanda specifica sia stata indirizzata da @terdon nei suoi commenti alla domanda stessa.
Atcold,

@Atcold È una domanda lunga, ma per quanto ne so, ho risposto. Le parti non correlate a tmux sono coperte dalla risposta che io e terdon abbiamo collegato (e che ho scritto). La tua domanda sarebbe stata un duplicato di quella se non fosse stata per l'aspetto tmux. Cosa ti aspettavi di più da una risposta?
Gilles 'SO-smetti di essere malvagio' il

1
@Gilles , non volevo sembrare cattivo. Stavo cercando di accreditare a @terdon la cosa della "risposta accettata", anche se si riferisce alla tua risposta in un'altra domanda. Nonostante ciò, il set -g default_terminal "screen-256color"comando non è sufficiente per abilitare i 256 colori in tmux . Devi alias tmux='export TERM=screen-256color; /usr/bin/tmux'( riferimento ).
Atcold,

@Atcold No, l'alias non è necessario (ho testato). Inoltre questo alias non avrebbe senso: fa finta di essere in esecuzione all'interno dello schermo o di tmux. Tuttavia, è necessario eseguire tmux -2come nel mio paragrafo precedente, se tmux non pensa che il tuo terminale corrente supporti 256 colori, quindi alias tmux='tmux -2'avrebbe senso.
Gilles 'SO-smetti di essere malvagio' l'

2
@Atcold Quella risposta U&L ha TERM=xterm-256color tmux, che è sensato, a differenza TERM=screen-256color tmux. tmux -2è superiore perché funziona anche se screen-256colornon si trova nel database terminfo locale.
Gilles 'SO-smetti di essere malvagio' l'

20

Sono impressionato da quanto siano accuratamente formattate e dettagliate le risposte (e la domanda!). Mentre forniscono informazioni e soluzioni preziose sugli strumenti che hai citato, forniscono pochissime informazioni su cosa diavolo sta succedendo e, soprattutto, perché le cose funzionano (in qualche modo) per alcuni strumenti quando presumibilmente non dovrebbero.

Quindi, ecco alcuni approfondimenti sulle tue domande fondamentali:

  • Ciò che un terminale supporta e ciò che segnala sono cose diverse. Il terminale Gnome, ad esempio, è in grado di visualizzare 256 colori, ma si annuncia all'ambiente (tramite $TERMvariabile) come xtermemulatore (8 colori).

  • Strumenti come tputseguono qualunque cosa TERMsia impostata su: tput colorspuò stampare 8, mentre env TERM=xterm-256color tput colorsne stampa 256, indipendentemente dal fatto che il tuo terminale supporti effettivamente tali funzionalità.

  • vimanche seguire TERMper impostazione predefinita, ma come hai detto di usare 256 colori (tramite la bandiera o il set t_Co=256), utilizzerà 256 colori. E funziona perché il tuo terminale lo supporta effettivamente .

  • tmux, proprio come Gnome Terminal, anche di default si presenta come un terminale a 8 colori. Ma, a differenza di Gnome Terminal, solo consente capacità di 256 colori, se si utilizza la -2bandiera, che rende anche segnalare se stesso come un xterm-256coloremulatore compatibili.

  • xterm, come nel software dell'emulatore di terminale per X11 , supporta sicuramente 256 colori. Ma xtermcome in TERM=xtermè uno "standard" a 8 colori. Significa le capacità dell'originale xterm . Quando è stato aggiornato per supportare 256 colori, molto tempo fa, ha coniato il xterm-256colortermine per questo.

Quindi tutto si riduce a:

  • Quali funzionalità supporta effettivamente il tuo terminale (ed è abilitato a farlo)

  • Come segnala tali capacità all'ambiente tramite TERM

  • Come gli strumenti interpretano TERMe si adattano di conseguenza.

  • Come puoi dedurre da quanto sopra, evita di martellare il export TERM=xterm-256colortuo ~/.bashrce tali script . Poiché questi file vengono eseguiti indipendentemente dal terminale che stai effettivamente utilizzando, tutti i tuoi terminali, inclusi i collegamenti remoti da Windows con Putty, il terminale della console Linux, ecc., Si segnalano come compatibili con xterm-256color. Il che può essere vero per alcuni ma certamente non per tutti. Ad esempio, gettyla console linux a cui accedi CTRL+ALT+1..6non lo fa.

  • I terminali devono dichiararsi "standard" con cui sono maggiormente compatibili. Se sai che possono gestire 256 colori, configurali per pubblicizzare come tali.

Ultimo ma non meno importante, una lettura sorprendente su TERMe 256 colori è:

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

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


Uno o due scenari di esempio sarebbero buone aggiunte a questa risposta.
Elijah Lynn il

5

Fornirò una risposta complementare che affronta solo i tuoi esperimenti aggiuntivi nella misura in cui si riferiscono ai colori della directory solarizzata .

Impostare

Abbiamo lo stesso colore di output dallo script di test. L'unica differenza è che ho usato lxterminalsu Openbox con slim , xcompmgr e senza DM. Pertanto non posso facilmente impostare una tavolozza personalizzata come hai fatto in quanto l'emulatore di terminale non offre tali impostazioni in una GUI e non esiste un tema specifico (esistono solo per alcuni emulatori di terminale). Quindi uso solo un po 'di traslucenza, terminali non decorati e quel blu come colore di primo piano con uno sfondo blu di Gentoo . Dal momento che non posso usare le versioni ansi dei file a colori, mi sono concentrato esclusivamente sull'ottenere risultati con dircolors.256darkla versione semplice "degradata".

Ho usato la seguente configurazione pertinente e il carattere medio inconsolata :

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

L'immagine seguente mostra cosa succede sia all'interno che all'esterno di tmux con queste impostazioni. Il primo terzo a sinistra mostra finestre lxterminali non decorate impilate verticalmente (3). A destra hai un assembly tmux che mostra gli stessi identici programmi (3) Ho anche incluso un 1 solarizzato che mostra nano usando il file .Xresources incluso nel pacchetto completo (e campionandolo con ):xtermxrdb -load ~/.Xresources

inserisci qui la descrizione dell'immagine si prega di fare clic destro / visualizzare l'immagine per ispezionare a piena risoluzione

Il primo terminale nell'angolo in alto a sinistra mostra i colori di directory predefiniti. Appena sotto è la versione solarizzata degradata . Tranne il rosa su sfondo blu per i .cfile che ho aggiunto, è identico a quello che ci si aspetta da questo (vedi immagine sotto per riferimento). Rispetto ai valori predefiniti, si basa ulteriormente sugli attributi estesi, ovvero grassetto / luce / retro ecc. Ed i colori sono ovviamente diversi. L'assegnazione del colore predefinita per i .txtfile in molte distribuzioni è verde, ma dovrebbe essere grigia invece quando viene solarizzata . Un file ansi che esegue il rendering di un file .txt come verde non esegue il rendering correttamente o non esegue alcun rendering. I risultati sul lato destro che hai mostrato sono quelli corretti (256 scuro) in relazione al seguente riferimento:

inserisci qui la descrizione dell'immagine mappa di riferimento dei dircolori "degradati" solarizzati

osservazioni

Con la configurazione che ho usato, i risultati appaiono identici all'interno e all'esterno di tmux (ho invertito i commenti (#) in vi ma per il resto il plugin si comporta come dovrebbe e il multiplexer non ha alcun impatto su questo). I caratteri svolgono un ruolo importante nella definizione delle funzioni solarizzate e per massimizzare l'esperienza è necessario un buon carattere. I colori della directory solarizzata che utilizzano il file 256dark corrispondono al riferimento e non richiedono una specifica configurazione dell'emulatore di terminale.


Conclusione

In realtà il rendering ansi dei colori della directory è completamente diverso dal degradato solarizzato (256dark). Tanto che sotto i file ansi .txt sono verdi. Uno non può essere utilizzato per convalidare il rendering dell'altro. Entrambe le soluzioni richiedono una configurazione diversa e producono risultati completamente diversi.


"Non capisco la tua conclusione sul fatto che non sia stata prestata molta attenzione alla codifica 256dark dove in realtà è l'unico file a colori che produce un elenco di directory solarizzato?" La mia confusione deriva dal fatto che stavo considerando l' ansi-darkoutput corretto (poiché utilizza la versione non degradata). Quindi, se prendi come riferimento l'output di 256dark, allora hai la mentalità invertita.
Atcold

"Con la configurazione che ho usato, i risultati appaiono identici dentro e fuori". Certo, se stai usando 256 colori, ovviamente, renderanno allo stesso modo ovunque tu abbia un supporto di 256 colori. "Non è chiaro cosa la soluzione ansi fornirebbe ulteriormente in questo contesto ..." Il risultato sarebbe avere i veri Solarized (invece di un'approssimazione).
Atcold

Capisco. Non ho ancora studiato la parte ansi, quindi non ho potuto capire da dove venissi. In ogni caso ho trovato la tua Q abbastanza abilitante grazie. Forse userò più vi ora che lo trovo piuttosto lol. Per quanto riguarda i risultati ansi, in realtà ora ho visto come appare ... lo mostrano solo per dir-colors qui . Perché l'h. hanno un codice diverso sotto quello ... Voglio dire, vedo .txt verde ... come è il grigio vicino al verde? Non capisco sul serio il loro progetto.

Sì, ho contattato l'autore personalmente e la risposta è che "era la sua personalizzazione personale, poiché gli piaceva così". Sono senza parole ... Sono contento che il mio Q abbia aiutato qualcuno :)
Atcold
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.