vim とその構文強調表示についてもっと学ぶことにしました。他の例を使用して、Markdown 用の独自の構文ファイルを作成しています。mkd.vimを見たことがありますが、この問題もあります。私の問題は、リスト項目とコード ブロックの強調表示の間にあります。
コード ブロックの定義:
- 最初の行は空白です
- 2 行目は少なくとも 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
順不同リスト項目の定義:
- 最初の行は空白です
- 2 行目は [-+*] で始まり、その後にスペースが続きます
- リストは空白行で終了し、次に通常の (リストではない) 行で終了します
- 行項目の間に任意の数の空白行を追加できます
- サブリストはインデント (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
順不同リスト項目定義の私の 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
リストの最後の 2 つのルールとコード ブロックで強調表示が機能しません。
これは、構文の強調表示を壊す例です。
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
別の注記: もっと明確にすべきでした。私の構文ファイルでは、List 規則が Blockquote 規則の前に表示されます。