SpecialKey Vordergrundfarbe mit Cursorzeilensatz

8

In diesen Fragen und Antworten wird festgestellt, dass es eine Markierungsgruppe für gibt CursorLineNr, die für die Zeilennummer der Cursorzeile gilt, wenn diese aktiviert set cursorlineist.

Ich stelle fest, dass die Verwendung der Cursorzeile auch die Farbe für eine andere Hervorhebungsgruppe ändert. Dies SpecialKeygilt, wenn Sie z.

 set list listchars=tab:\|_,trail:-

Das Problem dabei ist für mich, dass ich einen dunklen Hintergrund (und damit eine dunkle Cursorlinie) verwende. Meine normale SpecialKeyEinstellung ist auch sehr dunkel, so dass die listcharSymbole nur am Rande sichtbar sind. Aber wenn cursorline sie weiß sind , ist der trailCharakter nicht mehr von einem Treffer zu unterscheiden -. Das Trail-Zeichen wird jedes Mal verwendet, wenn Sie ein Leerzeichen am Ende einer Zeile eingeben. Dies ist also mehr als ein kleines Problem. Normalerweise umfasst das Eingeben einer Zeile von Anfang bis Ende eine Reihe von Leerzeichen, die während der Arbeit leicht von einem Bindestrich-Tippfehler zu unterscheiden sind (oder umgekehrt, ein Leerzeichen-Tippfehler, wenn Sie einen Bindestrich beabsichtigt haben).

Da keine der anderen Highlight-Gruppen betroffen zu sein scheint, CursorLineNrwird vermutlich so etwas angewendet, aber wenn hiich die Liste durchschaue, sehe ich nichts Passendes.

Weiß jemand was das ist? Besser noch, kennt jemand eine Möglichkeit, eine Markierungsgruppe für die Cursorzeile zu ändern?

Goldlöckchen
quelle
2
Ich hebe die Cursorzeile erst kurz hervor, nachdem ich 2 oder mehr Zeilen gesprungen bin. Wenn ich Text bearbeite, ist die Cursorzeile deaktiviert. Wenn Sie sich an dieses Verhalten gewöhnen können, kann dies Ihr Problem mindern.
Joeytwiddle

Antworten:

8

Ich habe für eine mit diesem Verhalten zu kämpfen langen Zeit.

Grundsätzlich wird die Vordergrundfarbe von SpecialKeyin der aktuellen Zeile in die Vordergrundfarbe von Normalif geändert :

  • die cursorlineOption ist aktiviert,
  • Für die CursorLineHervorhebungsgruppe ist eine Hintergrundfarbe festgelegt.

Ich habe dieses Verhalten nie beheben können, egal was ich versucht habe. Das Problem liegt irgendwo im Quellcode von Vim.

romainl
quelle
1
Das ist nicht die Antwort, die ich wollte! Ich habe mein Trail-Zeichen geändert, ~was etwas weniger verwirrend ist (möglicherweise wird auch nach einem obskuren Unicode-Zeichen gesucht).
Goldlöckchen
Ich habe dieses Verhalten auch ohne Hintergrundfarbe für die CursorLine-Gruppe gesehen. Ich habe versucht, es zu deaktivieren (dh none), habe versucht, seinen Standardwert zu
belassen
2

Was für mich funktionierte, waren die folgenden Zeilen in meiner .vimrc(basierend auf der Antwort von Igor Mikushkin ).

autocmd BufNewFile,BufRead * call matchadd('SpecialKey', '\s\+')
autocmd BufNewFile,BufRead * call matchadd('NonText', '\n\+')

VimEnterFunktioniert nur für die erste Datei, die Sie öffnen, nicht für Dateien / Registerkarten, die Sie anschließend öffnen. BufNewFile,BufReadhat bisher für alle Puffer gearbeitet, die ich geöffnet habe.

Die erste Zeile enthält Leerzeichen. Vim hebt sie in der SpecialKeyGruppe hervor, daher wenden wir diese Stile auf sie an.

Die zweite Zeile enthält Zeilenumbrüche. Vim hebt sie in der NonTextGruppe hervor, daher wenden wir diese Stile auf sie an. Sie brauchen die zweite Zeile nur dann wirklich, wenn Ihre NonTextZeichen anders hervorgehoben sind als SpecialKeyZeichen.

Nizar Khalife Iglesias
quelle
Dies sollte die Antwort sein.
Hozza
1

Die folgenden Zeilen in .vimrc haben das Problem für mich behoben.

au VimEnter * call matchadd('SpecialKey', '^\s\+', -1)
au VimEnter * call matchadd('SpecialKey', '\s\+$', -1)

Es überschreibt andere Stilanwendungen für Tabulatoren und nachgestellte Leerzeichen innerhalb einer Cursorzeile.

Igor Mikushkin
quelle
Warum speichern Sie das matchadd()Ergebnis in einer Variablen, wenn Sie es nicht verwenden?
Christian Brabandt
@ChristianBrabandt Danke, es ist jetzt behoben.
Igor Mikushkin
Dies funktioniert auch bei mir mit NeoVim.
Hakunin
0

Es gibt noch eine andere "Lösung", eigentlich eine Art Kludge für dieses Problem.

Ich habe benutzerdefinierte Syntaxgruppen für solche wie "Listchars".

So was:

hi WhiteSpaceChar ctermfg=251 guifg=#999999
call matchadd("WhiteSpaceChar", "[ \t]")

Sie könnten so etwas tun (obwohl ich es nicht getestet habe):

hi TrailChar ctermfg=251 guifg=#999999
" the \v in the regex is Vim's flag to use Perl-like regex syntax
call matchadd("TrailChar", "\v +$")

Bei diesem Ansatz gibt es jedoch mindestens zwei Probleme:

  1. Wenn Sie ein Fenster teilen oder eine neue Registerkarte usw. erstellen, wird die Hervorhebung im aktuellen Fenster wie folgt unterbrochen:

Das Leerzeichen wird unterbrochen, wenn ein neues Fenster geöffnet wird

Um dies zu beheben, habe ich spezielle Funktionen wie:

fun! ResetHiglightJS()
  set syntax=javascript
  "these are for the IndentLine plugin
  "IndentLinesDisable
  "IndentLinesEnable
endfun

für jede Syntaxgruppe, die ich häufig verwende, um die Hervorhebung manuell zu korrigieren. Sie können dies auf andere Weise tun, z. B. durch automatische Befehle oder durch manuelles Festlegen des Werts für die Syntaxoption. Damit das Zurücksetzen der Syntax funktioniert, muss außerdem Folgendes vorhanden sein:

call matchadd("WhiteSpaceChar", "[ \t]")

in jeder entsprechenden Syntaxdatei, wie ~/.vim/after/syntax/javascript.vim

  1. Dieser Ansatz funktioniert normalerweise nicht mit mindestens einem Plugin - dem IndentLine-Plugin. Daher musste ich mich an eine alte Version halten, indem ich manuell festlegte let g:indentLine_newVersion = 0, wo das Plugin normal funktioniert.

Auf andere Weise funktioniert dieser Ansatz normalerweise ohne das IndentLine-Plugin:

Leerzeichen haben eine gewünschte Farbe in der Cursorzeile

Und akzeptabel damit:

indentLine Farbe in der Cursorzeile

user907860
quelle