如何在Vim语法高亮中禁用某个语法区域?

3
我正在使用 Vim 8.0 和默认的 syntax/markdown.vim,它是随 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`行内标记。)


我编辑了我的回答,并提供了一个解决方案,可以涵盖“至少在这种情况下,我只想完全禁用代码块高亮显示”。 - padawin
1
我对它进行了更多的尝试,寻找一个比我的答案中不那么突兀的解决方案,并查看了系统的 markdown.vim(来自 tpope)。基于此,创建了以下 PR:https://github.com/tpope/vim-markdown/pull/140。看看它是否会被接受 ¯_(ツ)_/¯ - padawin
@padawin 是的,我前几天也在想,也许它应该在代码块之前检查空行,但是我不知道如何做。我已经在我的~/.vim/after/(None so far.)syntax/markdown.vim中添加了你修改后的版本,在此期间,我会看看是否有任何问题。与此同时,您应该将上面的评论和补丁扩展为新答案。 - cjs
2个回答

5

看起来你想要做的是清除特定的语法分组: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

整个团队都做得很好;它解决了问题,直到我首先修复损坏的突出显示(这似乎需要相当多的工作)。 - cjs
我使用 https://github.com/gabrielelana/vim-markdown,如果我没记错的话,它没有这个问题。 - muru

2
一个猜测,可以结合@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)

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

输入图像描述

最初的回答:这里有一个示例(请注意我的光标所在位置和与屏幕底部相关联的高亮组):

有趣的是,尽管 OP 希望保留列表中的其他高亮显示(“仍然不显示任何其他标记,如 _italic_\code`”内联标记)。 - muru
确实。也许有一种方法可以强制将块内部视为“group1”而不是“group2” - 在这种情况下,将very _short_ lines indeed用类似的注释包装起来,标记为“Normal”而不是“Code”(组名可能不是那样,但这是要点)? - padawin
我不想在我的文件中添加特殊内容来改变高亮显示;我只是希望现有的文件不会因为二级列表项中的连续行而破坏,即使它会破坏代码块的高亮显示。(这个问题主要出现在很少使用代码块的主文件中。)但这确实是一种有趣的技巧! - cjs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接