在 Windows 上的 ConEmu 中使用 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 插件没有修复它。
关于如何解决这个恼人的情况,您有什么想法吗?
答案1
所以这个基本概念确实有效:
我也尝试
\S
在正则表达式中用斜体替换,[^*]
但这也不起作用。
只需复制$VIMRUNTIME/syntax/markdown.vim
并~/.vim/syntax/
修改两syn region markdownItalic...
行即可
syn region markdownItalic start="[^* ]\@<=\*\*\@!\|\*\@<!\*[^* ]\@=" end="[^* ]\@<=\*\|\*\@<!\*[^* ]\@=" keepend contains=markdownLineStart
syn region markdownItalic start="[^_ ]\@<=__\@!\|_\@<!_[^_]\@=" end="[^_ ]\@<=_\|_\@<!_[^_]\@=" keepend contains=markdownLineStart
此外,值得注意的是,蒂姆·波普目前vim-markdown没有问题(尽管在撰写本文时,它还有其他与斜体相关的问题;这似乎是用 Vim 语法高亮难以解决的一个问题)。