Heben Sie den gesamten Text nach mehrfachen "#" hervor.

620
haz

Ich versuche Text fett zu machen, wenn er nach einer Reihe von #Hashes erscheint. Dies ist die Zeile in meinem .vimrc:

au BufRead,BufNewFile *.txt hi header cterm=cyan ctermbg=red 

und meine versuchten regulären Ausdrücke:

au BufRead,BufNewFile *.txt syn match header /\n#+\zs.*\ze/ au BufRead,BufNewFile *.txt syn match header /^#+\zs.*\ze/ "Why doesn't ^ work? 

Diese Art von Arbeiten funktioniert aber auch mit dem #s und falschem Text. Es ist auch sehr langsam und dauert ungefähr ~ 10 Sekunden, um auf mein Macbook zu passen:

au BufRead,BufNewFile *.txt syn match header /\zs\n#*\w*\ze/ 

Ich bin mir nicht sicher, was ich falsch mache - diese Arbeit an Online-Regex-Testern.

Bei diesem Tester^#*(.*) funktioniert der Regex perfekt, wobei ich mit der ersten Capture-Gruppe übereinstimme. Wie übersetze ich das für vim?

Prost.

1

1 Antwort auf die Frage

2
Ingo Karkat

Der Multiplikator für 1 oder mehr Übereinstimmungen lautet \+: Sie haben den Backslash (oder den \vModifikator "sehr magisch") vergessen . Die Verwendung \zeam Ende ist überflüssig. ^Übereinstimmungen an jedem Zeilenanfang \n, beginnend mit der zweiten Zeile. Bitte beachten Sie, dass Vim einen speziellen Dialekt für reguläre Ausdrücke verwendet, sodass verschiedene Websites möglicherweise Anpassungen erfordern. Die :help patternSeiten sind die beste und maßgebliche Referenz.

syn match header /^#\+\zs.*/ 

Außerdem kann Ihr Syntaxzusatz durch vorhandene Syntaxregeln verdeckt werden. Sie können das Anhängen versuchen containedin=ALL, dies ist jedoch keine allgemeine Lösung. Möglicherweise müssen Sie die vorhandene Syntax analysieren und für jede Syntax eine spezielle Lösung erstellen. Alternativ können Sie den :matchBefehl verwenden. Dies funktioniert über (und unabhängig) der Syntaxhervorhebung. Der Nachteil ist, dass dies fensterlokal ist. Sie benötigen also :autocmdMagie, wenn Sie dies nur auf bestimmte Puffer oder auch auf Fensterteilungen anwenden möchten.

match header /^#\+\zs.*/ 

Stilkritik

Mit Ihrer au BufRead,BufNewFile *.txt syn match, Ihrer Vermischung verschiedener Aspekte: Erkennung des Dateityps (Zuordnung von *.txt(hier: implizitem) Dateityp), Anpassung der Datentypen, Hervorhebung der Syntax. Es wäre sauberer (und erweiterbarer), die Dinge voneinander zu trennen:

  1. Definieren Sie eine textDatei des Typs: au BufRead,BufNewFile *.txt setf text. Diese Erkennung ist möglicherweise bereits in Ihrer Vim-Version vorhanden.
  2. Definieren Sie die Hervorhebung (oder Erweiterung) der Syntax in ~/.vim/syntax/text.vim(oder ~/.vim/after/syntax/text.vimerweitern Sie eine vorhandene Syntax).
Das funktioniert super - danke für deine Hilfe! Vor allem die Stilkritik - es kann schwierig sein, die richtigen Konventionen zu finden. haz vor 6 Jahren 0