Vim Markdown折叠?

问题描述 投票:27回答:11

我刚刚意识到VIM 7.3内置支持突出显示Markdown文件。优秀。但是,它不会在标题上折叠。

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

或者,我只使用Markdown作为获取简单结构化文本的方法。如果有更好的替代格式,请同时建议。但不确定我是否会挖掘TVO或VimOutliner。

vim markdown
11个回答
7
投票

我有同样的问题,并使用Jander的好解决方案。唯一的问题是,通过使用语法定义折叠,您将丢失任何Markdown语法突出显示。

鉴于您可能对备用标记感兴趣,我建议使用reStructuredText和令人惊奇的Vst vim extension。它折叠得非常好。 Rst比Markdown强大得多。


1
投票

VOoM : Vim two-pane outliner 值得一试。

它不仅提供基本折叠,还通过第二个大纲视图窗格提供轮廓导航(类似于MS Word中的文档地图)。它支持大量标记语言,包括其他答案中提到的其他语言--Markdown,viki,reStructuredText,vimwiki,org等等。

有关更多信息,请参阅screenshotshelp page


1
投票

从Vim 8开始,它默认包含在内(通过Tim Pope的降价插件)。只需将其添加到.vimrc:

let g:markdown_folding=1

要确保加载此插件,您可以运行

:showscripts

并寻找

vim80/syntax/markdown.vim

28
投票

当我使用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     

6
投票

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

5
投票

这是一个递归标题折叠规则的尝试。它不包括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

4
投票

有 一个应用程序 GitHub上的插件。

vim-markdown-folding

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

vim-markdown


3
投票

我折叠在markdown工作的唯一方法是,非常优雅,:set fdm=marker并使用html评论标签

 <!-- My folding {{{1 -->

更多帮助:help folding


3
投票
let g:markdown_folding = 1

如果您使用的是最新版本的Vim,可以在.vimrc中添加此功能来启用降价折叠功能 - 不需要是最新版本,但我不知道具体版本。

由于某种原因,它没有在自述文件中记录,但you can find the related code in the repository

仅供参考,如果您不想在打开文件时关闭这些部分,refer to this SO thread。我认为添加这将是最好的方式,但你可能有不同的偏好。

set nofoldenable

2
投票

我猜你不看VimCasts。制造这个的人只是为此做了一个pugin。这是:https://github.com/nelstrom/vim-markdown-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
© www.soinside.com 2019 - 2024. All rights reserved.