Frage

Ich entscheide, mehr über vim und seine Syntax-Hervorhebung zu lernen. Anhand von Beispielen für andere, ich schaffe meine eigene Syntax-Datei für Markdown. Ich habe mkd.vim und es hat diese zu Problem. Mein Problem ist, zwischen Listenelemente und Codeblock Hervorhebung.

Codeblock Definition :

  • erste Zeile ist leer
  • zweite Zeile beginnt mit mindestens 4 Leerzeichen oder 1 tab
  • Block wird mit einer Leerzeile beendet

Beispiel:

Regular text

    this is code, monospaced and left untouched by markdown
    another line of code

Regular Text

Meine Vim Syntax für Codeblock:

syn match mkdCodeBlock   /\(\s\{4,}\|\t\{1,}\).*\n/ contained nextgroup=mkdCodeBlock  

hi link mkdCodeBlock  comment

Unorder Liste item Definition :

  • erste Zeile ist leer
  • zweite Zeile beginnt mit einem [- + *] gefolgt von einem Leerzeichen
  • wird die Liste mit einer Leerzeile dann eine normale (nicht-Liste) Zeile
  • fertig
  • in zwischen Positionen eines beliebigen Anzahl von Leerzeilen hinzugefügt werden kann,
  • eine Unterliste wird spezifiziert durch Einrücken (4 Raumes oder 1 tab)
  • eine Reihe von normalen Text nach einem Listenelement ist als eine Fortsetzung dieser Liste Artikel enthält

Beispiel:

Regular text

- item 1

    - sub item 1
    - sub item 2
- item 2
this is part of item 2
so is this


- item 3, still in the same list
    - sub item 1
    - sub item 2

Regular text, list ends above

Meine Vim Syntax für unorder Listenelement Definition (I markieren [-+*] only):

syn region  mkdListItem start=/\s*[-*+]\s\+/ matchgroup=pdcListText end=".*" contained nextgroup=mkdListItem,mkdListSkipNL contains=@Spell skipnl 
syn match mkdListSkipNL /\s*\n/ contained nextgroup=mkdListItem,mkdListSkipNL skipnl

hi link mkdListItem  operator

Ich kann die Markierung mit der Darstellung der beiden letzten Regel für Liste und mit einem Codeblock zu arbeiten.

Dies ist ein Beispiel, dass meine Syntax-Hervorhebung bricht:

Regular text

- Item 1
- Item 2
part of item 2

    - these 2 line should be highlighted as a list item
    - but they are highlighted as a code block

Ich kann zur Zeit nicht herausfinden, wie die Hervorhebung bekommen, wie ich es auch will arbeiten


Sie haben eine „globale“ Syntaxregel in den beiden unten aufgeführten Regeln verwendet hinzuzufügen. Es ist ein, um sicherzustellen, dass sie mit einer Leerzeile gestartet werden.

syn match mkdBlankLine   /^\s*\n/    nextgroup=mkdCodeBlock,mkdListItem transparent

Ein weiterer Hinweis: Ich hätte mehr klar. In meiner Syntaxdatei, werden die Listenregeln vor der Blockquote Regeln


War es hilfreich?

Lösung

So stellen Sie sicher, dass die Definition von mkdListItem nach der Definition von mkdCodeBlock ist, wie folgt aus:

syn match mkdCodeBlock   /\(\s\{4,}\|\t\{1,}\).*\n/ contained nextgroup=mkdCodeBlock  
hi link mkdCodeBlock  comment

syn region  mkdListItem start=/\s*[-*+]\s\+/ matchgroup=pdcListText end=".*" contained nextgroup=mkdListItem,mkdListSkipNL contains=@Spell skipnl 
syn match mkdListSkipNL /\s*\n/ contained nextgroup=mkdListItem,mkdListSkipNL skipnl
hi link mkdListItem  operator

syn match mkdBlankLine   /^\s*\n/    nextgroup=mkdCodeBlock,mkdListItem transparent

Vim-Dokumentation sagt in :help :syn-define:

"Falls mehr als ein Element paßt in der gleichen Position, die eine, die war definiert LAST gewinnt. So können Sie zuvor definierte Syntaxelemente verändert werden, indem mit einem Element, das den gleichen Text übereinstimmt. Aber ein Schlüsselwort geht immer vor einem Spiel oder Region. Und ein Schlüsselwort mit passendem Fall geht immer vor einem keyword mit Fall zu ignorieren. "

Andere Tipps

hcs42 richtig war. Ich erinnere mich jetzt diesen Abschnitt zu lesen, aber ich habe es vergessen, bis hcs24 erinnerte mich darüber.

Hier ist meine aktualisierte Syntax (einige andere zwickt), das funktioniert:

"""""""""""""""""""""""""""""""""""""""
" Code Blocks:

"   Indent with at least 4 space or 1 tab
"   This rule must appear for mkdListItem, or highlighting gets messed up
syn match mkdCodeBlock   /\(\s\{4,}\|\t\{1,}\).*\n/ contained nextgroup=mkdCodeBlock  

"""""""""""""""""""""""""""""""""""""""
" Lists:

"   These first two rules need to be first or the highlighting will be
"   incorrect

"   Continue a list on the current line or next line
syn match mkdListCont /\s*[^-+*].*/ contained nextgroup=mkdListCont,mkdListItem,mkdListSkipNL contains=@Spell skipnl transparent

"   Skip empty lines
syn match mkdListSkipNL /\s*\n/ contained nextgroup=mkdListItem,mkdListSkipNL 

"   Unorder list
syn match  mkdListItem /\s*[-*+]\s\+/ contained nextgroup=mkdListSkipNL,mkdListCont  skipnl 

Tao Zhyn, dass vielleicht deckt Ihre Anwendungsfälle, aber es die Markdown-Syntax nicht abdeckt. In Markdown ein Listenelement könnte enthält einen Code-Block. Sie konnten einen Blick auf meine Lösung nehmen hier

TL; DR; das Problem ist, dass vim nicht, dass Sie etwas nicht sagen lassen, wie: ein Block, der die gleiche Vertiefung als Behälter + 4 Räume hat. Die einzige Lösung gefunden I Regeln für jede Art von Blöcken zu generieren, die in einer Listenelement für jede Ebene der Vertiefung enthalten sein könnten (tatsächlich ich 42 Einrückungsebene unterstützen, aber es ist eine beliebige Zahl)

Also ich habe markdownCodeBlockInListItemAtLevel1, dass muss in einer markdownListItemAtLevel1 enthalten sein und es muss mindestens 8 führende Leerzeichen haben, ein dann markdownCodeBlockInListItemAtLevel2, dass muss in einer markdownListItemAtLevel2 enthalten sein, muss in einem markdownListItemAtLevel1 ant enthalten sein muss mindestens 10 führende Leerzeichen, ecc ...

haben

Ich weiß, dass ein paar Jahre sind vergangen, aber vielleicht würde jemand diese Antwort hilfreich betrachten, da alle Syntax basiert auf Vertiefung des gleichen Problems leidet

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top