regex - flavored - readme list
Vim Markdown highlighting(elementos de la lista y conflictos de bloque de código) (3)
Decido aprender más sobre vim y su resaltado de sintaxis. Usando ejemplos para otros, estoy creando mi propio archivo de sintaxis para Markdown. He visto mkd.vim y también tiene este problema. Mi problema es entre los elementos de la lista y el resaltado del bloque de código.
Definición de bloque de código:
- la primera línea está en blanco
- La segunda línea comienza con al menos 4 espacios o 1 pestaña
- el bloque se termina con una línea en blanco
Ejemplo:
Regular text
this is code, monospaced and left untouched by markdown
another line of code
Regular Text
Mi sintaxis de Vim para bloque de código:
syn match mkdCodeBlock //(/s/{4,}/|/t/{1,}/).*/n/ contained nextgroup=mkdCodeBlock
hi link mkdCodeBlock comment
Desordenar la definición del elemento de la lista:
- la primera línea está en blanco
- La segunda línea comienza con un [- + *] seguido de un espacio
- la lista se completa con una línea en blanco y luego una línea normal (sin lista)
- entre líneas de pedido se puede agregar cualquier cantidad de líneas en blanco
- una sublista se especifica mediante sangrado (4 espacios o 1 pestaña)
- una línea de texto normal después de un elemento de la lista se incluye como una continuación de ese elemento de la lista
Ejemplo:
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
La sintaxis de My Vim para la definición del elemento de la lista de pedidos pendientes (solo resalto [-+*]
):
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
No puedo obtener el resaltado para trabajar con las dos últimas reglas para la lista y con un bloque de código.
Este es un ejemplo que rompe mi resaltado de sintaxis:
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 no puedo entender cómo hacer que el resaltado funcione de la manera que lo quiero también
Se olvidó de agregar una regla de sintaxis "global" utilizada en ambas reglas enumeradas a continuación. Es para garantizar que comiencen con una línea en blanco.
syn match mkdBlankLine /^/s*/n/ nextgroup=mkdCodeBlock,mkdListItem transparent
Otra nota: debería haber sido más claro. En mi archivo de sintaxis, las reglas de la Lista aparecen antes de las Reglas de Blockquote
hcs42 era correcto. Recuerdo haber leído esa sección ahora, pero me olvidé de ella hasta que hcs24 me lo recordó.
Aquí está mi sintaxis actualizada (algunos otros ajustes) que funciona:
""""""""""""""""""""""""""""""""""""""" " 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
Solo asegúrese de que la definición de mkdListItem esté después de la definición de mkdCodeBlock, así:
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
La documentación de Vim dice en :help :syn-define
:
"En caso de que coincidan más de un elemento en la misma posición, se gana el ÚLTIMO LAST. De este modo, puede anular los elementos de sintaxis definidos previamente utilizando un elemento que coincida con el mismo texto. Pero una palabra clave siempre va antes de una coincidencia o región. Y una palabra clave con mayúsculas y minúsculas siempre va antes que una palabra clave sin tener en cuenta el caso ".
Tao Zhyn, que tal vez cubra tus casos de uso, pero no cubre la sintaxis de Markdown. En Markdown, un elemento de la lista podría contener un bloque de código. Podrías echar un vistazo a mi solución aquí
TL; DR; el problema es que vim no te permite decir algo como: un bloque que tiene la misma sangría que su contenedor + 4 espacios . La única solución que encontré es generar reglas para cada tipo de bloques que podrían estar contenidos en una lista de elementos para cada nivel de sangría (de hecho, apoyo 42 niveles de sangría pero es un número arbitrario)
Así que tengo markdownCodeBlockInListItemAtLevel1 que debe contenerse en un markdownListItemAtLevel1 y debe tener al menos 8 espacios iniciales, y luego markdownCodeBlockInListItemAtLevel2 que debe estar incluido en un markdownListItemAtLevel2 que debe estar incluido en un markdownListItemAtLevel1 y que debe tener al menos 10 espacios principales, ecc ...
Sé que han pasado unos años, pero tal vez alguien considere útil esta respuesta ya que toda la sintaxis basada en la sangría sufre del mismo problema