Vim FoldExpr 匹配模式 1 还是模式 2?

标签 vim

我希望 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 个反斜杠。

source / additional reading

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

关于Vim FoldExpr 匹配模式 1 还是模式 2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67859209/

相关文章:

macos - 在使用 Solarized 的 iTerm2 中,vim 的颜色不正确

linux - 是否有任何应用程序/编辑器可以跟踪文件中发生的更改并显示它们?

c++ - 如何在 Windows 上使用 Vim 中的开发者命令提示符命令行?

vim - 像逐行输入解释器一样运行 J 脚本

vim - 为什么写入文件会更改内容(哈希)?

vim - 尝试安装安装了 vimballPlugin 的 vimball

linux - 如果工作缓冲区中没有任何内容,如何更新工作缓冲区

vim - 使用 = 时如何将光标保留在 'equalprg' 输出的*末尾*?

linux - 如何从VI中的不同单词中删除特定字母

c - Vim - 显示数据类型