2008-09-26 11 views
10

Postanawiam dowiedzieć się więcej o vimie i jego podświetlaniu składni. Korzystając z przykładów dla innych, tworzę własny plik składni dla Markdown. Widziałem mkd.vim i ma również ten problem. Mój problem dotyczy między elementami list a podświetlaniem bloku kodu.Podświetlanie znacznika Vim (elementy listy i konflikty bloku kodu)

kod blokowy definition:

  • pierwsza linia jest puste
  • druga linia zaczyna się co najmniej 4 przestrzenie lub 1 zaciskiem
  • bloku wykończony pusty linii

Przykład:

Regular text 

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

Regular Text 

moją składnię Vima dla bloku kodu:

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

hi link mkdCodeBlock comment 

Unorder przedmiot definition:

  • pierwsza linia jest puste
  • druga linia zaczyna się od [- + *] a następnie po spacji
  • lista kończy się pustą linią, a następnie normalną (nie-listową) linią między wierszami można dodać dowolną liczbę pustych wierszy.
  • lista sub określa wcięć (4 przestrzeń lub kartę 1)
  • linia zwykłego tekstu po element listy jest to jako przedłużenie tego elementu listy

przykład:

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 

My Vim składnia definicji elementu listy unorder (I tylko podkreślić [-+*]):

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 

nie mogę uzyskać doda ghting do pracy z dwiema ostatnimi regułami dla listy i blokiem kodu.

To jest przykład, że łamie mi podświetlanie składni:

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 

ja w tej chwili nie może dowiedzieć się, jak dostać się podświetlenie pracować tak, jak ma to zbyt


Zapomniałem dodać "globalna" reguła składni używana w obu regułach wymienionych poniżej. Ma to zapewnić, że zaczynają się od pustej linii.

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

Inna uwaga: Powinienem być bardziej jasne.W moim pliku składni, zasady Lista stawienia się przed Reguły blockquote


+0

Cool. Sprawia, że ​​w końcu chcę się nauczyć skryptów vim. :) – jop

Odpowiedz

6

Wystarczy upewnić się, że definicja mkdListItem jest po definicji mkdCodeBlock, tak:

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 

dokumentacja Vim mówi w :help :syn-define :

"W przypadku, gdy więcej niż jeden przedmiot pasuje do tej samej pozycji, to ten, który był zdefiniował OSTATNIE wygrane, dzięki czemu można zastąpić wcześniej zdefiniowane elementy składni przez używając i tem, który pasuje do tego samego tekstu. Ale słowo kluczowe zawsze występuje przed dopasowaniem lub regionem . I kluczowe z pasującymi przypadku zawsze idzie przed hasła z ignorując sprawę.”

+0

Masz rację. Mam zaktualizowane moje pytanie (na dole), moje reguły list są przed regułą mojego cytowania. Czy możesz odwrócić swój przykład, więc blockquote jest przed listą. Wtedy mogę zaakceptować twoją odpowiedź. –

+0

Masz rację, początkowo rozwiązałem "odwrotny problem" :) – hcs42

1

hcs42 była prawidłowa. Pamiętam przeczytaniu tej sekcji teraz, ale zapomniałem o tym aż hcs24 przypomniał mi o tym.

Tutaj jest mój zaktualizowany składnia (kilka innych usprawnień), który działa:

 
""""""""""""""""""""""""""""""""""""""" 
" 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, że może pokrywa swoje przypadków użycia, ale nie obejmuje składni Markdown W Markdown element listy mógłby zawierać blok kodu. Możesz rzucić okiem na moje rozwiązanie here

TL; DR; Problem polega na tym, że vim nie pozwala ci powiedzieć coś takiego: blok, który ma takie samo wcięcie jak jego kontener + 4 spacje. Jedyne rozwiązanie, które znalazłem, to generowanie reguł dla każdego rodzaju bloków, które mogą być zawarte w elementach listy dla każdego poziomu wcięcia (faktycznie wspieram 42 poziom wcięcia, ale jest to arbitralny numer)

Mam więc markdownCodeBlockInListItemAtLevel1, że musi być zawarte w markdownListItemAtLevel1 i musi mieć co najmniej 8 spacje, to wówczas markdownCodeBlockInListItemAtLevel2 że musi być zawarte w markdownListItemAtLevel2, które mogą być zawarte w ant markdownListItemAtLevel1 musi mieć co najmniej 10 spacje ECC. ..

Wiem, że minęło kilka lat, ale może ktoś rozważyłby Odpowiedź jest pomocna, ponieważ cała składnia oparta na wcięciu cierpi na ten sam problem.

Powiązane problemy