我刚刚意识到 VIM 7.3 内置支持高亮 Markdown 文件。很好。但是,它不会在标题上折叠。
有人可以提供如何使其工作的建议吗?
或者,我仅使用 Markdown 作为获取简单结构化文本的方法。如果有更好的替代格式,请也提出建议。但是我不确定是否喜欢 TVO 或 VimOutliner。
我刚刚意识到 VIM 7.3 内置支持高亮 Markdown 文件。很好。但是,它不会在标题上折叠。
有人可以提供如何使其工作的建议吗?
或者,我仅使用 Markdown 作为获取简单结构化文本的方法。如果有更好的替代格式,请也提出建议。但是我不确定是否喜欢 TVO 或 VimOutliner。
当我使用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
function MarkdownLevel() let h = matchstr(getline(v:lnum), '^#\+') if empty(h) return "=" else return ">" . len(h) endif endfunction
。由于这是一个注释,因此我将它压缩成了一行。 - Omar Antolín-Camarenalet g:markdown_folding = 1
如果您正在使用最新版本的Vim,您可以通过在.vimrc
中添加以下内容来启用Markdown折叠功能 - 无需是最新版本,但我不知道确切的版本。
由于某种原因,在README中没有记录,但您可以在存储库中找到相关代码此处是相关代码。
如果您不希望打开文件时关闭部分,请参考此SO线程。我认为添加这个是最好的方法,但您可能有不同的偏好。
set nofoldenable
更新
很不幸地,我停止使用 markdown_folding
,因为它会导致程序运行缓慢 (Github issue)。
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
在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
在GitHub上有一个插件可以实现这个功能。
当您使用Vim编辑Markdown文件时,您可能还想安装Tim Pope的Markdown插件。
:set fdm=marker
并使用HTML注释标记。 <!-- My folding {{{1 -->
more help :help folding
根据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 Trainorlet k = 7 - len(j)
,然后return ">".k
的方法,但出于某种原因,我无法使其正常工作,现在我实际上更喜欢我的较长解决方案,因为它仅对j
值在3到6之间触发,这正是我想要的。 - joharrlet
技巧,我刚用它解决了一个类似的问题。 - Brady Trainor从Vim 8开始,它已经默认包含(通过Tim Pope的markdown插件)。只需将以下内容添加到.vimrc文件中:
let g:markdown_folding=1
:showscripts
并查找
vim80/syntax/markdown.vim
:showscripts
жҳҜеҗҰйҖӮз”ЁдәҺе…¶д»–дәәпјҢдҪҶжҲ‘еҝ…йЎ»дҪҝз”Ё:scriptnames
жқҘеҲ—еҮәе·ІеҠ иҪҪзҡ„жҸ’件гҖӮ - urban_raccoons