在ConEmu的Windows上使用Vim 7.4(虽然我在其他平台/设置上看到过相同的东西),我注意到语法高亮显示将开头和结尾双星号作为它们表示的粗体区域内的斜体子区域进行匹配。这是一个眼睛:
在挖掘之后,我想我已经找到了这个问题的根源(来自 $VIMRUNTIME/syntax/markdown.vim
):
syn region markdownItalic start="\S\@<=\*\|\*\S\@=" end="\S\@<=\*\|\*\S\@=" keepend contains=markdownLineStart
syn region markdownItalic start="\S\@<=_\|_\S\@=" end="\S\@<=_\|_\S\@=" keepend contains=markdownLineStart
syn region markdownBold start="\S\@<=\*\*\|\*\*\S\@=" end="\S\@<=\*\*\|\*\*\S\@=" keepend contains=markdownLineStart,markdownItalic
syn region markdownBold start="\S\@<=__\|__\S\@=" end="\S\@<=__\|__\S\@=" keepend contains=markdownLineStart,markdownItalic
syn region markdownBoldItalic start="\S\@<=\*\*\*\|\*\*\*\S\@=" end="\S\@<=\*\*\*\|\*\*\*\S\@=" keepend contains=markdownLineStart
syn region markdownBoldItalic start="\S\@<=___\|___\S\@=" end="\S\@<=___\|___\S\@=" keepend contains=markdownLineStart
更进一步:
hi def link markdownItalic htmlItalic
hi def link markdownBold htmlBold
hi def link markdownBoldItalic htmlBoldItalic
如您所见,粗体接受斜体作为子区域。问题是如果我删除 markdownItalic
来自 contains=
, 这个:
不再适用:
即使它解决了另一个问题。我也试着替代 \S
在斜体中用于斜体 [^*]
但那也不起作用。另外,安装 Plastic Boy的Markdown插件 没有解决它。
关于如何解决这个恼人案例的任何想法?
我不明白的另一件事是为什么开始和结束与中间或中间相同。在我看来,一个人或者应该是开始的,一半是结束的。但话说回来,当你得到复杂的正则表达式时,很难知道一切都在发生,为什么......
—
Kazark
找出任何解决方案?
—
George Mauer