Warum sehen Vim-Farben innerhalb und außerhalb von tmux unterschiedlich aus?

29

Umgebung:

  • Fedora 25 (4.9.12-200.fc25.x86_64)
  • GNOME-Terminal 3.22.1 mit VTE Version 0.46.1 + GNUTLS
  • VIM - Vi IMproved 8.0 (12. September 2016, kompiliert am 22. Februar 2017, 16:26:11 Uhr)
  • tmux 2.2

Ich habe vor kurzem angefangen, tmux zu verwenden und festgestellt, dass sich die Farben in Vim ändern, je nachdem, ob ich innerhalb oder außerhalb von tmux arbeite. Unten sehen Sie Screenshots von Vim außerhalb (links) und innerhalb (rechts) von tmux, während Sie ein Git-Diff betrachten:

Bildbeschreibung hier eingeben

Meine TERMVariable ist

  • Außerhalb von tmux: xterm-256color
  • In tmux: screen-256color

Vim meldet diese Terminaltypen wie erwartet (via :set term?):

  • Außerhalb von tmux: term=xterm-256color
  • In tmux: term=screen-256color

Vim meldet außerdem, dass beide Instanzen im 256-Farben-Modus ausgeführt werden (über :set t_Co?):

  • Außerhalb von tmux: t_Co=256
  • In tmux: t_Co=256

Es gibt viele ähnliche Fragen bezüglich der Ausführung von Vim im 256-Farben-Modus in tmux (die beste Antwort, die ich gefunden habe, ist hier ), aber ich denke nicht, dass das mein Problem ist, wenn man die obigen Informationen berücksichtigt .

Ich kann das Problem außerhalb von tmux duplizieren, wenn ich Vim mit dem folgenden Terminaltyp ausführe screen-256color:

$ TERM=screen-256color vim

Das lässt mich glauben, dass es einfach einen Unterschied zwischen der xterm-256colorund der screen-256colorTerminal-Fähigkeit gibt, der den Unterschied in der Farbe verursacht. Was führt zu der im Titel gestellten Frage: Was bewirkt speziell in den Terminalfunktionen, dass die Vim-Farben unterschiedlich sind? Ich sehe die Unterschiede zwischen dem Laufen :set termcapinnerhalb und außerhalb von tmux, bin aber gespannt, welche Variablen tatsächlich den Unterschied im Verhalten verursachen.

Ist es unabhängig von der vorherigen Frage möglich, dass die Vim-Farben innerhalb oder außerhalb von tmux konsistent sind? Einige Dinge, die ich ausprobiert habe, sind:

  • Das Standardterminal, das tmux verwendet, explizit ~/.tmux.confauf verschiedene Werte einstellen (einige entgegen dem Rat der tmux- FAQ ):
    set -g default-terminal "screen-256color"
    set -g default-terminal "xterm-256color"
    set -g default-terminal "screen.xterm-256color"
    set -g default-terminal "tmux-256color"
  • Starten von tmux mit tmux -2.

In allen Fällen zeigte Vim innerhalb von tmux weiterhin verschiedene Farben an.

Rusty Shackleford
quelle
Könnten Sie bitte die Shell scriptstarten vim, beenden vimund dann beenden scriptund die resultierende typescriptDatei anhängen ? Wiederholen Sie dann die gleichen Schritte mit TERM=screen-256color vim.
egmont
@egmont Los geht's: typescript-xterm-256color und typescript -screen-256color .
Rusty Shackleford
1
Ich kann 256-Farben-Escape-Sequenzen in der xterm-256colorVersion sehen (Suche nach "38; 5;" in der Datei), aber nicht in der screen-256color. Zum Beispiel , wo es eine \e[38;5;81min xterm-256color(Farbe # 81 der 256-Farben - Palette, ein mittlerer Blauton), screen-256colorenthält \e[34mstatt (die Standard - blau der 8-Farbpalette). Die Hauptfrage ist also, warum vim die 256-Farben-Palette im Falle von nicht verwendet TERM=screen-256color.
egmont
Eine andere interessante Sache ist, dass die xterm-256colorVersion den Bildschirm zweimal zu drucken scheint, zuerst mit den alten Farben und dann mit der 256-Farben-Palette. Suchen Sie zB nach "F1" in der Datei, finden Sie zwei Übereinstimmungen in xterm-256color, die erste mit \e[34mFarbe, die zweite mit \e[38;5;81m. Ich weiß nicht, was hier los ist.
Egmont
Hinzufügen set -g default-terminal "screen.xterm-256color"in ~/.tmux.confund laden Sie die Konfiguration in tmux (<Cs>: source-Datei ~ / .tmux.conf) arbeitete für mich (Highlight Ausgabe). thx
dtrckd

Antworten:

17

Ich hatte das ähnliche Problem schon einmal. Kommentare in Blau in Vim waren schwer zu lesen. In .tmux.confsetze ich dies:

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

Und in .vimrc:

set background=dark

Jetzt sieht es so aus und funktioniert sowohl in Gnome Terminal als auch in Cygwin: Bildbeschreibung hier eingeben

Vitalii Plagov
quelle
3
Das hat es für mich gelöst. Aus irgendeinem Grund konnte vim in tmux keinen dunklen Hintergrund erkennen. Das explizite Setzen bg=darkin meinem vimrc hat es behoben.
Adam Keenan
Seltsam - mein $TERMInneres und Äußeres tmuxwar es "xterm-256color"und das explizite Setzen des Backgrouns tat es auch für mich. Vielen Dank!
Nronnei
Hat auch für mich gearbeitet. Ich dachte, das Problem sttermliege darin, dass xfce4-terminalalles bequem aussah (Kommentare, die cyanstattdessen erscheinen blue, sind mit dunklem Hintergrund sehr schwer zu lesen). Nach dieser Änderung funktioniert alles gut. Aber denken Sie daran, unlet! skip_defaults_vim source $VIMRUNTIME/defaults.vimzu vimrc-Datei hinzuzufügen , um Syntax-Hervorhebung usw. zu verwenden ...
Abinash Dash
2

Dank der Analyse von @ egmont, welche Farben Vim wann ausgegeben hat TERM=screen-256color, wurde ich inspiriert, das Farbschema zu betrachten, das Vim in den beiden Szenarien verwendet.

Vim berichtet, dass es defaultin beiden Fällen das Farbschema verwendet. Ich fand das seltsam, weil das defaultFarbschema auf Fedora 25 ( /usr/share/vim/vim80/colors/default.vim) nicht mit den Farben übereinstimmt, die ich tatsächlich sehe, wenn TERM=xterm-256color. Wenn ich das Farbschema explizit mit :colorscheme defaultwhen einstelle TERM=xterm-256color, ändert sich das Erscheinungsbild von Vim zu when TERM=screen-256color. Um die Farben wieder auf das zu bringen, was sie waren, als ich Vim zum ersten Mal startete, musste ich das ronFarbschema verwenden. Fortschritt!

Ich habe eine Frage-Ubuntu- Antwort gefunden , die darauf hinweist, dass Vim, wenn es meldet, dass es das defaultFarbschema verwendet, nicht unbedingt ein default.vimthemenspezifisches Farbschema bedeutet. Wie die Antwort zeigt, entspricht ein dunkles Thema (das ich verwende) dem ronFarbschema, so wie ich es oben entdeckt habe. (Obwohl dieser Beitrag in Bezug auf Ubuntu verfasst wurde, gehe ich davon aus, dass das OP GNOME verwendet.)

Ich fand auch eine andere Frage , die das gleiche Problem zu beschreiben scheint, das ich habe. Ich bin darauf gestoßen, als ich gesucht habe, bevor ich diese Frage gestellt habe, aber aus irgendeinem Grund hat mich das Farbschema nicht als relevant empfunden.

Am Ende habe ich das getan, was @LapshinDmitry in seiner Antwort getan und explizit colorscheme ronin meiner ~/.vimrcDatei festgelegt hat. Egal, ob ich Vim innerhalb oder außerhalb von tmux starte, die Farben sehen gleich aus. Der einzige Nachteil ist, dass Vim nicht automatisch auf das "Standard" -Farbschema für helle Designs umschaltet, wenn ich jemals mein Desktop-Design von einem dunklen auf ein helles Design umstelle peachpuff. Ich kann damit leben, da ich wahrscheinlich nie mein Thema ändern werde.

Ich werde diese Antwort nicht akzeptieren, da ich in Betracht ziehe, das Farbschema explizit ~/.vimrcals Problemumgehung und nicht als Lösung festzulegen. Wenn jemand erklären kann, warum Vim abhängig vom Wert von ein anderes "Standard" -Farbschema lädt TERM, nehme ich diese Antwort gerne an, da ich mehr daran interessiert bin, die Grundursache zu verstehen. Ich vermute, es hat etwas damit zu tun, wie Vim die Terminalfunktionen zwischen den beiden terminfo-Dateien interpretiert.

Rusty Shackleford
quelle
Ich bin auch gespannt, warum vimsich das so verhält. Schließlich sollte die bceFähigkeit nichts mit der verfügbaren Anzahl von Farben zu tun haben.
Egmont
@egmont Ich interpretierte @ ThomasDickeys Antwort als: 1) Vim prüft die bceFähigkeit des Terminals, 2) falls vorhanden, wählen Sie das Farbschema "A", 3) andernfalls wählen Sie das Farbschema "B". Ich glaube, die Farbtiefe ist in beiden Fällen gleich (dh 256 Farben, wie t_Cogezeigt). Es ist nur so, dass das Farbschema "B" auf meinem System nur eine 8-Farben-Palette verwendet, obwohl 256 Farben möglich sind (ich denke , das erklärt, was Sie in Ihrer Typoskript-Analyse beobachtet haben; bitte korrigieren Sie mich, wenn ich falsch liege). Denken Sie daran, dass nach dem Ausführen :colorscheme ronin derselben Vim-Sitzung Escape-Sequenzen mit 256 Farben angezeigt werden.
Rusty Shackleford
Vielen Dank für die Erklärung - ich kann jedoch immer noch keine Gründe dafür erkennen. Keine Ursache. vimhat wirklich seltsame Designentscheidungen.
Egmont
0

Meine TERM-Variable lautet Outside tmux: xterm-256color Inside tmux: screen-256color

Das ist richtig und funktioniert für mich. Versuchen Sie es mit einem anderen Terminal (ich benutze urxvt), um zu sehen, ob Gnome Terminal das Problem ist. Um die Umstellung zu erleichtern, müssen Sie

Überprüfen Sie auch COLORTERM(meine ist auf rxvt) und unset TERMCAP.

laktak
quelle
Danke für die Vorschläge. Ich habe den gleichen Test mit urxvt (exterior TERM is rxvt-unicode-256color) mit einem passenden ~/.Xdefaultsund leider immer noch unterschiedlichen Farben innerhalb und außerhalb von tmux durchgeführt. Für das Gnome-Terminal-Szenario COLORTERMist truecolorund TERMCAPist sowohl innerhalb als auch außerhalb von tmux leer. Für das urxvt-Szenario COLORTERMist rxvt-xpmaußerhalb und truecolorinnerhalb von tmux, während TERMCAPsowohl innerhalb als auch außerhalb von tmux leer ist.
Rusty Shackleford
@RustyShackleford das ist nur für Vim? Verwenden Sie 'termguicolors'? Schauen Sie sich eine :help xterm-true-colorVim-Standardkonfiguration an oder probieren Sie sie aus.
Laktak
Ich habe das Problem bisher nur in Vim bemerkt (wie gesagt, ich habe erst kürzlich angefangen, tmux zu verwenden). Beispielsweise scheinen meine Terminal-Eingabeaufforderung und die Git-CLI-Ausgabe innerhalb und außerhalb von tmux die gleichen Farben zu haben. Ich stelle nicht termguicolorsin meinen .vimrcund :set termguicolors?Berichten notermguicolorsin beiden Fällen. Ich werde mir das Hilfethema ansehen, auf das Sie verwiesen haben. Vielen Dank!
Rusty Shackleford
0

Zu meiner eigenen Information später, als ich zweifellos meine nächste Maschine google.

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

Verwenden Sie diese Anweisungen, um die erforderlichen Binärdateien und DLLs in den PATH von Git Bash zu laden:

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

Verwenden Sie diese Befehle, um Folgendes zu konfigurieren:

echo 'set -g default-terminal "screen.xterm-256color"' > ~/.tmux.conf
tmux -2u
Josh Peak
quelle