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

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


Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top