Probleme bei der Verwendung des Farbschemas in NeoVim

16

Ich verstehe nicht termgenau, wie mein Farbschema mit der Einstellung in vim interagiert, und dies behindert meine Fähigkeit, die korrekte Anzeige in neovim zu erreichen.

In meiner .vimrc-Datei muss das richtige Verhalten des betreffenden Farbschemas festgelegt werden

set term=xterm
set t_Co=256

Wenn Sie eine dieser Einstellungen weglassen, wird das Farbschema nicht korrekt angezeigt:

richtig Korrekte Farbanzeige falsch Falsche Farbanzeige anders falsch Unterschiedliche falsche Farbanzeige

Das Schema sieht folgendermaßen aus:

set background=dark
hi clear
if exists("syntax_on")
    syntax reset
endif
let g:colors_name="impact3"

if exists("g:impact_transbg")
    hi Normal       ctermfg=255 ctermbg=none
    hi NonText      ctermfg=DarkGray  ctermbg=none

    hi Statement    ctermfg=Blue      ctermbg=none
    hi Comment      ctermfg=DarkGray  ctermbg=none cterm=bold term=bold
    hi Constant     ctermfg=173  ctermbg=none
    hi Identifier   ctermfg=Cyan      ctermbg=none
    hi Type         ctermfg=DarkGreen ctermbg=none
    hi Folded       ctermfg=0 ctermbg=235 cterm=underline term=none
    hi Special      ctermfg=Blue      ctermbg=none
    hi PreProc      ctermfg=LightGray ctermbg=none cterm=bold term=bold
    hi Scrollbar    ctermfg=Blue      ctermbg=none
    hi Cursor       ctermfg=white     ctermbg=none
    hi ErrorMsg     ctermfg=Red       ctermbg=none cterm=bold term=bold
    hi WarningMsg   ctermfg=Yellow    ctermbg=none
    hi VertSplit    ctermfg=0     ctermbg=0
    hi Directory    ctermfg=Cyan      ctermbg=DarkBlue
    hi Visual       ctermfg=White     ctermbg=Gray cterm=underline term=none
    hi Title        ctermfg=255     ctermbg=Blue
    hi String       ctermfg=Blue   ctermbg=none

    hi StatusLine   term=bold cterm=bold,underline ctermfg=White ctermbg=Black
    hi StatusLineNC term=bold cterm=bold,underline ctermfg=Gray  ctermbg=Black
    hi LineNr       term=bold cterm=bold ctermfg=2 ctermbg=None
    hi Search       ctermfg=Black ctermbg=2
    hi TabLine      ctermfg=0 ctermbg=DarkGray
    hi TabLineFill  ctermfg=DarkGray ctermbg=DarkGray
else
    hi Normal       ctermfg=White ctermbg=Black
    hi NonText      ctermfg=DarkGray  ctermbg=Black

    hi Statement    ctermfg=Blue      ctermbg=Black
    hi Comment      ctermfg=DarkGray  ctermbg=Black cterm=bold term=bold
    hi Constant     ctermfg=DarkCyan  ctermbg=Black
    hi Identifier   ctermfg=Cyan      ctermbg=Black
    hi Type         ctermfg=DarkGreen ctermbg=Black
    hi Folded       ctermfg=DarkGreen ctermbg=Black cterm=underline term=none
    hi Special      ctermfg=Blue      ctermbg=Black
    hi PreProc      ctermfg=LightGray ctermbg=Black cterm=bold term=bold
    hi Scrollbar    ctermfg=Blue      ctermbg=Black
    hi Cursor       ctermfg=white     ctermbg=Black
    hi ErrorMsg     ctermfg=Red       ctermbg=Black cterm=bold term=bold
    hi WarningMsg   ctermfg=Yellow    ctermbg=Black
    hi VertSplit    ctermfg=White     ctermbg=Black
    hi Directory    ctermfg=Cyan      ctermbg=DarkBlue
    hi Visual       ctermfg=White     ctermbg=DarkGray cterm=underline term=none
    hi Title        ctermfg=White     ctermbg=DarkBlue

    hi StatusLine   term=bold cterm=bold,underline ctermfg=White ctermbg=Black
    hi StatusLineNC term=bold cterm=bold,underline ctermfg=Gray  ctermbg=Black
    hi LineNr       term=bold cterm=bold ctermfg=White ctermbg=Black
endif

In Neovim termkann nicht festgelegt werden. Ich habe versucht, neovim mit einem manuell festgelegten $ TERM wie folgt aufzurufen:

TERM=xterm nvim

Dies führte zu einer korrekten Darstellung der Farben in regulären VIM-Dateien (entspricht der Einstellung des Ausdrucks in .vimrc). In Neovim sieht dies jedoch folgendermaßen aus:

Bildbeschreibung hier eingeben

Warum ist die Kombination von set term=xtermund set t_Co=256erforderlich, um die korrekte Anzeige dieses Farbschemas in vim zu erzielen, und warum führt die entsprechende Kombination von Einstellungen in neovim zu einem anderen Ergebnis?

Bearbeiten:

Die Standardeinstellung ist $TERM=xterm256-color , die aus irgendeinem Grund xtermin regulären Versionen überschrieben werden muss , um die Farbanzeige korrekt zu machen. Mit der Umgebungsvariablen 256 sieht neovim folgendermaßen aus:

Bildbeschreibung hier eingeben

Dies ist identisch mit regulären Vim xterm256-color, aber nicht wie beabsichtigt. Mein Ziel ist es zu verstehen, warum der xterm-Hack in vim notwendig ist / funktioniert und warum er in neovim nicht gleich aussieht.

Beachten Sie, dass viele der Farben mit der oben genannten Einstellung für die Umgebungsvariable korrekt angezeigt werden. Besondere Ausnahmen sind Zeilennummern und Hintergrund. Ich vermute, dass die Art und Weise, wie die Farben in diesem speziellen Farbschema angegeben sind, beteiligt sein könnte.

Galle
quelle
1
Ihr $ TERM ist bereits auf das eingestellt, was auf modernen Systemen allgemein als "korrekt" gilt - 256-Farben-fähig. Daher sollte die Option t_Co, die normalerweise für die Kompatibilität mit älteren Terminals vorgesehen ist, nicht erforderlich sein. Was ist, wenn Sie beide Konfigurationszeilen auskommentieren?
David Lord
@David Das Auskommentieren beider Konfigurationszeilen sieht genauso aus wie das Auskommentieren set term=xterm.
Gall
Könnten Sie einen Screenshot der iTerm-Farbkonfiguration einfügen, die Sie verwenden, wenn das Design korrekt gerendert wurde, sowie die Ausgabe, die Sie beim Ausführen dieses Skripts erhalten haben ?
Eric Pruitt

Antworten:

11

Hauptproblem

Das Hauptproblem wird durch die Reihenfolge der Befehle in Ihrem Computer verursacht .vimrc.

Sie legen die g:impact_transbgVariable fest, nachdem Sie das Farbschema geladen haben. Daher ist die Variable nicht vorhanden, wenn sie von der Anweisung des Farbschemas überprüft wird if, und die zweite Version des Farbschemas (im elseBlock) wird verwendet.

Um das Problem zu beheben, müssen Sie lediglich die Zeile, in der die Variable festgelegt ist, über die Zeile verschieben, in die Sie das Farbschema laden:

let g:impact_transbg=1
colorscheme impact3

Sie können (und sollten!) Dann die unnötigen Zeilen von Ihrem entfernen .vimrc:

set term=xterm
set background=dark
set t_Co=256

Andere Probleme

Ich kann auch ein paar andere Missverständnisse / Verwirrungen aufklären, die Sie möglicherweise darüber haben, wie das alles funktioniert:

Erläutern des Verhaltens von 'term'&'t_Co'

Ihr $ TERM ist auf gesetzt xterm256-color. Vim liest dies und fragt terminfo (oder termcap) ab, um herauszufinden, wie viele Farben das Terminal unterstützt, und legt diese dann 't_Co'entsprechend fest. Vorausgesetzt, Ihr $ TERM ist korrekt (Ihr ist) und Ihre terminfo-Datenbank enthält die korrekten Informationen für das Terminal (Ihr Terminals), das Sie niemals manuell zurücksetzen müssen 't_Co'.

Sie setzen Vim's dann jedoch manuell 'term'auf xterm. Ihr Terminfo teilt Vim mit, dass dieses Terminal nur 8 Farben unterstützt. Wenn Sie dies hinzufügen, wird 't_Co'dies fälschlicherweise auf 8 gesetzt. Sie setzen manuell 't_Co' auf 256 zurück, aber wenn Sie die 'term'Einstellung auf dem richtigen Wert belassen hätten, hätten Sie dies nicht nötig .

Wenn Sie 't_Co'nach dem Einstellen manuell wechseln g:impact_transbg, wird das Farbschema übrigens neu geladen (damit sich das Farbschema an die neue Anzahl von Farben anpasst), und da g:impact_transbg es jetzt eingestellt ist, erhalten Sie die gewünschten Farben.

( Wenn die Zeileneinstellung 'term'weggelassen wird, 't_Co'ist sie bereits auf 256 gesetzt, wenn Sie in Ihrer .vimrc-Datei zur letzten Zeile gelangen, und das Farbschema wird nicht neu geladen: daher falsche Farben.)

Also, um es noch einmal zusammenzufassen:

term=xterm
colorscheme impact3
let g:impact_transbg=1
set t_Co=256

Ergebnis: Das Farbschema wird neu geladen, wenn 't_Co'256 eingestellt ist und die Farben korrekt sind.

"term=xterm
colorscheme impact3
let g:impact_transbg=1
set t_Co=256

Ergebnis: Farbschema wird per colorschemeBefehl geladen , Variable existiert nicht, Farben stimmen nicht.

term=xterm
colorscheme impact3
let g:impact_transbg=1
"set t_Co=256

Ergebnis: Farbschema wird per colorschemeBefehl geladen , Variable existiert nicht und Vim verwendet nur 8 Farben, Farben sind falsch.

"term=xterm
colorscheme impact3
let g:impact_transbg=1
"set t_Co=256

Ergebnis: Farbschema wird per colorschemeBefehl geladen , Variable existiert nicht, Farben stimmen nicht.

let g:impact_transbg=1
colorscheme impact3

Ergebnis: Colorscheme durch geladen wird colorschemeBefehl, variable tut exist, so Farben korrekt sind. (Und als Bonus 'term'und 't_Co'sind auch richtig!)

Das Verhalten in NeoVim ist einfach deshalb anders, weil der zu setzende Anruf 't_Co'ignoriert wird, wie andere Antwortende bereits erwähnt haben.

'background'

Nachdem Sie das Farbschema festgelegt haben, legen Sie auch fest 'background'. Für dieses spezielle Farbschema ist dies völlig unnötig, da das erste, was das Farbschema tut, das Einstellen 'background'auf ist 'dark'.

Beachten Sie, dass ich mit dem anderen Antwortenden, der vorschlägt, dass Sie 'background'nach dem Laden Ihres Farbschemas festlegen sollten, nicht einverstanden bin. Das Farbschema kann den Wert von verwenden 'background', um seine Farben anzupassen. 'background'Daher ist die Einstellung vor dem Laden des Farbschemas die offensichtlichere Reihenfolge. (Beachten Sie jedoch 'background', dass Vim alle geladenen Farbschemata neu lädt, wenn Sie die Einstellung ändern, sodass das anschließende Einstellen 'background'ebenfalls funktioniert: Es ist einfach nicht optimal.)

Reich
quelle
1
Danke, das ist sehr gründlich und ich schätze den zusätzlichen Kontext.
Conrad Meyer
@ConradMeyer Ich bin froh, dass es für Sie hilfreich war!
Reichhaltiger
7

Im Fall von Neovim, t_Cound TERMkeinen Unterschied machen.

Sie rufen set background=darkvor und nach dem Anruf an colorscheme impact3. Bewegen Sie set background=darkauf die Unterseite des Farbschemas , und entfernen Sie den anderen Anruf von Ihrem vimrc.

Von :help 'background':

When 'background' is set Vim will adjust the default color 
groups for the new value.
...
When a color scheme is loaded (the "g:colors_name" variable 
is set) setting 'background' will cause the color scheme to 
be reloaded.

Siehe auch: https://github.com/justinmk/molokai/commit/aa1cc201c743dd7d1b80bb2e2b5fbb7894ebfe5f

Mein Ziel ist es zu verstehen, warum der xterm-Hack in vim notwendig ist / funktioniert und warum er in neovim nicht gleich aussieht.

  • Neovim kümmert sich nicht darum, t_Coweil es 256 annimmt, es sei denn, Sie aktivieren "True Color" .
    • Tatsächlich ignoriert Neovim alle t_*Optionen :help t_xx.
  • Neovim lässt sich nicht &termsetzen, weil es bedeutungslos ist. Neovim verwendet Unibilium und andere Mechanismen, um Terminalfähigkeiten zu erkennen.
Justin M. Keyes
quelle
Vielen Dank für Ihre Erkenntnisse zur Erkennung von Neovim-Termfähigkeiten und zu den Einstellungen von `t_ *`. Das Entfernen der überflüssigen Kopie und das Neupositionieren der set background=darkAnweisung hatten keine Auswirkungen, aber diese Details zur zugrunde liegenden Implementierung sind für mich viel wertvoller.
Gall
2

Ich sehe, dass Sie iTerm2 verwenden, also können Sie dies versuchen:

  1. Öffnen Sie das Prefernces-Fenster +,
  2. Gehe zur profilesRegisterkarte
  3. Überprüfen Sie Ihr aktuelles Profil in der linken Liste
  4. Klicken Sie auf die Registerkarte terminalrechts
  5. In der Report terminal typewählenxterm-256color
  6. Erledigt.
Alexander Myshov
quelle
Danke für Ihren Vorschlag. Ich habe das obenstehende mit Anmerkungen zu bearbeitet xterm-256color. Ich habe mit Ihrem Verfahren nachgearbeitet, um den so eingestellten Terminaltyp zu finden.
Gall
2

Ihnen fehlt eine großartige NeoVim-Funktion. Es gibt ein env var, das bei diesen Sachen hilft. Versuchen Sie dies in Ihrem nvimrc:

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 " True gui colors in terminal

Oder

export NVIM_TUI_ENABLE_TRUE_COLOR=1

in der Schale.

Yann Vanhalewyn
quelle
Zu Ihrer Information: Dies erfordert die Verwendung von guifgund guibg. Das Farbschema von OP verwendet ctermfgund ctermbg.
Justin M. Keyes
Oh, du hast Recht. Es tut uns leid!
Yann Vanhalewyn
2

Sie müssen Optionen einrichten

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 
set termguicolors

in deinem .config/nvim/init.vim.

yqbk
quelle
Diese Optionen dienen zur Verwendung von guifgund guibgRGB-Werten für Farben. Das Farbschema der Frage verwendet nur ctermfgund ctermbg.
Tommy A
1
Das hat es für mich getan. TERM war schon xterm-256color. Vielen Dank!
Qix
1

Beachten Sie, dass es sich bei dem spezifischen Farbschema tatsächlich um zwei Farbschemasätze innerhalb einer if-else-Klausel handelt. Das Vorhandensein der Variablen g:impact_transbgwählt die gewünschte Menge von Farben aus und sollte ursprünglich transparente Hintergründe in dem Farbschema berücksichtigen, von dem diese abgeleitet sind .

Das Auskommentieren des 2. Farbschemas und der if-else-Anweisung (wobei nur das gewünschte Farbschema übrig g:impact_transbgbleibt und aufgehoben wird) ergibt das beabsichtigte Verhalten sowohl in vim als auch in neovim, selbst wenn set term=xtermund set t_Co=256entfernt.

Dies impliziert, dass $TERM=xterm-256colorssowohl in vim als auch in neovim die Bedingung if exists("g:impact_transbg")fehlschlägt, jedoch die Kombination der Einstellung

set term=xterm
set t_co=256

ließ die Bedingung erfolgreich sein. Wenn Sie die if-else-Klausel wie oben beschrieben entfernen, ist das wesentliche Problem behoben, aber die Interaktion zwischen den beiden .vimrc-Begriffseinstellungen und ist noch ungeklärt g:impact_transbg.

Galle
quelle
0

Versuchen Sie, Ihre $TERMUmgebungsvariable wie folgt festzulegen :

TERM=xterm-256color

Versuchen Sie auch, nvim wie folgt zu starten:

export TERM=xterm-256color; nvim

Wenn das funktioniert, setzen Sie die $TERMVariable dauerhaft in Ihrer Shell.

Jeff Buttas
quelle
Danke für die Idee, Jeff. Ich habe meine Frage mit Anmerkungen zu bearbeitet xterm-256color. Das Setzen von $ TERM per Export hatte keine Auswirkung.
Gall
0

Ich hatte dieses Problem vor kurzem mit dem Thema Solar. Das Problem ist auf die TERMVariable env zurückzuführen.

Ich habe das Problem behoben, indem ich meinem Terminal-Emulator (in meinem Fall dem Terminator) env TERM=xterm-256color zshanwies , dass er ausgeführt werden soll, anstatt zsh ganz normal zu starten .

benbot
quelle
Der OPs TERM ist bereits auf xterm-256color eingestellt. Ich denke, Sie hatten ein anderes Problem.
Rich