Dlaczego kolory Vima wyglądają inaczej wewnątrz i na zewnątrz tmux?

29

Środowisko:

  • Fedora 25 (4.9.12-200.fc25.x86_64)
  • Terminal GNOME 3.22.1 Korzystanie z wersji VTE 0.46.1 + GNUTLS
  • VIM - Vi IMproved 8.0 (12 września 2016, opracowano 22 lutego 2017 16:26:11)
  • tmux 2.2

Niedawno zacząłem używać tmux i zauważyłem, że kolory w Vimie zmieniają się w zależności od tego, czy działam w tmuxie, czy poza nim. Poniżej zrzuty ekranu Vima na zewnątrz (po lewej) i wewnątrz (po prawej) tmux podczas oglądania Git diff:

wprowadź opis zdjęcia tutaj

Moja TERMzmienna to

  • Poza tmux: xterm-256color
  • Wewnątrz tmux: screen-256color

Vim zgłasza te typy terminali zgodnie z oczekiwaniami (via :set term?):

  • Poza tmux: term=xterm-256color
  • Wewnątrz tmux: term=screen-256color

Vim informuje również, że oba wystąpienia działają w trybie 256-kolorowym (przez :set t_Co?):

  • Poza tmux: t_Co=256
  • Wewnątrz tmux: t_Co=256

Istnieje wiele podobnych pytań dotyczących uruchamiania Vima w trybie 256 kolorów w tmux (najlepsza odpowiedź, jaką znalazłem, jest tutaj ), ale nie sądzę, że to mój problem, biorąc pod uwagę powyższe informacje.

Mogę zduplikować problem poza tmux, jeśli uruchomię Vima z typem terminala ustawionym na screen-256color:

$ TERM=screen-256color vim

To sprawia, że ​​wierzę, że istnieje tylko pewna różnica między możliwościami terminala xterm-256colora screen-256colorterminalem, która powoduje różnicę w kolorze. Co prowadzi do pytania postawionego w tytule: co konkretnie w możliwościach terminali powoduje, że kolory Vima są różne? Widzę różnice między uruchomieniem :set termcapw tmuxie i poza nim, ale jestem ciekawy, które zmienne faktycznie powodują różnicę w zachowaniu.

Niezależnie od poprzedniego pytania, czy możliwe jest, aby kolory Vima były spójne podczas uruchamiania w tmuxie lub poza nim? Niektóre rzeczy, które próbowałem obejmują:

  • Jawne ustawienie domyślnego terminala, z którego korzysta tmux, ~/.tmux.confna różne wartości (niektóre wbrew poradom tmux FAQ ):
    ustaw -g domyślny terminal „screen-256color”
    ustaw -g domyślny terminal „xterm-256color”
    ustaw -g default-terminal „screen.xterm-256color”
    ustaw -g domyślny terminal „tmux-256color”
  • Uruchamianie tmux za pomocą tmux -2.

We wszystkich przypadkach Vim nadal wyświetlał różne kolory w tmuxie.

Rusty Shackleford
źródło
Czy możesz zacząć script, uruchomić vim, wyjść, vima następnie zamknąć scriptpowłokę i dołączyć wynikowy typescriptplik? Następnie powtórz te same kroki z TERM=screen-256color vim.
egmont
@egmont Proszę bardzo: typescript -xterm-256color i maszyncript-screen-256color .
Rusty Shackleford,
1
Widzę 256-kolorowe sekwencje specjalne w xterm-256colorwersji (wyszukaj „38; 5;” w pliku), ale nie mogę w screen-256color. Np. Gdziekolwiek jest \e[38;5;81min xterm-256color(kolor nr 81 z 256-kolorowej palety, środkowy niebieski odcień), screen-256colorzawiera \e[34mzamiast tego (standardowy niebieski z 8-kolorowej palety). Tak więc główne pytanie brzmi: dlaczego vim nie używa 256-kolorowej palety w przypadku TERM=screen-256color.
egmont
Kolejną interesującą rzeczą jest to, że xterm-256colorwersja wydaje się drukować ekran dwukrotnie, najpierw przy użyciu starszych kolorów, a następnie z 256-paletową paletą kolorów. Wyszukaj np. „F1” w pliku, znajdziesz dwa dopasowania xterm-256color, pierwszy z \e[34mkolorem, drugi z \e[38;5;81m. Nie wiem o co tu chodzi.
egmont
Dodanie set -g default-terminal "screen.xterm-256color"w ~/.tmux.confi przeładować config w tmux (<Cs>: source plik ~ / .tmux.conf) pracował dla mnie (wydanie podświetlenia). thx
dtrckd

Odpowiedzi:

17

Miałem wcześniej podobny problem. Trudno było odczytać niebieskie komentarze w Vimie. W .tmux.confustawiam to:

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

I w .vimrc:

set background=dark

Teraz wygląda następująco i działa zarówno w Gnome Terminal, jak i Cygwin: wprowadź opis zdjęcia tutaj

Vitalii Plagov
źródło
3
To rozwiązało dla mnie. Z jakiegoś powodu w tmuxie vim nie wykrywał ciemnego tła. Jawne ustawienie bg=darkw moim vimrc to naprawiło.
Adam Keenan
Dziwne - moja $TERMzarówno wewnątrz jak i na zewnątrz tmuxbyło "xterm-256color"i jawnie ustawienie backgroun zrobił to dla mnie. Dziękuję Ci!
nronnei
Pracowałem też dla mnie. Myślałem, że problem tkwi sttermw tym, że xfce4-terminalwszystko wyglądało na wygodne (pojawiające się komentarze cyanzamiast bluektórych bardzo trudno jest odczytać na ciemnym tle). po tej zmianie wszystko działa dobrze. Pamiętaj jednak, aby dodać unlet! skip_defaults_vim source $VIMRUNTIME/defaults.vimdo pliku vimrc, aby użyć podświetlania składni itp.
Abinash Dash
2

Dzięki analizie @ egmont, jakie kolory generował Vim, kiedy TERM=screen-256colorzainspirowałem się do zapoznania się ze schematem kolorów, którego używa Vim w dwóch scenariuszach.

Vim informuje, że defaultw obu przypadkach używa schematu kolorów . Pomyślałem, że to dziwne, ponieważ defaultschemat kolorów w Fedorze 25 ( /usr/share/vim/vim80/colors/default.vim) nie pasuje do kolorów, które faktycznie widzę, kiedy TERM=xterm-256color. Jeśli wyraźnie ustawię schemat kolorów za pomocą :colorscheme defaultkiedy TERM=xterm-256color, wygląd Vima zmieni się na taki, kiedy TERM=screen-256color. Aby przywrócić kolory takim, jakie były, kiedy pierwszy raz uruchomiłem Vima, musiałem użyć ronschematu kolorów. Postęp!

Znalazłem zapytać Ubuntu odpowiedź , która sugeruje, że kiedy Vim donosi, że jest za pomocą defaultkolorów, to nie musi oznaczać, default.vimale raczej jakiś motyw specyficzny schemat kolorów. Jak wskazuje odpowiedź, ciemny motyw (którego używam) odpowiada ronschematowi kolorów, tak jak odkryłem powyżej. (Mimo że ten post dotyczy Ubuntu, zakładam, że OP używa GNOME).

Znalazłem też inne pytanie, które wydaje się opisywać ten sam problem, który mam. Natknąłem się na to podczas wyszukiwania, zanim opublikowałem to pytanie, ale z jakiegoś powodu kolorystyka nie wydawała mi się istotna.

Skończyło się na tym, co @LapshinDmitry zrobił w swojej odpowiedzi i wyraźnie zapisał colorscheme ronw moim ~/.vimrcpliku. Teraz, niezależnie od tego, czy uruchomię Vima w tmuxie, czy poza nim, kolory wyglądają tak samo. Jedyną wadą jest to, że jeśli kiedykolwiek zmienię motyw pulpitu z ciemnego smaku na lekki, Vim nie przełączy się automatycznie na „domyślny” schemat kolorów jasnego motywu, co najwyraźniej jest peachpuff. Mogę z tym żyć, ponieważ prawdopodobnie nigdy nie zmienię tematu.

Nie zamierzam zaakceptować tej odpowiedzi, ponieważ rozważam wyraźne ustawienie schematu kolorów w moim ~/.vimrcobejściu zamiast rozwiązania. Jeśli ktoś może wyjaśnić, dlaczego Vim ładuje inny „domyślny” schemat kolorów w zależności od wartości TERM, chętnie przyjmę tę odpowiedź, ponieważ bardziej interesuje mnie podstawowa przyczyna. Podejrzewam, że ma to coś wspólnego z tym, jak Vim interpretuje możliwości terminala między dwoma plikami terminfo.

Rusty Shackleford
źródło
Jestem również ciekawy, dlaczego tak się vimzachowuje. W końcu bcemożliwości nie powinny mieć nic wspólnego z dostępną liczbą kolorów.
egmont
@egmont Zinterpretowałem odpowiedź ThomasaDickeya jako: 1) Vim sprawdza bcemożliwości terminala, 2) jeśli jest obecny, wybierz schemat kolorów „A”, 3) w przeciwnym razie wybierz schemat kolorów „B”. Wierzę, że głębia kolorów jest taka sama w obu przypadkach (tj. 256 kolorów, jak t_Copokazuje). Po prostu schemat kolorów „B” w moim systemie używa tylko 8-paletowej palety kolorów, mimo że możliwe jest 256 kolorów ( myślę , że to wyjaśnia to, co zaobserwowałeś podczas analizy maszynopisu; popraw mnie, jeśli się mylę). Pamiętaj, że po uruchomieniu :colorscheme ronwidzę 256-kolorowe sekwencje specjalne w tej samej sesji Vima.
Rusty Shackleford
Dzięki za wyjaśnienie - wciąż nie widzę za tym uzasadnienia. Nieważne. vimma naprawdę dziwne decyzje projektowe.
egmont
0

Moja zmienna TERM to Outside tmux: xterm-256color Inside tmux: screen-256color

To prawda i działa dla mnie. Wypróbuj go z innym terminalem (używam urxvt), aby sprawdzić, czy problem stanowi Gnome Terminal. W pobliżu

Sprawdź także COLORTERM(moja jest ustawiona na rxvt) i unset TERMCAP.

laktak
źródło
Dziękuję za sugestie. Przeprowadziłem ten sam test z urxvt (zewnętrzna TERM jest rxvt-unicode-256color) przy użyciu odpowiednich ~/.Xdefaultsi niestety nadal obserwowanych różnych kolorów wewnątrz i na zewnątrz tmux. W przypadku scenariusza terminalnego gnome COLORTERMjest truecolori TERMCAPjest pusty zarówno w tmuxie, jak i poza nim. W przypadku scenariusza urxvt COLORTERMjest on na rxvt-xpmzewnątrz i truecolorwewnątrz tmux, natomiast TERMCAPjest pusty zarówno wewnątrz, jak i na zewnątrz tmux.
Rusty Shackleford
@RustyShackleford to tylko dla Vima? Czy używasz „termguicolors”? Spójrz :help xterm-true-colorlub spróbuj z bardziej domyślną konfiguracją Vima.
laktak
Do tej pory zauważyłem tylko problem w Vimie (tak jak powiedziałem, dopiero niedawno zacząłem używać tmux). Na przykład, mój monit terminala i wyjście Git CLI wydają się mieć te same kolory zarówno wewnątrz, jak i na zewnątrz tmux. Nie ustawiam termguicolorsw moim .vimrci :set termguicolors?raportach notermguicolorsw obu przypadkach. Przejrzę temat pomocy, do którego się odwoływałeś; dzięki!
Rusty Shackleford,
0

Dla własnego odniesienia później, gdy niewątpliwie google to konfigurowanie mojej następnej maszyny.

  • Vim8 / Neovim
  • Windows 10
  • Git bash
  • Tmux 2.7

Skorzystaj z tych instrukcji, aby uzyskać niezbędne pliki binarne i biblioteki DLL do ŚCIEŻKI Git bash:

https://blog.pjsen.eu/?p=440

Użyj tych poleceń, aby skonfigurować:

echo 'set -g default-terminal "screen.xterm-256color"' > ~/.tmux.conf
tmux -2u
Josh Peak
źródło