2013-03-13 13 views
27

Testuję różne terminale, które używam do SSH w Linux-ach, na których mam zainstalowany Tmux.Vim: Różnica między t_Co = 256 i term = xterm-256color w połączeniu z TMUX

Zasadniczo zauważyłem to zachowanie i mam nadzieję, że ktoś może zaoferować wyjaśnienie tego, co się dzieje. Może się zdarzyć, że jest to specyficzne zachowanie wpływające na aplikację Prompt.

Używam Vima w Tmux, oraz w aplikacji Panic's Prompt na moim iPhone5 Miałem zachowanie, że 256 kolorów nie włączało się, gdy .vimrc ustawił kolory za pomocą dyrektywy set t_Co=256. Tutaj Vim poprawnie wyświetlał kolory, gdy nie był uruchamiany przez Tmux. Również Terminal.app OS X poprawnie renderował kolory (nie testowałem PuTTY w tym oknie na niestety) z Vimem w Tmux.

Następnie zamieniłem set t_Co=256 dla set term=xterm-256color, a teraz kolory działają, gdy używam Vima przez Tmux.

Należy również zauważyć, że przetestowałem zarówno ustawienia set -g default-terminal "xterm-256color", jak i set -g default-terminal "screen-256color" dla Tmux i ta zmiana nie miała wpływu na zachowanie.

+1

vim romainl

+4

Masz błędną kolejność to 'vim

+0

Część ze smartfonem to szalona część. – romainl

Odpowiedz

61

Kiedy nie używać tmux lub screen, tylko trzeba skonfigurować emulatory terminali do reklamowania się jako „zdolny do wyświetlania 256 kolorów” poprzez ustawienie ich TERM do xterm-256color lub dowolny porównywalna wartość, która współpracuje ze swoimi terminali i platform . Sposób, w jaki to zrobisz, będzie zależeć od emulatora terminala i będzie poza zakresem pytania i odpowiedzi.

Nie musisz nic robić w Vim, ponieważ jest on całkowicie zdolny zrobić to, co trzeba.

Podczas korzystania tmux lub screen, programy te ustawić własne wartości domyślne dla $TERM, zwykle screen i Vim robi to, co ma do czynienia z informacją, że jest składane.

Jeśli chcesz bardziej jednolite (i kolorowe) zachowanie, należy skonfigurować je do korzystania z "lepsze" wartość $TERM:

  • tmux

    Dodaj tę linię do ~/.tmux.conf:

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

    Dodaj tę linię do ~/.screenrc:

    term "screen-256color" 
    

Teraz oba multipleksery powie Vima obsługują one 256 kolorów i Vim zrobi to, czego od niego oczekujesz.

edit

Moja odpowiedź zakłada, że ​​jesteś w stanie edytować te pliki konfiguracyjne, ale ponieważ jesteś w stanie edytować ~/.vimrc, nie sądzę, że jestem tak daleko od prawdy .

edycja 2

Wartość opcji term (pobranej z &term) to nazwa terminala jako pobrane przez vim na starcie. To nazwa, którą powinieneś ustawić w swoim emulatorze terminala.

Wartość opcji t_Co (&t_Co) jest tym, co Vim uważa za maksymalną liczbę kolorów, które mogą być wyświetlane przez terminal hosta. Jest ona definiowana według wpisu odpowiadającego $TERM w terminfo:

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

Kiedy Vim startuje, to pobiera wartość zmiennej TERM środowiska, odpytuje bazę terminfo z tą wartością i przechowuje szereg informacji na jej środowisko w kilku zmiennych t_…, wśród których ... liczba kolorów dostępnych w t_Co. Biorąc pod uwagę "legalny" typ terminalu (taki, który Vim może wyszukać), Vim zawsze przyjmuje poprawną liczbę kolorów.

Ustawianie t_Co do 256 pozostawiając term jej wartości Vima zdefiniowane - lub, bardziej ogólnie, ustawienie t_Co i/lub term wartościom, które nie pasują do terminala głównego - nie ma sensu i prawdopodobnie spowoduje problemy, gdy Vim wysyła sygnał, którego nie rozumie terminal i odwrotnie.

Chociaż jest to całkowicie możliwe, zakłócenie działania z t_Co i term w Vim jest całkowicie bezużyteczne i może być szkodliwe.

Ponownie, ustaw poprawnie emulatory terminala i multiplekserów terminali.To wszystko, czego potrzebujesz, to naprawdę.

Jeśli skończyć się w terminalu multiplekser lub emulatora terminala, gdzie nie można określić prawidłową TERM, wtedy i tylko wtedy można zmusić Vima przyjąć 256 kolorów. W tym celu, zmieniając wartość t_Co jest jedyną rzeczą, która ma sens:

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

Więc ... jeśli może configure każda pojedyncza część:

  • emulator terminala: xterm-256color
  • tmux/screen: screen-256color
  • vim: nic

i gotowe.

Jeśli nie kontrolą każdą część można użyć prosty warunkowy w swojej ~/.vimrc ustawić t_Co według &term ale nie zmienia wartości term.

Ale czy można edytować ~/.vimrc nie ma powodu, nie można edytować lub ~/.tmux.conf~/.screenrc lub ~/.bashrc lub cokolwiek.

+0

Podałem już w pytaniu, że to nie jest odpowiedź. Teraz zdaję sobie sprawę, że ta odpowiedź może pomóc innym czytelnikom (ponieważ omawia rzeczy, które już w pełni rozważałem i testowałem), ale nie jest odpowiedzią na pytanie o różnicę między tymi dwoma ustawieniami vima. –

+1

Jest to odpowiedź na podstawowy problem. W Vimie nie musisz nic robić. – romainl

+0

@StevenLu, zobacz moją edycję. – romainl

7

Można używać jednocześnie set t_Co=256 i set term=xterm-256color.

term mówi Vimowi jakiego rodzaju terminala do wykorzystania, który steruje wyświetlaniem/renderowania wszystkich aspektów Vima, w tym jak mapować wejście klucza, przerysowanie ekranu, przesuń kursor, wyświetlanie kolorów, itd. Normalnie, Vim może figurować samodzielnie przez zmienną środowiskową dostarczoną przez system operacyjny.

Często pomocne jest ustawienie go jawnie na wypadek, gdyby wartość OS była niepoprawna. Jest to szczególnie ważne, jeśli łączysz się przez sieć z emulatora terminala, który nie zapewnia poprawnej wartości.

t_Co to jedna z wielu opcji terminala (używana przez system termcap, którego Vim używa do sterowania terminalem). W szczególności odnosi się do liczby kolorów obsługiwanych przez terminal. Czasem trzeba to zmienić, jeśli emulacja terminala jest w większości poprawna, ale Vim nieprawidłowo identyfikuje liczbę obsługiwanych kolorów.

Używam obu tych opcji w moim .vimrc, aby upewnić się, że Vim używa 256 kolorów w tmux używając wszystkich terminali, które lubię (gnome-terminal Ubuntu, iTerm2 OSX i KiTTY Windowsa). Mam również większość tych terminali jawnie skonfigurowanych do wysyłania xterm-256color jako ich typu terminala.

+0

Nigdy nie zdawałem sobie sprawy, że mogę ustawić obie jednocześnie. Myślę, że prawdopodobnie ma największe szanse na robienie rzeczy "po prostu działa". Dzięki –

+0

Podstawowym punktem spornym jest tutaj, dlaczego, kiedy mówię Tmux, aby określił za pomocą 'set -g default-terminal" xterm-256color "' * i * i sprawdź, uruchamiając w tmux 'echo $ TERM', zgłasza' xterm -256color', że vim działający wewnątrz tmux nadal nie jest w stanie zapewnić właściwego kolorowania, chyba że użyję 'zestawu terminów = xterm-256color' vima? Przynajmniej na moim iphone wewnątrz zachęty to robi. –

+0

@StevenLu, musisz użyć 'screen-256color', a nie' xterm-256color'. – romainl