如何在 vim 语法高亮中禁用语法区域?

How to disable a syntax region in vim syntax highlighting?

我正在使用 Vim 8.0 和它附带的默认 syntax/markdown.vim,即 Tim Pope's vim-markdown 软件包的 2016-08-20 版本。

这个包有一个错误,在某些文件上确实让我很恼火:它认为由四个或更多空格缩进的任何行都是一个代码块,包括列表延续。因此,在下面:

1. Agenda Item 1: Frob the Bazzit
   - The bazzit is something that makes us have
     very _short_ lines indeed.
   - Further frobbing is necessary

very _short_ lines indeed 将突出显示为代码块,单词 short 将不会显示为斜体。

我很高兴完全禁用代码块突出显示,至少在这些情况下是这样,但事后我不知道该怎么做。我一直在测试 ~/.vim/after/syntax/markdown.vim 来调整配置,但我不知道如何,一旦

syn region markdownCodeBlock start="    \|\t" end="$" contained

已在系统中执行 markdown.vim 我可以在我的 after/syntax/markdown.vim 中禁用它。我该怎么做?

(我试过使用 highlight link markdownCodeBlock NONE,它确实禁用了这些行上的代码块颜色,但不幸的是它们仍然被标记为代码块区域并且仍然没有突出显示其中的任何其他标记,例如_italic_`code` 内联标记。)

看起来你想要做的是clear那个特定的语法组:

To clean up specific syntax groups for the current buffer:

:syntax clear {group-name} ..

This removes all patterns and keywords for {group-name}.

但您似乎无法清除组的特定定义。只是整个组:

:syn clear markdownCodeBlock

一个大胆的猜测,与@muru 的回答相结合,但也许你可以创建一个自定义的多行组,例如调用 NoSyntax,这将作为评论(以便在编译 . md 到 pdf 或其他,它被忽略),例如:

[//]: # (IGNORE)
    - The bazzit is something that makes us have
      very _short_ lines indeed.
    - Further frobbing is necessary
[//]: # (ENDIGNORE)

然后在~/.vim/after/markdown.vim中使用:

syntax clear NoSyntax

我现在不在电脑前查看如何创建这样的组,但只要我在电脑前,我就会尝试一下,看看有什么可能(如果可能的话)。

编辑:这是一个将块突出显示为 "Normal" 的解决方案(例如没有斜体,但至少没有代码可以回答 I'm happy with just completely disabling code block highlighting, at least in these circumstances):

在设置你的配色方案之前放置以下代码:

function! MyMarkdownHighlights() abort
    syntax region mdIgnore  start=+^\s*\[//\]: # (IGNORE)$+ end=+^\s*\[//\]: # (ENDIGNORE)$+ keepend excludenl
    highlight def link mdIgnore Normal
endfunction

augroup MyColors
    autocmd!
    autocmd BufEnter *.md call MyMarkdownHighlights()
augroup END

并将其与评论一起使用:

[//]: # (IGNORE)

[//]: # (ENDIGNORE)

这是一个例子(看看我的光标在哪里,以及屏幕底部关联的高亮组):