2010-09-30 140 views
25

我剛剛意識到VIM 7.3內置了對突出顯示Markdown文件的支持。優秀。但是,它不會在標題上摺疊。Vim Markdown摺疊?

任何可以提供有關如何使這項工作的建議嗎?


另外,我使用的是降價只是作爲一種方式來獲得簡單的結構化文本。如果有更好的替代格式,請提出建議。但不知道我挖掘TVO或VimOutliner。

+2

這Vimcast剛剛播出這個星期。 http://vimcasts.org/episodes/writing-a-custom-fold-expression/ – 2012-11-27 15:18:03

回答

7

我有同樣的問題,並與JANDER的很好的解決方案發揮各地。唯一的問題是,通過使用語法定義摺疊,您將失去任何Markdown語法突出顯示。

鑑於您可能會對備用加價感興趣,我建議您使用reStructuredText,並且令人驚歎的Vst vim extension。它的摺疊非常好。 Rst比Markdown更強大。

+0

我最終使用了Viki。這不是Markdown,但它可以正確摺疊。 – Muchin 2010-10-08 04:59:34

+0

我想關於Rst的好處是,它可以用於許多其他用途,例如Jekyll wiki,HTML,LaTex .. – ematsen 2010-10-08 14:27:45

3

我怎麼弄折在降價工作的唯一辦法,was't非常優雅,:set fdm=marker和使用HTML註釋標記

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

更多的幫助:help folding

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 
23

當我使用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  
+19

您可以簡化MarkdownLevel函數以僅使用'function MarkdownLevel() let h = matchstr (getline(v:lnum),'^#')+ if len(h) endif endfunction',我發佈smooshed到一行,因爲這是一條評論。 – 2012-08-29 16:06:46

+0

不錯的東西,以及奧馬爾的積分。:-) – 2012-09-14 15:33:52

5

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 
+0

我發現這些正則表達式還捕獲以#開頭的縮進代碼塊(它表示一個shell命令行)。取出\ s *開始和結束脩復。 – 2012-09-21 18:01:28

2

基於傑羅米&奧馬爾的建議,我想出了這個(我的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 

而對於降價,我需要寫奧馬爾的代碼是這樣的:

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

我不知道代碼語法是如何工作的,但是你可以使用類似'return「>」的東西。 7 - j'? – 2014-07-19 06:20:52

+1

@Brady Trainor,我試過類似'let k = 7-len(j)',然後'return「>」。k',但由於某種原因,我無法讓它工作,現在我更喜歡我的更長的解決方案,因爲它只觸發3和6之間的'j'值,這就是我想要的。 – JosephHarriott 2014-07-19 07:41:44

+0

感謝'let'技巧,我只是用它來解決類似的問題。 – 2014-07-19 08:31:18

1

VOoM : Vim two-pane outliner值得一檢查出來。

它不僅提供了基本摺疊功能,還提供了通過第二大綱視圖窗格(類似於MS Word中的文檔圖)的輪廓導航。它支持大量的標記語言,包括其他答案中提到的其他標記語言--Markdown,viki,reStructuredText,vimwiki,org等等。

欲瞭解更多信息,請參閱screenshotshelp page

+0

我無法使用該插件摺疊降價文件本身,但輪廓很好:) – luator 2017-06-30 10:55:31

1
let g:markdown_folding = 1 

您可以通過在你的.vimrc添加該啓用降價摺疊功能,如果你正在使用的Vim的最新版本 - 不需要是最新的,但我不知道確切的版本。

由於某些原因,它沒有記錄在自述文件中,但是you can find the related code in the repository

僅供參考,如果您不希望在打開文件時關閉該部分,請參閱refer to this SO thread。我認爲增加這將是最好的方式,但你可能有不同的偏好。

set nofoldenable 
0

從Vim 8開始,它默認包含在內(通過Tim Pope的markdown插件)。只需添加這的.vimrc:

let g:markdown_folding=1 

要確保你有這個插件加載就可以運行

:showscripts 

,尋找

vim80/syntax/markdown.vim