2008-09-26 8 views
10

Je décide d'en savoir plus sur vim et sa coloration syntaxique. En utilisant des exemples pour les autres, je crée mon propre fichier de syntaxe pour Markdown. J'ai vu mkd.vim et il a aussi ce problème. Mon problème se situe entre les éléments de la liste et la mise en surbrillance des blocs de code.Surlignage de Vim Markdown (éléments de liste et conflits de blocs de code)

bloc de code definition:

  • première ligne est vide
  • deuxième ligne commence avec au moins 4 espaces ou une languette
  • bloc est terminé par une ligne blanche

Exemple:

Regular text 

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

Regular Text 

Ma syntaxe Vim pour le bloc de code:

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

hi link mkdCodeBlock comment 

UNORDER Liste item definition:

  • première ligne est vide
  • deuxième ligne commence par un [- + *] suivi d'un espace
  • la liste est finie avec une ligne vide puis une ligne normale (sans liste)
  • entre les lignes de ligne il est possible d'ajouter un nombre de lignes vides
  • une liste secondaire est spécifiée par l'indentation (4 espace ou une tabulation)
  • une ligne de texte normal après un élément de liste est inclut dans le prolongement de cet élément de la liste

Exemple:

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 

syntaxe Ma pour la définition de Vim élément de la liste de UNORDER (je ne [-+*] souligner):

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

hi link mkdListItem operator 

Je ne peux pas obtenir le Highli essayer de travailler avec les deux dernières règles pour la liste et avec un bloc de code.

Voici un exemple qui casse ma coloration syntaxique:

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 

Actuellement, je ne peux pas comprendre comment obtenir la mise en avant de travailler comme je le veux aussi


oublié d'ajouter un règle de syntaxe "globale" utilisée dans les deux règles répertoriées ci-dessous. C'est pour s'assurer qu'ils commencent avec une ligne vide.

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

Une autre note: J'aurais été plus clair.Dans mon fichier de syntaxe, les règles de la liste apparaissent avant les règles Blockquote


+0

Cool. Ça me fait finalement vouloir apprendre les scripts vim. :) – jop

Répondre

6

Assurez-vous que la définition de mkdListItem est après la définition de mkdCodeBlock, comme ceci:

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 [email protected] skipnl 
syn match mkdListSkipNL /\s*\n/ contained nextgroup=mkdListItem,mkdListSkipNL skipnl 
hi link mkdListItem operator 

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

documentation Vim dit dans :help :syn-define :

"Si plus d'un élément correspond à la même position, celui qui a été défini a été attribué à LAST, ce qui vous permet de remplacer les éléments de syntaxe précédemment définis par à l'aide d'un i tem qui correspond au même texte. Mais un mot clé est toujours précédé d'une correspondance ou d'une région . Et un mot-clé avec le cas correspondant passe toujours avant un mot-clé d'ignorer le cas. »

+0

Vous avez raison. J'ai mis à jour ma question (en bas), mes règles de liste sont avant ma règle de blockquote. Pourriez-vous retourner votre exemple, alors blockquote est avant la liste. Ensuite, je peux accepter votre réponse. –

+0

Vous avez raison, à l'origine j'ai résolu le "problème inverse" :) – hcs42

1

hcs42 était correcte. Je ne me souviens avoir lu cet article, mais j'oublié jusqu'à ce que hcs24 m'a rappelé à ce sujet.

ici est ma syntaxe mise à jour (quelques autres tweaks) qui fonctionne:

 
""""""""""""""""""""""""""""""""""""""" 
" 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 [email protected] 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 
0

Tao Zhyn, qui couvre peut-être votre cas d'utilisation, mais il ne couvre pas la syntaxe Markdown Dans Markdown un élément de liste pourrait contenir un bloc de code. Vous pouvez jeter un oeil à ma solution here

TL; DR; le problème est que vim ne vous laisse pas dire quelque chose comme: un bloc qui a la même indentation que son conteneur + 4 espaces. La seule solution que j'ai trouvée est de générer des règles pour chaque type de blocs qui pourraient être contenus dans un élément de liste pour chaque niveau d'indentation (en fait, je supporte le niveau d'indentation mais c'est un nombre arbitraire). doit être contenu dans un markdownListItemAtLevel1 et il doit avoir au moins 8 espaces de début, une ensuite markdownCodeBlockInListItemAtLevel2 que doit être contenu dans un markdownListItemAtLevel2 qui doit être contenu dans une fourmi markdownListItemAtLevel1 doit avoir au moins 10 espaces de début, ecc. ..

Je sais que quelques années ont passé, mais peut-être que quelqu'un considérerait La réponse est utile car toute syntaxe basée sur l'indentation souffre du même problème

Questions connexes