2013-03-13 18 views
27

Sto testando i vari terminali che tendo ad usare su SSH nelle scatole Linux su cui ho installato Tmux.Vim: Differenza tra t_Co = 256 e term = xterm-256color in combinazione con TMUX

Fondamentalmente ho notato questo comportamento, e spero che qualcuno possa offrire una spiegazione di cosa sta succedendo. Ora potrebbe essere il caso in cui questo è un comportamento specifico che riguarda l'app Prompt.

Sto usando Vim in Tmux e nell'app Prompt di Panic sul mio iPhone5 Stavo avendo il comportamento che 256 colori non erano abilitati quando il .vimrc impostava i colori usando la direttiva set t_Co=256. Qui, Vim stava visualizzando correttamente i colori quando non veniva eseguito attraverso Tmux. Inoltre, OS X's Terminal.app ha reso correttamente i colori (non ho testato PuTTY con questo su Windows purtroppo) con Vim in Tmux.

Quindi ho sostituito set t_Co=256 per set term=xterm-256color e ora i colori funzionano quando si utilizza Vim tramite Tmux.

Nota anche che ho provato entrambe le impostazioni set -g default-terminal "xterm-256color" e set -g default-terminal "screen-256color" per Tmux e questa modifica non ha avuto alcun effetto sul comportamento.

+1

vim romainl

+4

Hai sbagliato l'ordine è 'vim

+0

La parte smartphone è la parte pazzesca. – romainl

risposta

61

Quando non si utilizza tmux o screen, avete solo bisogno di configurare i emulatori di terminale per pubblicizzare se stessi come "in grado di visualizzare 256 colori", impostando la loro TERM-xterm-256color o qualsiasi valore comparabile che funziona con i vostri terminali e piattaforme . Il modo in cui lo farai dipenderà dall'emulatore del terminale e non rientrerà nell'ambito della tua domanda e questa risposta.

Non è necessario fare nulla in Vim in quanto è perfettamente in grado di fare la cosa giusta da solo.

Quando si utilizza tmux o screen, quei programmi impostare il proprio valore di default per $TERM, di solito screen, e Vim fa quello che ha a che fare con le informazioni che è dato.

Se si desidera una più uniforme (e colorata) il comportamento, è necessario configurare loro di utilizzare un valore di "migliore" per $TERM:

  • tmux

    aggiungere questa riga a ~/.tmux.conf:

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

    aggiungere questa riga a ~/.screenrc:

    term "screen-256color" 
    

Ora, entrambi i multiplexer dirà a Vim che supportano 256 colori e Vim farà quello che ci si aspetta che faccia.

modificare

La mia risposta presuppone che si è in grado di modificare i file di configurazione, ma, dal momento che si è in grado di modificare il ~/.vimrc, non credo che io sono quel lontano il marchio .

modifica 2

Il valore dell'opzione term (recuperato con &term) è il nome del terminale come raccolto da Vim all'avvio. Quel nome è ciò che dovresti configurare nel tuo emulatore di terminale stesso.

Il valore dell'opzione t_Co (&t_Co) è quello che Vim considera il numero massimo di colori che può essere visualizzato dal terminale host. Esso è definito secondo il testo corrispondente al $TERM in terminfo:

term   | t_Co 
-----------------+------ 
xterm   | 8 
xterm-256color | 256 
screen   | 8 
screen-256color | 256 

Quando Vim viene avviato, ottiene il valore della variabile TERM ambiente, interroga il database terminfo con quel valore e memorizza una serie di informazioni nella sua ambiente in diverse variabili t_… tra cui ... il numero di colori disponibili in t_Co. Dato un tipo di terminale "legale" (che Vim può cercare), Vim sempre assume il numero corretto di colori.

Impostazione t_Co-256 lasciando term al suo valore Vim definito - o, più in generale, l'impostazione t_Co e/o term a valori che non corrispondono con il terminale host - non ha senso e probabilmente creare problemi quando Vim invia un segnale che non è compreso dal terminale o viceversa.

Mentre è del tutto possibile farlo, fare scherzi con t_Co e term in Vim è completamente inutile e potenzialmente dannoso.

Anche in questo caso, è sufficiente configurare correttamente gli emulatori di terminale ei multiplexer terminali.Questo è davvero tutto ciò di cui hai bisogno.

Se si finisce in un multiplatore terminale o un emulatore di terminale in cui non è possibile definire una corretta TERM, allora e solo allora è possibile forzare Vim assumere 256 colori. A tal fine, la modifica del valore della t_Co è l'unica cosa che ha senso:

if &term == "screen" 
    set t_Co=256 
endif 

Quindi ... se possibile configurare ogni singola parte:

  • emulatore di terminale: xterm-256color
  • tmux/schermo: screen-256color
  • vim: niente

e il gioco è fatto.

Se non controllo ogni parte possibile, utilizzare un semplice condizionale nel vostro ~/.vimrc per impostare t_Co base al &term ma non cambiare il valore di term.

Ma se si può modificare un ~/.vimrc non c'è ragione non è possibile modificare un ~/.screenrc o ~/.tmux.conf o ~/.bashrc o qualsiasi altra cosa.

+0

Ho già specificato nella domanda che questa non è la risposta. Ora mi rendo conto che questa risposta potrebbe aiutare gli altri lettori (perché ripercorrono cose che ho già pienamente considerato e testato) ma non è la risposta alla domanda sulla differenza tra queste due impostazioni di vim. –

+1

È la risposta al problema di fondo. Non devi assolutamente fare nulla in Vim. – romainl

+0

@StevenLu, vedere la mia modifica. – romainl

7

È possibile utilizzare sia set t_Co=256 sia set term=xterm-256color insieme.

term indica a Vim quale tipo di terminale utilizzare, che controlla la visualizzazione/rendering di tutti gli aspetti di Vim, incluso come mappare l'input chiave, ridisegnare lo schermo, spostare il cursore, visualizzare i colori, ecc. Normalmente, Vim può capire questo da solo tramite la variabile di ambiente TERM fornita dal sistema operativo.

Spesso è utile impostarlo in modo esplicito nel caso in cui il valore del SO non sia corretto. Ciò è particolarmente vero se ci si connette su una rete da un emulatore di terminale che non fornisce il valore corretto.

t_Co è una delle molte opzioni di terminale (utilizzate dal sistema termcap utilizzato da Vim per il controllo terminale). Si riferisce specificamente al numero di colori supportati dal terminale. A volte è necessario sovrascriverlo se l'emulazione del terminale è per lo più corretta, ma Vim non identifica correttamente il numero di colori supportati.

Io uso entrambe queste opzioni nel mio .vimrc per garantire che Vim usi 256 colori in tmux usando tutti i terminali che mi piacciono (il terminale di GNOME di Ubuntu, l'iTerm2 di OSX e il KiTTY di Windows). Ho anche la maggior parte di questi terminali configurati in modo esplicito per inviare xterm-256color come tipo di terminale.

+0

Non mi ero mai reso conto che avrei potuto impostare entrambi allo stesso tempo. Penso che probabilmente abbia le migliori possibilità di fare cose "funziona". Grazie –

+0

Il punto principale della contesa qui è, perché, quando dico a Tmux di specificare tramite 'set -g default-terminal 'xterm-256color" '* e * i verifico eseguendo in tmux' echo $ TERM' riporta' xterm -256color', che vim in esecuzione all'interno di tmux non è ancora in grado di fornire una colorazione corretta a meno che non usi 'set term = xterm-256color' di vim? Almeno sul mio iphone entro prompt lo fa. –

+0

@StevenLu, devi usare 'screen-256color', non' xterm-256color'. – romainl