2010-09-30 12 views
25

Me acabo de dar cuenta de que VIM 7.3 tiene soporte integrado para resaltar los archivos de marcado. Excelente. Sin embargo, no se pliega en los títulos.Vim Markdown ¿Plegable?

¿Alguna oferta de sugerencias sobre cómo hacer que esto funcione?


Alternativamente, estoy usando Markdown sólo como una manera de conseguir textos sencillos y bien estructurado. Si hay un mejor formato alternativo, sugiéralo también. Pero no estoy seguro de cavar TVO o VimOutliner.

+2

Este Vimcast solo se emitió esta semana. http://vimcasts.org/episodes/writing-a-custom-fold-expression/ –

Respuesta

7

que tenían la misma pregunta, y jugó un poco con buena solución de Jander. El único problema es que al definir plegado usando sintaxis, pierde cualquier resaltado de sintaxis de reducción.

Dado que puede que le interesen las marcas alternativas, le sugiero que use reStructuredText y Vst vim extension. Dobla muy bien. Rst es mucho más poderoso que Markdown.

+0

Terminé usando Viki en su lugar. No es Markdown, pero se dobla correctamente. – Muchin

+0

Supongo que lo bueno de Rst es que puede usarse para muchos otros fines, como un wiki de Jekyll, HTML, LaTex ... – ematsen

3

La única manera cómo consigo plegable para trabajar en rebajas, era't muy elegante, :set fdm=marker y usar HTML etiqueta de comentario

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

más ayuda :help folding

5

Aquí es un intento en un recursivo regla plegable del encabezado. No incluye el estilo de subrayado del encabezado Markdown, pero supongo que esos serían incómodos para tus propósitos de todos modos.

Coloque el siguiente código en su .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

Cuando uso markdown solo uso los encabezados hash-style con separadores de espacio y texto. Esto hace que la tarea de plegado sea mucho más simple.

Soy bastante nuevo en Vim, así que utilice los siguientes bajo su propia responsabilidad. Agregué el siguiente código a mi vimrc y dobla los encabezados en función del número de hash, y conserva el color de la sintaxis.

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

Puede simplificar la función MarkdownLevel para '' función MarkdownLevel() let h = matchstr (getline (v: lnum), '^ # \ +') si está vacío (h) return "=" else return ">". len (h) endif endfunction', que publico simplificado en una línea porque este es un comentario. –

+0

Cosas agradables y puntos de bonificación para Omar.:-) –

5

Hay un complemento de vim-markdown en https://github.com/plasticboy/vim-markdown.

El código relacionado con plegado a partir de ahí parece ser:

" 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

Encontré que estas expresiones regulares también capturan mis bloques de código sangrados que comienzan con # (que indica una línea de comando de la shell). Elimine el \ s * en el inicio y el final para solucionarlo. –

2

Sobre la base de las sugerencias de Jeromy & Omar, se me ocurrió esto (para mi vimrc) para plegar automáticamente y sin ambigüedades mis archivos DokuWiki (en el que la cabecera del nivel superior está marcada por ====== en inicio de línea, a la cuarta cabecera del nivel marcado por ===):

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 encuentro de principio de la línea de cualquier número de '=' s contiguos

Entonces este en una línea de modo vim lo hace funcionar muy bien para un archivo DokuWiki:

foldmethod=expr foldexpr=DWTitleLevel() foldcolumn=5 

Y para Markdown, que tenía que escribir código de Omar como esto:

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

No sé cómo funciona la sintaxis del código, pero puede usar algo como 'return '>'. 7 - j'? –

+1

@ Brady Trainor, probé algo como 'let k = 7 - len (j)', then 'return"> ". K', pero por alguna razón no pude hacerlo funcionar, y ahora realmente prefiero mi solución más larga porque solo se activa para valores de 'j' entre 3 y 6, que es todo lo que quiero. – JosephHarriott

+0

Gracias por el truco 'let', acabo de usarlo para un problema similar. –

1

VOoM : Vim two-pane outliner vale la pena echarle un vistazo.

No solo proporciona un plegado básico, sino que también proporciona una navegación de contorno a través de un segundo panel de vista de esquema (similar al mapa del documento en MS Word). Y es compatible con una gran cantidad de lenguajes de marcado, incluidos otros mencionados en otras respuestas: Markdown, viki, reStructuredText, vimwiki, org y muchos otros.

Para obtener más información, vea el screenshots y el help page.

+0

No pude doblar el archivo de marcado con ese complemento, pero el contorno es bueno de todos modos :) – luator

1
let g:markdown_folding = 1 

Puede activar la función de plegado de rebajas mediante la adición de esto en su .vimrc si está utilizando la última versión de Vim - no hay necesidad de ser el último, pero no sé la versión exacta.

Por alguna razón, no está documentado en el archivo README, pero you can find the related code in the repository.

FYI, si no desea que las secciones se cierren al abrir un archivo, refer to this SO thread. Creo que agregar esta sería la mejor manera, pero es posible que tenga una preferencia diferente.

set nofoldenable 
0

A partir de Vim 8 se incluye por defecto (a través del complemento de marcación de Tim Pope). Sólo tiene que añadir esto a .vimrc:

let g:markdown_folding=1 

Para asegurarse de que tiene este plugin cargado puede ejecutar

:showscripts 

y buscar

vim80/syntax/markdown.vim