Vim Markdown折叠?

38

我刚刚意识到 VIM 7.3 内置支持高亮 Markdown 文件。很好。但是,它不会在标题上折叠。

有人可以提供如何使其工作的建议吗?


或者,我仅使用 Markdown 作为获取简单结构化文本的方法。如果有更好的替代格式,请也提出建议。但是我不确定是否喜欢 TVO 或 VimOutliner。


3
这期 Vimcast 是本周刚播出的。http://vimcasts.org/episodes/writing-a-custom-fold-expression/ - Michael Berkowski
1
现在Vim原生支持这个功能:https://dev59.com/VG865IYBdhLWcg3wat2l#45532557 - yukashima huksay
13个回答

37

当我使用Markdown时,我只使用哈希符号和文本之间有空格的标题样式。这使得折叠任务变得更简单。

我对Vim还比较陌生,所以请自行决定是否使用以下代码。我将以下代码添加到我的vimrc文件中,它可以根据哈希符号数量来折叠标题,并保留语法高亮。

function! MarkdownLevel()
    if getline(v:lnum) =~ '^# .*$'
        return ">1"
    endif
    if getline(v:lnum) =~ '^## .*$'
        return ">2"
    endif
    if getline(v:lnum) =~ '^### .*$'
        return ">3"
    endif
    if getline(v:lnum) =~ '^#### .*$'
        return ">4"
    endif
    if getline(v:lnum) =~ '^##### .*$'
        return ">5"
    endif
    if getline(v:lnum) =~ '^###### .*$'
        return ">6"
    endif
    return "=" 
endfunction
au BufEnter *.md setlocal foldexpr=MarkdownLevel()  
au BufEnter *.md setlocal foldmethod=expr     

32
你可以简化MarkdownLevel函数,只需使用以下内容:function MarkdownLevel() let h = matchstr(getline(v:lnum), '^#\+') if empty(h) return "=" else return ">" . len(h) endif endfunction。由于这是一个注释,因此我将它压缩成了一行。 - Omar Antolín-Camarena
op的解决方案对我有效,但评论中更简短的解决方案对我无效。 - yukashima huksay
用什么键或命令执行折叠操作? - theerrormagnet

28
let g:markdown_folding = 1

如果您正在使用最新版本的Vim,您可以通过在.vimrc中添加以下内容来启用Markdown折叠功能 - 无需是最新版本,但我不知道确切的版本。

由于某种原因,在README中没有记录,但您可以在存储库中找到相关代码此处是相关代码

如果您不希望打开文件时关闭部分,请参考此SO线程。我认为添加这个是最好的方法,但您可能有不同的偏好。

set nofoldenable

更新

很不幸地,我停止使用 markdown_folding,因为它会导致程序运行缓慢 (Github issue)。


1
我不确定为什么这个没有更多的赞 - 它对我来说完美地运行。 - jobu1342

7
这是一个尝试使用递归方式折叠标题的规则。它不包括Markdown标题的下划线样式,但我猜这些样式对你的目的来说可能会很麻烦。
将以下代码放入您的.vimrc文件中:
au FileType markdown syn region myMkdHeaderFold
        \ start="\v^\s*\z(\#{1,6})"
        \ skip="\v(\n\s*\z1\#)\@="
        \ end="\v\n(\s*\#)\@="ms=s-1,me=s-1
        \ fold contains=myMkdHeaderFold

au FileType markdown syn sync fromstart
au FileType markdown set foldmethod=syntax

7
我有同样的问题,并尝试使用Jander的好方法。唯一的问题是,通过使用语法定义折叠,您将失去任何Markdown语法高亮显示。
考虑到您可能对备选标记感兴趣,我建议使用reStructuredText和惊人的Vst vim扩展程序。它可以很好地折叠。Rst比Markdown更强大。

我最终使用了Viki。它不是Markdown,但可以正确地折叠。 - Muchin
我认为 Rst 的好处在于它可以用于许多其他用途,比如 Jekyll wiki、HTML、LaTex 等。 - ematsen
不再需要变通方法。请参考Sanghyun在下面提到的内置vimrc标志。 - Lomky

7

https://github.com/plasticboy/vim-markdown上有一个vim-markdown插件。

与此相关的折叠代码似乎是:

" fold region for headings
syn region mkdHeaderFold
    \ start="^\s*\z(#\+\)"
    \ skip="^\s*\z1#\+"
    \ end="^\(\s*#\)\@="
    \ fold contains=TOP

" fold region for lists
syn region mkdListFold
    \ start="^\z(\s*\)\*\z(\s*\)"
    \ skip="^\z1 \z2\s*[^#]"
    \ end="^\(.\)\@="
    \ fold contains=TOP

syn sync fromstart
setlocal foldmethod=syntax

1
我发现这些正则表达式也捕获以#(表示shell命令行)开头的我的缩进代码块。去掉开头和结尾的\s*即可修复。 - Roger Keays

5

在GitHub上有一个插件可以实现这个功能。

vim-markdown-folding

当您使用Vim编辑Markdown文件时,您可能还想安装Tim Pope的Markdown插件。

vim-markdown


4
我在Markdown中实现折叠的唯一方法不太优雅,需要使用:set fdm=marker并使用HTML注释标记。
 <!-- My folding {{{1 -->

more help :help folding


2

根据Jeromy和Omar的建议,我为我的vimrc编写了以下内容,以自动且明确地折叠我的DokuWiki文件(在该文件中,顶级标题以起始行处的“======”标记,下降到由“ ===”标记的第四级标题):

function! DWTitleLevel()
    let j = len(matchstr(getline(v:lnum), '^=\+'))
    if     j =~ 6 | return ">1"
    elseif j =~ 5 | return ">2"
    elseif j =~ 4 | return ">3"
    elseif j =~ 3 | return ">4"
    endif
endfunction

'^=+' 的意思是从行首开始匹配任意数量的连续 '='。

然后在 vim 的模型行中使用这个命令,可以很好地处理 DokuWiki 文件:

foldmethod=expr foldexpr=DWTitleLevel() foldcolumn=5

对于Markdown,我需要像这样编写Omar的代码:

if empty(j) | return "=" | else | return ">".len(j) | endif

我不知道代码语法是如何工作的,但你能否使用类似于 return ">" . 7 - j 的东西? - Brady Trainor
1
@Brady Trainor,我尝试了类似于let k = 7 - len(j),然后return ">".k的方法,但出于某种原因,我无法使其正常工作,现在我实际上更喜欢我的较长解决方案,因为它仅对j值在3到6之间触发,这正是我想要的。 - joharr
谢谢你分享 let 技巧,我刚用它解决了一个类似的问题。 - Brady Trainor

2

1

从Vim 8开始,它已经默认包含(通过Tim Pope的markdown插件)。只需将以下内容添加到.vimrc文件中:

let g:markdown_folding=1

为确保您已加载此插件,您可以运行以下命令:
:showscripts

并查找

vim80/syntax/markdown.vim

5
жҲ‘дёҚзЎ®е®ҡ:showscriptsжҳҜеҗҰйҖӮз”ЁдәҺе…¶д»–дәәпјҢдҪҶжҲ‘еҝ…йЎ»дҪҝз”Ё:scriptnamesжқҘеҲ—еҮәе·ІеҠ иҪҪзҡ„жҸ’件гҖӮ - urban_raccoons

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