Wie kann ich meinem lokalen vimrc zusätzliche Syntaxhervorhebungsregeln hinzufügen?

10

Ich habe gvim sowohl auf Fedora als auch auf Win7 installiert. Ich habe festgestellt, dass sowohl vim als auch gvim unter Fedora den Funktionsnamen im C-Code nicht hervorgehoben haben, während gvim unter win7 ihn hervorgehoben hat.

Ich fand, dass auf win7 vim73/syntax/c.vimdie zusätzlichen Zeilen am Ende stehen:

syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
hi cFunction gui=NONE guifg=#B5A1FF

Wenn ich diese Zeilen zu c.vimFedora hinzufüge, kann gvim auch den Funktionsnamen hervorheben.

Um die Portabilität aufrechtzuerhalten, möchte ich nur das ändern .vimrc, um den Funktionsnamen hervorzuheben. Nach dem Hinzufügen dieser Zeilen in das .vimrchat es jedoch nicht funktioniert.

Kann mir jemand helfen? Ich habe eine Suche durchgeführt und es gibt viele Lösungen, um die Funktionsnamen in vim hervorzuheben. Aber ich bin nur neugierig, wie diese Zeilen funktionieren .vimrc. Vielen Dank!

Tamlok
quelle
5
Versuchen Sie es ~/.vim/after/syntax/c.vimstattdessen hinzuzufügen .
Muru
@muru Ja, es funktioniert. Aber wie wäre es damit .vimrc?
Tamlok
autocmd BufEnter *.c hl ...Sie müssten wahrscheinlich so etwas verwenden , aber Sie sollten es behalten after/syntax/c.vim. Jede moderne Version von Vim wird das .vim/after/Verzeichnis verstehen . Unter Windows wäre der Pfad so vimfiles/after/..., dass die Portabilität kein großes Problem darstellen sollte (insbesondere, wenn Sie Plugins verwenden).
Muru

Antworten:

13

Nach dem Hinzufügen dieser Zeilen zur .vimrc funktionierte dies jedoch nicht.

Der Grund dafür ist, dass Vim beim Festlegen der 'syntax'Option vorhandene Syntaxelemente löscht . Dies geschieht, weil das Beibehalten der alten Syntaxelemente zu seltsamen Situationen führen würde. wenn Sie einen Puffer haben , die hat syntax=foound verwenden set syntax=bardann werden Sie mit einem Puffer am Ende der Syntax für die Hervorhebung hat beide foo und bar.

Wenn Vim vimrcgestartet wird, wird es einmal geladen (beim Start), aber jedes Mal, wenn die Optionen filetypeoder syntaxfestgelegt werden, werden die Dateityp- und Syntaxdateien geladen , wodurch die in Ihrem vimrc festgelegten Werte zurückgesetzt werden.

Selbst wenn es nicht zurückgesetzt würde, wäre es keine gute Idee, es einfach zu Ihrem vimrc hinzuzufügen, da es für alle Puffer gelten würde und nicht nur für Puffer mit syntax=c.


Der folgende Text setzt Vim auf einem Unix-y-System voraus, funktioniert jedoch auch für Neovim- und Windows-Benutzer:

  • Neovim Benutzer sollten ersetzen ~/.vim/mit ~/.config/nvim/.
  • Windows - Anwender sollten ersetzen ~/.vim/mit %USERPROFILE%\vimfiles\.

Überschreiben einer gesamten Datei

Der einfachste Weg, etwas zu ändern, besteht darin, es einfach zu überschreiben . Erstellen Sie dazu eine Datei in ~/.vim/<file>.vim.

<file.vim>ist der Pfad relativ zu $VIMRUNTIME(einschließlich Unterverzeichnissen). In Ihrem Beispiel sollte es sein syntax/c.vim. Es wird anstelle der Datei in geladen $VIMRUNTIME.

Das Ergebnis ist, dass es einfacher ist, Änderungen vorzunehmen - das Ändern bestehender Syntaxdateien kann manchmal etwas schwierig sein. Der Nachteil ist, dass Sie keine zukünftigen Updates für die systemweite Datei erhalten.

Ich verwende dies oft als Ausgangspunkt, um mit Syntaxdateien zu experimentieren und später meine lokalen Änderungen mit einer der unten beschriebenen Methoden an einem lokalen Zusatz zu extrahieren.

Lokale Ergänzungen

Es gibt zwei Möglichkeiten, Syntaxdateien lokale Ergänzungen hinzuzufügen: Sie sind funktional identisch und Sie können die von Ihnen bevorzugte Methode verwenden.

Syntax autocmd

Verwenden Sie das Syntaxautocmd:

augroup ft_c
    autocmd!
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    autocmd Syntax c hi cFunction gui=NONE guifg=#B5A1FF
augroup end

Beachten Sie, dass das Verketten mehrerer Befehle |hier problematisch ist, da sie tendenziell als Teil des :synBefehls interpretiert werden , weshalb ich sie mehrmals wiederholt habe autocmd Syntax c. Eine Alternative wäre die Verwendung einer Funktion:

fun s:c()
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    hi cFunction gui=NONE guifg=#B5A1FF
endfun

augroup ft_c
  autocmd!
  autocmd Syntax c call s:c()
augroup end

Der Vorteil ist, dass alle Änderungen in einer einzigen Datei enthalten sein können. Der Nachteil ist, dass es ein bisschen hässlich ist, besonders wenn Sie viele Änderungen haben.

nach Verzeichnis

Verwenden Sie das Nachverzeichnis : ~/.vim/after/<file>.vim.

Dies wird nach <file>.vimhas geladen , wobei <file.vim>der Pfad relativ zu $VIMRUNTIME(einschließlich Unterverzeichnissen) ist. In Ihrem Beispiel sollte es sein syntax/c.vim.

Siehe auch :help after-directory.

Der Vorteil ist, dass es etwas besser lesbar ist als das Autocmd, insbesondere wenn Sie viele Änderungen haben. Der Nachteil ist, dass Sie eine zusätzliche Datei kopieren müssen, wenn Sie Ihr Vim-Setup auf verschiedene Computer spiegeln möchten (dies ist ein wichtiger Grund, warum viele Benutzer ihre Vim-Dateien in einem GitHub-Repo aufbewahren, damit sie problemlos auf mehreren Computern gespiegelt werden können ).

Martin Tournoij
quelle