Vim Markdown destacando (os itens da lista e conflitos bloco de código)
Pergunta
Eu decido para saber mais sobre o vim e seu destaque de sintaxe. Usando exemplos para os outros, eu estou criando meu próprio arquivo de sintaxe para Markdown. Eu vi mkd.vim e tem esse problema também. Meu problema é entre os itens da lista e destaque bloco de código.
Bloco de código definição :
- primeira linha está em branco
- segunda linha começa com, pelo menos, 4 espaços ou um guia
- bloco é terminado com uma linha em branco
Exemplo:
Regular text
this is code, monospaced and left untouched by markdown
another line of code
Regular Text
sintaxe Meu Vim para bloco de código:
syn match mkdCodeBlock /\(\s\{4,}\|\t\{1,}\).*\n/ contained nextgroup=mkdCodeBlock
hi link mkdCodeBlock comment
Listar item unorder definição :
- primeira linha está em branco
- segunda linha inicia-se com um [- * +] seguido por um espaço
- a lista é terminado com uma linha em branco, em seguida, uma (não-lista) de linha normal
- de entre os itens de linha pode ser adicionado qualquer número de linhas em branco
- um sub lista está especificada pelo recuo (4 espaço ou um separador)
- uma linha de texto normal após um item da lista é incluir como uma continuação desse item da lista ??li>
Exemplo:
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
sintaxe Meu Vim para definição item da lista unorder (eu só destacar [-+*]
):
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
Eu não posso começar o realce para o trabalho com os dois últimos regra para lista e com um bloco de código.
Este é um exemplo que quebra o meu destaque de sintaxe:
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
Actualmente, eu não posso descobrir como obter o realce para trabalhar da maneira que eu quero isso também
Esqueceu-se de adicionar uma regra de sintaxe "global" usado em ambas as regras listadas abaixo. É para garantir a que eles começam com uma linha em branco.
syn match mkdBlankLine /^\s*\n/ nextgroup=mkdCodeBlock,mkdListItem transparent
Outra Nota: Eu deveria ter sido mais claro. No meu arquivo de sintaxe, as regras da lista de comparecer perante as Regras Blockquote
Solução
Apenas certifique-se que a definição de mkdListItem é após a definição de mkdCodeBlock, como este:
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
documentação Vim diz em :help :syn-define
:
"No caso de mais de um partidas de itens na mesma posição, o que era vitórias ÚLTIMOS definidos. itens de sintaxe, assim, você pode substituir previamente definidos por usando um item que corresponde o mesmo texto. Mas uma palavra-chave sempre vem antes da igualar ou região. E uma palavra-chave com a caixa de correspondência sempre vem antes da palavra-chave com ignorando a caixa ".
Outras dicas
hcs42 estava correta. Eu lembro de ter lido que a seção agora, mas eu esqueci sobre ele até hcs24 lembrou-me sobre isso.
Aqui está a minha sintaxe atualizado (alguns outros ajustes) que as obras:
""""""""""""""""""""""""""""""""""""""" " 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, que talvez cobre seus casos de uso, mas não cobrir a sintaxe Markdown. Em Markdown um item da lista pode contém um bloco de código. Você poderia dar uma olhada na minha solução href="https://github.com/gabrielelana/vim-markdown" aqui
TL; DR; o problema é que vim não deixa você dizer algo como: um bloco que tem o mesmo recuo como seu contêiner + 4 espaços . A única solução que eu encontrei é gerar regras para cada tipo de blocos que podem estar contidos em uma lista de itens para cada nível de recuo (na verdade eu apoiar 42 nível de recuo, mas é um número arbitrário)
Então, eu tenho markdownCodeBlockInListItemAtLevel1 que deve ser contido em um markdownListItemAtLevel1 e ele precisa ter pelo menos 8 espaços à esquerda, um, em seguida, markdownCodeBlockInListItemAtLevel2 que deve ser contidos em um markdownListItemAtLevel2 que deve estar contido em um markdownListItemAtLevel1 necessidades de formigas para ter pelo menos 10 espaços à esquerda, ecc ...
Eu sei que há alguns anos se passaram, mas talvez alguém iria considerar esta resposta útil uma vez que todos sintaxe baseado em sofre recuo do mesmo problema