我希望 vim 根据标题行为我的 markdown 文件创建折叠,例如 对于特定标题下面的所有行都将被折叠。例如:
# 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 不对单行进行折叠, 我觉得没问题)
我尝试为此想出不同的正则表达式...我可以匹配 所有非标题行除了空行:
autocmd FileType markdown setlocal foldexpr=getline(v:lnum)=~'^[^#]'
所以我尝试添加第二个模式来捕获
带有 ^[^#]\|^\s*$
变体的空白行(它确实匹配除
当我在使用 /
的简单搜索中使用它时,出现非标题行),但没有折叠
产生了,我不知道为什么(我尝试了不同数量的转义斜杠
但无济于事):
" 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 个反斜杠。
(旁注:您还可以使用 \\v
切换到“very magic”模式,这将导致 '\\v^[^#]\|^\\s*$'
。如果您有多个“非常神奇”的字符(例如 |(){}+
),这将非常有帮助......但只有一个竖线是唯一的它可能做的就是提高可读性。)
关于Vim FoldExpr 匹配模式 1 还是模式 2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67859209/