如何阻止 Vim markdown 語法突出顯示為用於表示粗體的斜體星號?

如何阻止 Vim markdown 語法突出顯示為用於表示粗體的斜體星號?

在Windows 上的ConEmu 中使用Vim 7.4(儘管我在其他平台/設定上看到過同樣的情況),我注意到語法突出顯示與它們表示的粗體區域內的斜體子區域的開頭和結尾雙星號相匹配。這是一個礙眼的事:

Vim markdown 在粗體區域將星號反白顯示為斜體

經過一番挖掘,我想我已經找到了這個問題的根源(來自$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 語法突出顯示很難解決的問題)。

相關內容