2010-09-30 9 views
25

Ho appena realizzato che VIM 7.3 ha il supporto integrato per evidenziare i file Markdown. Eccellente. Tuttavia, non piega sui titoli.Vim Markdown Folding?

Qualche suggerimento di offerta su come ottenere questo funzionamento?


In alternativa, sto usando Markdown solo come un modo per ottenere semplice testo strutturato. Se esiste un formato alternativo migliore, si prega di suggerire anche. Ma non sono sicuro di scavare TVO o VimOutliner.

+2

Questo Vimcast appena andato in onda questa settimana. http://vimcasts.org/episodes/writing-a-custom-fold-expression/ –

risposta

7

Ho avuto la stessa domanda, e ha giocato in giro con bella soluzione di Jander. L'unico problema è che definendo la piegatura usando la sintassi, si perde qualsiasi evidenziazione della sintassi di Markdown.

Dato che potresti essere interessato a revisioni alternative, ti suggerirei di utilizzare reStructuredText e lo sorprendenteVst vim extension. Si piega molto bene. Rst è molto più potente di Markdown.

+0

Ho finito per usare invece Viki. Non è Markdown, ma si piega correttamente. – Muchin

+0

Suppongo che la cosa bella di Rst sia che può essere usata per molti altri scopi, come un wiki di Jekyll, HTML, LaTex .. – ematsen

3

L'unico modo in cui vengo pieghevole a lavorare in Markdown, era't molto elegante, :set fdm=marker e utilizzare html tag di commento

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

più aiuto :help folding

5

Ecco una prova in un ricorsivo regola di piegamento dell'intestazione. Non include lo stile di sottolineatura dell'intestazione di Markdown, ma suppongo che sarebbero comunque scomodi per i tuoi scopi.

Inserire il seguente codice nella tua 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

Quando utilizzo markdown, utilizzo solo i titoli in stile hash con spazio che separa hash e testo. Questo rende l'operazione di piegatura molto più semplice.

Sono abbastanza nuovo a Vim, quindi utilizzare il seguente a proprio rischio. Ho aggiunto il seguente codice al mio vimrc e esso piega le intestazioni in base al numero di hash e mantiene la colorazione della sintassi.

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

Puoi semplificare la funzione MarkdownLevel semplicemente 'function MarkdownLevel() let h = matchstr (getline (v: lnum), '^ # \ +') se vuoto (h) return "=" else return ">". len (h) endif endfunction', che ho inserito smoosh in una riga perché questo è un commento. –

+0

Bel materiale e punti bonus per Omar.:-) –

5

C'è un plugin vim-mark-down a https://github.com/plasticboy/vim-markdown.

Il codice relativo al pieghevole da sembra che ci sia:

" 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

Ho trovato queste espressioni regolari anche catturare i miei blocchi di codice indentati che iniziano con # (che indica una riga di comando della shell). Estrai \ s * all'inizio e alla fine per risolvere. –

2

sulla base dei suggerimenti di Jeromy & Omar, sono arrivato fino a questo (per il mio vimrc) per piegare automaticamente e senza ambiguità i miei file DokuWiki (in cui colpo di testa di livello superiore è segnata da ====== a inizio della linea, fino al quarto livello di intestazione contrassegnata da ===):

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 

'^ = +' significa partita dall'inizio della linea qualsiasi numero di '=' contigue s

Allora questo in una vim modeline lo fa funzionare bene per un file DokuWiki:

foldmethod=expr foldexpr=DWTitleLevel() foldcolumn=5 

E per Markdown, avevo bisogno di scrivere codice di Omar in questo modo:

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

Non so come funzioni la sintassi del codice, ma puoi usare qualcosa come "return"> ". 7 - j'? –

+1

@Brady Trainor, ho provato qualcosa come 'let k = 7 - len (j)', quindi 'return"> ". K', ma per qualche motivo non ho potuto farlo funzionare, e ora preferisco il mio soluzione più lunga perché si innesca solo per valori di 'j' tra 3 e 6, che è tutto ciò che voglio. – JosephHarriott

+0

Grazie per il trucco "let', l'ho usato solo per un problema simile. –

1

VOoM : Vim two-pane outliner vale la pena estrarlo.

Non solo fornisce il piegamento di base, ma fornisce anche una navigazione di contorno tramite un riquadro di vista di secondo livello (simile alla mappa del documento in MS Word). E supporta un gran numero di linguaggi di markup, inclusi altri citati in altre risposte: Markdown, viki, reStructuredText, vimwiki, org e molti altri.

Per ulteriori informazioni, vedere screenshots e help page.

+0

Non ero in grado di piegare il file markdown stesso con quel plugin, ma la struttura è comunque carina :) – luator

1
let g:markdown_folding = 1 

È possibile attivare la funzione di ripiegamento Markdown aggiungendo questo nella vostra .vimrc se si utilizza l'ultima versione di Vim - non c'è bisogno di essere l'ultimo, ma non so l'esatta versione.

Per qualche motivo non è documentato nel README ma you can find the related code in the repository.

FYI, se non si desidera chiudere le sezioni quando si apre un file, refer to this SO thread. Penso che aggiungere questo sarebbe il modo migliore ma potresti avere una preferenza diversa.

0

A partire da Vim 8 è incluso di default (tramite il plug-in markdown di Tim Pope). Basta aggiungere questo per Vimrc:

let g:markdown_folding=1 

Per essere sicuri di avere questo plugin caricato è possibile eseguire

:showscripts 

e potete trovare

vim80/syntax/markdown.vim