문제

VIM과 구문 강조점에 대해 더 많이 배우기로 결정했습니다. 다른 사람을위한 예제를 사용하여 Markdown 용 구문 파일을 만들고 있습니다. 나는 본다 mkd.vim 그리고이 문제도 있습니다. 내 문제는 목록 항목과 코드 블록 하이라이트 사이에 있습니다.

코드 블록 정의:

  • 첫 번째 줄은 비어 있습니다
  • 두 번째 줄은 최소 4 개의 공간 또는 1 개의 탭으로 시작합니다.
  • 블록은 빈 줄로 마감됩니다

예시:

Regular text

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

Regular Text

코드 블록에 대한 VIM 구문 :

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

hi link mkdCodeBlock  comment

분리 된 목록 항목 정의:

  • 첫 번째 줄은 비어 있습니다
  • 두 번째 줄은 [-+*]와 공간으로 시작합니다.
  • 목록은 빈 줄로 완료된 다음 일반 (비 목록) 라인으로 완성됩니다.
  • 라인 간 항목에서 빈 줄을 추가 할 수 있습니다.
  • 하위 목록은 들여 쓰기 (4 공간 또는 1 탭)에 의해 지정됩니다.
  • 목록 항목의 일반 텍스트 라인은 해당 목록 항목의 연속으로 포함됩니다.

예시:

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

Unorder List 항목 정의에 대한 VIM 구문 (하이라이트 만 강조 표시 [-+*]):

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

목록과 코드 블록에 대한 마지막 두 규칙에서 강조 표시를 할 수 없습니다.

이것은 내 구문을 깨뜨리는 예입니다.

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

나는 현재 나도 원하는 방식으로 강조 표시를하는 방법을 알 수 없습니다.


아래에 나열된 두 규칙에 사용 된 "글로벌"구문 규칙을 추가하는 것을 잊었습니다. 빈 줄로 시작하도록하는 것입니다.

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

또 다른 참고 사항 : 더 분명했을 것입니다. 내 구문 파일에서 목록 규칙은 블록 쿼트 규칙에 나타납니다.


도움이 되었습니까?

해결책

mkdlistime의 정의가 다음과 같이 mkdcodeblock의 정의 후에 있는지 확인하십시오.

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

VIM 문서가 말합니다 :help :syn-define:

"두 개 이상의 항목이 같은 위치에서 일치하는 경우, 마지막으로 정의 된 항목이 마지막 승리를 거두었습니다. 따라서 동일한 텍스트와 일치하는 항목을 사용하여 이전에 정의 된 구문 항목을 재정의 할 수 있지만 키워드는 항상 일치 또는 영역 전에 이동합니다. 사례가 일치하는 키워드는 항상 케이스를 무시한 키워드보다 먼저 진행됩니다. "

다른 팁

HCS42가 정확했습니다. 나는 지금 그 섹션을 읽은 것을 기억하지만, HCS24가 그것에 대해 상기시킬 때까지 나는 그것에 대해 잊었다.

다음은 작동하는 업데이트 된 구문 (기타 몇 가지 조정)입니다.

"""""""""""""""""""""""""""""""""""""""
" 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은 유용 사례를 다루지 만 Markdown 구문을 다루지는 않습니다. Markdown에서 목록 항목 ~할 수 있었다 코드 블록을 포함합니다. 내 솔루션을 볼 수 있습니다 여기

tl; dr; 문제는 VIM이 다음과 같은 말을하지 않는다는 것입니다. 컨테이너 + 4 공간과 동일한 압입을 갖는 블록. 내가 찾은 유일한 솔루션은 각 계약 수준에 대한 목록 항목에 포함될 수있는 각 종류의 블록에 대한 규칙을 생성하는 것입니다 (실제로는 42 레벨의 압입을 지원하지만 임의의 수입니다).

그래서 나는 markdowncodeblockinlistitematlevel1을 가지고 있습니다 ~ 해야 하다 MarkdownListitematlevel1에 포함되어 있으며 최소 8 개의 주요 공간이 있어야하며, 그 다음 MarkdownCodeBlockinListematlevel2 ~ 해야 하다 MarkdownListItematleVel2에 포함되어야하며, MarkDownListItemAtlevel1 ANT에 10 개 이상의 주요 공간 인 ECC가 필요합니다.

나는 몇 년이 지났다는 것을 알고 있지만,이 답변을 기반으로 한 모든 구문이 같은 문제를 겪고 있기 때문에 누군가 가이 대답이 도움이 될 것이라고 생각할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top