Benutzerdefinierte Vim-Hervorhebung

12

Ich bearbeite gerade einige XML-Dateien und habe mir einige Kommentare zu Dingen hinterlassen, auf die ich zurückkommen kann. So was

<!-- Question: bla bla -->

Ich bearbeite gerade mit vim und möchte, dass vim die Frage jetzt hervorhebt, damit ich meinen Code leicht durchsehen und alle Stellen finden kann, die ich mir ansehen muss. Ich weiß, dass ich etwas in mein vimrc einfügen muss, aber ich denke, dass ich nach dem Falschen suchen könnte.

Aktualisieren

Ich habe versucht, dies in meine zu setzen, .vimrcaber es hatte keine Wirkung:

syn keyword JakeAnnotation      Question

hi JakeAnnotation gui=bold term=bold cterm=bold

Update 2

Eigentlich kann ich sehen, dass das, was ich vorher getan habe, eine gewisse Wirkung hatte, denn wenn ich das tue:

:hi

Es zeigt mir alle Dinge, die es hervorhebt, und einer der Einträge ist:

JakeAnnotation xxx term=bold cterm=bold ctermbg=6

( und das xxx ist korrekt formatiert )

Dies führt mich zu der Annahme, dass ich die Frage einfach nicht richtig definiere. Muss die Frage für sich allein in einer Zeile stehen?

Update 3

Ok, also zum Beitrag von Benutzer 22303 habe ich folgendes:

highlight MyQuestion cterm=bold term=bold ctermbg=blue ctermfg=black
match MyQuestion /Question/

Ich vermute jedoch, dass Sie nur eine Übereinstimmung pro Datei haben dürfen. Denn wenn ich das mache:

highlight MyQuestion cterm=bold term=bold ctermbg=blue ctermfg=black
match MyQuestion /Question/
highlight MyRelook cterm=bold term=bold ctermbg=blue ctermfg=black
match MyRelook /Another look/

Der erste hört auf zu arbeiten. (Aber der zweite funktioniert).

sechzig Fuß
quelle

Antworten:

9

Ich denke, wir haben Ihnen einige Antworten gegeben, die nicht ganz richtig sind. Hier ist etwas zum Ausprobieren, das ich auf meinem Computer getestet habe.

Erstellen Sie zunächst Ihre eigene neue Markierungsgruppe:

:highlight MyQuestions guifg=red guibg=green

Geben Sie nun an, dass die Markierungsgruppe immer dann vorhanden ist, wenn ein Muster übereinstimmt:

:syntax match MyQuestions /Question/

Daraufhin sollte in jeder Zeile mit diesem Text die Hervorhebung des Textes "Frage" angezeigt werden. Um zu erweitern, um die ganze Zeile anzuzeigen, würden Sie den Suchtext so ändern, dass Platzhalter mit der gesamten Zeile übereinstimmen.

:syntax match MyQuestions /.*Question.*/

user22303
quelle
Eigentlich hat das nur sortiv funktioniert ... Ich vermute, dass Sie immer nur ein Match gleichzeitig haben dürfen, siehe Update Nr. 3 ...
Sixtyfootersdude
1
@sixtyfootersdude: Entschuldigung, es gab wieder einen kleinen Fehler. Alle Übereinstimmungsbefehle müssen stattdessen "Syntax-Übereinstimmungsbefehle" sein. Anstelle von [: match MyQuestions /.*Question.*/] möchten Sie also [: syntax match MyQuestions /.*Question.*/] verwenden. So können Sie so viele verschiedene Übereinstimmungen haben, wie Sie möchten. Dies ist in der Tat eine der häufigsten Arten von Befehlen, die in Syntaxdateien abgelegt werden. Sie können sie jedoch an einer beliebigen Stelle ausführen, entweder in der Befehlszeile, in vimrc oder in anderen Skripten.
user22303
Das syntaxHinzufügen vor match...meiner vimrc-Datei bewirkt, dass Übereinstimmungen überhaupt keine Auswirkungen haben. Sollte ich das hier tun? Das Ausführen einer geöffneten Datei hat ebenfalls keine Auswirkung.
Sixtyfootersdude
1
@sixtyfooters: Ich bin mir nicht sicher, was für dich passiert, aber das ist definitiv der richtige Weg. Testen Sie an der Befehlszeile, bevor Sie ein Skript einfügen (möglicherweise werden die Syntaxeinstellungen irgendwo in anderen Skripten gelöscht, die für Ihre Datei geladen werden). Überprüfen Sie nach der Definition, welche Gruppen vorhanden sind und welche Hervorhebungen sie haben, indem Sie einen bloßen Befehl ": Highlight" eingeben (oder "Syntax", "Hervorhebungstest" aus dem GUI-Menü in gvim auswählen). Denken Sie daran, dass Sie zuerst den Befehl "Hervorheben" verwenden möchten, um eine Gruppe zu erstellen, und dann "Syntaxübereinstimmung" verwenden, um das Übereinstimmungsmuster festzulegen.
user22303
@sixtyfooters: Ich gehe davon aus, dass Sie vim in einem Terminal ausführen (dh nicht in gvim), sodass das Festlegen nur der Begriffeigenschaften funktionieren sollte. Es klingt für mich so, als würden die Syntaxbefehle gelöscht, wenn eine neue Datei geladen wird und eine zugehörige Syntaxdatei ausgeführt wird und alle vorherigen Syntaxbefehle gelöscht werden. Um dies noch einmal zu überprüfen, geben Sie diese Befehle bei Verwendung der Befehlszeile jedes Mal neu ein, wenn Sie eine Datei laden? Ich denke, Sie könnten versuchen, mit Text in einem neuen Puffer zu testen, der noch nicht einmal gespeichert ist und dem noch nicht einmal ein Dateiname zugewiesen ist.
user22303
5

Die gesuchte Datei ist eine Syntaxdatei. Versuchen Sie es mit /usr/local/share/vim/syntax/oder /usr/share/vim/syntax/. Die gewünschte Datei ist xml.vim.

Am einfachsten ist es, die Linie zu finden, die hat

syn keyword xmlTodo         contained TODO FIXME XXX

und ändern Sie es zu:

syn keyword xmlTodo         contained TODO FIXME XXX Question

Dadurch wird jedem Kommentar, der den Text enthält, die Markierung "Todo" hinzugefügt Question.

Wenn Sie dies für (jemals) verwenden möchten, ist es am besten, die Datei xml.vim in Ihre lokale ~/.vim/syntaxDatei zu kopieren , damit Änderungen an vim Ihre benutzerdefinierte Syntaxdatei nicht überschreiben.

Aktualisieren

Wenn Sie eine ähnliche (sortof) Funktion in einer Datei wünschen , würde ich den Befehl 'goto' verwenden. Ich gebe zu, dass dies wie eine Suche ist, von der Sie sagten, dass sie Sie nervt.

Wenn sich der Cursor während der Bearbeitung auf ein Wort befindet, geben Sie ein gd, um vom aktuellen Punkt in der Datei aus gDzu suchen oder von Anfang an zu suchen. Jedes Wort in Ihrer Datei, das mit dem aktuellen Wort übereinstimmt, wird hervorgehoben. Sie können eingeben n, um zur nächsten Instanz dieses Wortes zu springen.

Ich neige dazu, dies zu tun, weil Sie Highlight und Navigation mit minimaler Eingabe erhalten. Sie schalten das Highlight wie gewohnt aus::noh[lsearch]

DaveParillo
quelle
Wow! Das klingt wie das, was ich tun möchte. Ich habe derzeit keine ~/.vim/ folder. If I created it and create the file Syntax. Muss ich irgendwo darauf verweisen (vielleicht in .vimrc?), um vim anzuweisen, sie zu verwenden?
Sixtyfootersdude
1
Nee. Vim sucht automatisch danach (und nach einigen anderen Verzeichnissen - zum Beispiel: Plugins, Farbe, Compiler). Wenn in Ihrem Heimatbereich eine Syntaxdatei vorhanden ist, hat diese Vorrang vor dem Systemstandard.
DaveParillo
1
syntaxxml.vim
Um
Soll ich meine .vimrc in mein .vim-Verzeichnis einfügen?
Sixtyfootersdude
1
Syntaxdateien befinden sich in Ihrem .vim-Verzeichnis. Das Syntax-Highlight soll sprachspezifisch sein. Wenn Sie eine ähnliche (sortof) Funktion in einer Datei wünschen , würde ich den Befehl 'goto' verwenden. Ich werde es meiner Antwort hinzufügen.
DaveParillo
2

Du könntest es einfach tun

:set hlsearch

Und dann nach Frage suchen

Dominik
quelle
Das habe ich getan, aber hlsearch nervt mich. +1, danke für den Vorschlag.
Sixtyfootersdude
2

Sie haben mehrere Möglichkeiten.
- Eins, wie Dominik erwähnte ... Sie können nacheinander nach diesen suchen (nicht so praktisch)
- Zwei, Sie können ": g / <- Frage" tun, um eine "Liste" von allen zu erhalten (etwas besser) , gibt ein Gesamtbild)
- Drei, Sie können eine Hervorhebungsgruppe einrichten, wenn Sie nur solche Kommentare in XML-Dateien verwenden (ich habe keine Ahnung, wie XML aussieht, daher weiß ich nicht, ob es welche gibt andere Art von Kommentaren in ihnen auch). Dies wäre gut, wenn Sie es in vimrc eingerichtet hätten, da Ihre xlm.vim-Datei beim Aktualisieren von vim mit einer neueren Version nicht mehr vorhanden ist.

Turm
quelle
+1 Ich mag den :g/Vorschlag, kann aber schwierig anzuwenden sein, wenn 'Frage' nicht sofort dem Kommentar-Tag folgt.
DaveParillo
@ DaveParillo - ah, ja. Nun, wie gesagt, ich weiß nichts über XML, also nahm ich an, dass es immer so war.
Turm
Wie kann ich eine Hervorhebungsgruppe einrichten?
Sixtyfootersdude
1
@sixtyfootersdude - siehe ": help e410".
Turm
@ Idigas: Danke für den Hinweis. Hatte einen Blick aber konnte mein Problem immer noch nicht lösen. Ich habe der Frage ein Update hinzugefügt. Vielen Dank.
Sixtyfootersdude
1

Sie müssen den Befehl nicht unbedingt in Ihr vimrc einfügen. Sie können es jederzeit einfach über die Befehlszeile eingeben und dann löschen, wenn Sie die Hervorhebung nicht mehr wünschen. Befehle wären ungefähr so:

: hi Frage guifg = rot guibg = blau gui = fett

In gvim (dh vim mit einer GUI) werden die Einstellungen für den Vordergrund (guifg), den Hintergrund und die allgemeinen Zeichen festgelegt.

Wenn Sie dieses Higlighting loswerden möchten, gehen Sie wie folgt vor:

: hi Frage klar

Mit vim in einem Terminal können Sie Folgendes ändern:

: hi Frage ctermfg = rot ctermbg = blauer Begriff = fett

Sie können natürlich alle diese in Ihr vimrc einfügen, und Sie können auch die GUI- und Term-Flags in einem einzigen Hi-Befehl kombinieren.


[unten hinzugefügt, nachdem ich die Antwort eines anderen Posters gelesen habe]

Entschuldigung, ich ging davon aus, dass die Syntax Ihrer Fragenzeilen bereits mit den Einstellungen Ihrer Syntaxdatei für das in Vim integrierte Highlight-Tag "Frage" übereinstimmt. Schauen Sie sich einfach die andere Antwort an, in der die XML-Syntaxdatei für vim erwähnt wird, und geben Sie dann die obigen Befehle mit der ToDo-Markierungsgruppe anstelle von Frage aus.

user22303
quelle
Versucht: hi Frage ctermfg = rot ctermbg = blauer Begriff = fett, hatte aber keine Wirkung.
Sixtyfootersdude
Der Befehl: hi hat lediglich festgelegt, wie die Fragengruppe hervorgehoben werden soll. Jetzt müssen Sie angeben, welche Dokumentbereiche Teil der Fragengruppe sind. Sie können dies mit einem Match-Befehl tun
::
0

Ich bin zu spät zur Party, aber ich benutze TODOund FIXMEfür genau diese Situation.

Die meisten, wenn nicht alle Farbschemata heben das TODOim folgenden Beispiel mit einer Kombination aus Hintergrundfarbe, Unterstreichung und Kursivschrift hervor:

<tree>
  <!--TODO : do I have to add a trunk tag ?-->
  <branch>
    <leaf>caterpillar</leaf>
    <leaf>caterpillar</leaf>
  </branch>
</tree>

Es passt nicht wirklich semantisch, funktioniert aber aus rein funktionaler Sicht sehr gut.

romainl
quelle