2010-09-30 31 views
25

Tôi vừa nhận ra rằng VIM 7.3 có hỗ trợ sẵn để đánh dấu các tệp Markdown. Xuất sắc. Tuy nhiên, nó không gấp vào các tiêu đề.Vim Markdown Folding?

Có thể đưa ra đề xuất về cách làm việc này không?


Ngoài ra, tôi đang sử dụng Markdown chỉ như là một cách để có được văn bản có cấu trúc đơn giản. Nếu có định dạng thay thế tốt hơn, vui lòng đề xuất. Nhưng không chắc tôi đào TVO hay VimOutliner.

+2

Vimcast này chỉ phát sóng trong tuần này. http://vimcasts.org/episodes/writing-a-custom-fold-expression/ –

Trả lời

7

Tôi có cùng một câu hỏi, và chơi xung quanh với giải pháp tốt đẹp Jander của. Vấn đề duy nhất là bằng cách xác định cú pháp sử dụng gấp, bạn sẽ mất bất kỳ cú pháp đánh dấu Markdown nào.

Vì bạn có thể quan tâm đến các đánh dấu thay thế, tôi khuyên bạn nên sử dụng reStructuredText và tuyệt vờiVst vim extension. Nó gấp rất độc đáo. Rst mạnh hơn Markdown nhiều.

+0

Tôi đã sử dụng Viki thay vào đó. Nó không phải là Markdown, nhưng nó đã gấp đúng cách. – Muchin

+0

Tôi cho rằng điều tốt đẹp về Rst là nó có thể được sử dụng cho nhiều mục đích khác, chẳng hạn như một wiki Jekyll, HTML, LaTex .. – ematsen

3

Cách duy nhất như thế nào tôi nhận được gấp để làm việc trong markdown, chỉnh chưa rất thanh lịch, :set fdm=marker và sử dụng html comment tag

<!-- My folding {{{1 --> 
hơn

giúp đỡ :help folding

5

Đây là một thử tại một đệ quy tiêu đề gấp quy tắc. Nó không bao gồm phong cách gạch dưới của tiêu đề Markdown, nhưng tôi đoán những người đó sẽ khó xử cho mục đích của bạn.

Đặt đoạn mã sau vào vimrc của bạn:

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

Khi tôi sử dụng markdown tôi chỉ sử dụng các tiêu đề kiểu băm với dấu cách và dấu cách tách. Điều này làm cho công việc gấp đơn giản hơn rất nhiều.

Tôi khá mới đối với Vim, vì vậy hãy tự mình sử dụng những rủi ro sau. Tôi đã thêm đoạn mã sau vào vimrc của mình và nó gấp đầu đề dựa trên số lượng băm, và nó vẫn giữ lại màu cú pháp.

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

Bạn có thể đơn giản hóa chức năng MarkdownLevel thành 'hàm MarkdownLevel() cho h = matchstr (getline (v: lnum), '^ # \ +') nếu trống (h) trả lại "=" khác trả lại ">". len (h) endif endfunction', mà tôi đăng smooshed vào một dòng vì đây là một bình luận. –

+0

Nội dung thú vị và điểm thưởng cho Omar.:-) –

5

Có một plugin đánh dấu vim tại https://github.com/plasticboy/vim-markdown.

Mã liên quan đến gấp từ đó dường như là:

" 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

Tôi tìm thấy những regexps cũng nắm bắt các khối mã thụt lề của tôi bắt đầu bằng # (cho biết một dòng lệnh shell). Đưa ra \ s * ở đầu và cuối để sửa. –

4

một ứng dụng một plugin cho rằng trên GitHub.

vim-markdown-folding

Khi bạn đang chỉnh sửa file Markdown với Vim, có lẽ bạn cũng muốn cài đặt plugin Markdown Tim Pope.

vim-markdown

2

Dựa trên Jeromy & Đề xuất của Omar, tôi đã tìm ra (vimrc của tôi) để tự động và rõ ràng gấp các tệp DokuWiki của tôi (trong đó tiêu đề cấp cao nhất được đánh dấu bằng ====== tại đầu dòng, xuống tiêu đề cấp độ thứ tư đánh dấu bằng ===):

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 

'^ = +' có nghĩa là trận đấu ngay từ đầu của dòng bất kỳ số lượng tiếp giáp '=' s

Sau đó này trong mô hình vim làm cho nó hoạt động độc đáo đối với tệp DokuWiki:

foldmethod=expr foldexpr=DWTitleLevel() foldcolumn=5 

Và đối với Markdown, tôi cần phải viết mã của Omar như thế này:

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

Tôi không biết cú pháp mã hoạt động như thế nào, nhưng bạn có thể sử dụng một cái gì đó như 'return"> ". 7 - j'? –

+1

@Brady Trainor, tôi đã thử một cái gì đó như 'let k = 7 - len (j)', rồi 'return"> ". K', nhưng vì một lý do nào đó tôi không thể làm nó, và bây giờ tôi thực sự thích giải pháp dài hơn vì nó chỉ kích hoạt cho các giá trị 'j' giữa 3 và 6, đó là tất cả những gì tôi muốn. – JosephHarriott

+0

Cảm ơn bạn đã lừa, tôi chỉ sử dụng nó cho một vấn đề tương tự. –

1

VOoM : Vim two-pane outliner là giá trị kiểm tra nó ra.

Không chỉ cung cấp tính năng gập cơ bản mà còn cung cấp điều hướng phác thảo qua ngăn xem phác thảo thứ 2 (tương tự bản đồ tài liệu trong MS Word). Và nó hỗ trợ một số lượng lớn các ngôn ngữ đánh dấu bao gồm những ngôn ngữ khác được đề cập trong các câu trả lời khác - Markdown, viki, reStructuredText, vimwiki, org và nhiều ngôn ngữ khác.

Để biết thêm thông tin, hãy xem screenshotshelp page.

+0

Tôi không thể tự gấp nhãn tệp bằng plugin đó, nhưng đường viền vẫn đẹp mắt :) – luator

1
let g:markdown_folding = 1 

Bạn có thể kích hoạt tính năng gấp markdown bằng cách thêm này trong .vimrc của bạn nếu bạn đang sử dụng phiên bản mới nhất của Vim - không cần phải là mới nhất, nhưng tôi không biết chính xác phiên bản.

Vì lý do nào đó, tài liệu không được ghi trong README nhưng you can find the related code in the repository.

FYI, nếu bạn không muốn các phần đóng khi bạn mở tệp, refer to this SO thread. Tôi nghĩ rằng việc thêm đây sẽ là cách tốt nhất nhưng bạn có thể có một sở thích khác.

set nofoldenable 
0

Kể từ Vim 8, nó được bao gồm theo mặc định (thông qua plugin đánh dấu của Tim Pope). Chỉ cần thêm này để vimrc:

let g:markdown_folding=1 

Để đảm bảo bạn có plugin này nạp bạn có thể chạy

:showscripts 

và tìm kiếm

vim80/syntax/markdown.vim