Vim foldexpr 匹配 pattern1 或 pattern2?

Vim foldexpr matching pattern1 OR pattern2?

我希望 vim 根据 header 行为我的降价文件创建折叠 对于低于特定 header 的所有行将被折叠。例如:

# Header
some lines of
text here

## Sub-header
some more lines of
text here # and a comment for some reason
    # and an indented comment for good measure

# Another header
A new set of lines with a blank line(!)

for this header

## Another sub-header
yet more text

应该这样折叠:

# Header
+-- 2 lines: - some lines of -------------------

## Sub-header
+-- 3 lines: - some more lines of --------------

# Another header
+-- 3 lines: - A new set of lines --------------

## Another sub-header
yet more text

(我不知道单行折叠会发生什么,所以我很满意 无论 vim 的默认值是什么——即如果 vim 不对单行进行折叠, 我没问题)

我试过为此想出不同的正则表达式...我可以匹配 所有 non-header 行 除了 空行:

autocmd FileType markdown setlocal foldexpr=getline(v:lnum)=~'^[^#]'

所以我尝试添加第二个模式来捕获 ^[^#]\|^\s*$ 变体的空行(确实匹配所有内容,但 non-header 行,当我在 /) 的简单搜索中使用它时,但没有折叠 产生了,我不知道为什么(我尝试了不同数量的转义斜杠 但无济于事):

" none of these work
autocmd FileType markdown setlocal foldexpr=getline(v:lnum)=~'^[^#]\|^\s*$'
autocmd FileType markdown setlocal foldexpr=getline(v:lnum)=~'^[^#]\|^\s*$'

你快到了...你需要 3 个反斜杠:

foldexpr=getline(v:lnum)=~'^[^#]\\|^\s*$'

您的正则表达式字符串最后需要同时包含反斜杠和竖线。这两个字符都需要在表达式中转义。所以你最终得到 \\|...或总共 3 个反斜杠。

source / additional reading

(旁注:您还可以使用 \v 切换到“非常神奇”模式,这将导致 '\v^[^#]\|^\s*$'。如果您有多个“非常神奇”的角色(例如 |(){}+) 这将非常有帮助...但是对于单个竖线,它唯一可能做的就是帮助提高可读性。)