2016-09-13 3 views
0

Comment est-ce que je peux déplier seulement les plis contenant un pli, pour obtenir un aperçu de mon document? Si tout est plié et que j'appuie sur zr plusieurs fois, je reçois quelque chose de proche de ce que je veux, sauf que si les parties ont des profondeurs différentes, je ne vois pas de plis ou de contenu.Table des matières avec Fold in Vim

Dans cet exemple:

# Title {{{1 
# Subtitle {{{2 
some code here 
# Another Title {{{1 
code here directly under the level 1 title 

je voudrais voir quand plié:

# Title {{{1 
# Subtitle {{{2 
# Another Title {{{1 
+0

Pourriez-vous nous donner un exemple de votre situation? –

+0

J'ai édité ma question. – mrtnmgs

Répondre

0

Ce n'est pas trivial; J'ai résolu cela avec une fonction récursive qui détermine le niveau d'imbrication, puis ferme les plis les plus internes.

" [count]zy  Unfold all folds containing a fold/containing at least 
"   [count] levels of folds. Like |zr|, but counting from 
"   the inside-out. Useful to obtain an outline of the Vim 
"   buffer that shows the overall structure while hiding the 
"   details. 
function! s:FoldOutlineRecurse(count, startLnum, endLnum) 
    silent! keepjumps normal! zozj 

    if line('.') > a:endLnum 
     " We've moved out of the current parent fold. 
     " Thus, there are no contained folds, and this one should be closed. 
     execute a:startLnum . 'foldclose' 
     return [0, 1] 
    elseif line('.') == a:startLnum && foldclosed('.') == -1 
     " We've arrived at the last fold in the buffer. 
     execute a:startLnum . 'foldclose' 
     return [1, 1] 
    else 
     let l:nestLevelMax = 0 
     let l:isDone = 0 
     while ! l:isDone && line('.') <= a:endLnum 
      let l:endOfFold = foldclosedend('.') 
      let l:endOfFold = (l:endOfFold == -1 ? line('$') : l:endOfFold) 
      let [l:isDone, l:nestLevel] = s:FoldOutlineRecurse(a:count, line('.'), l:endOfFold) 
      if l:nestLevel > l:nestLevelMax 
       let l:nestLevelMax = l:nestLevel 
      endif 
     endwhile 

     if l:nestLevelMax < a:count 
      execute a:startLnum . 'foldclose' 
     endif 

     return [l:isDone, l:nestLevelMax + 1] 
    endif 
endfunction 
function! s:FoldOutline(count) 
    let l:save_view = winsaveview() 
    try 
     call cursor(1, 0) 
     keepjumps normal! zM 
     call s:FoldOutlineRecurse(a:count, 1, line('$')) 
    catch /^Vim\%((\a\+)\)\=:E490:/ " E490: No fold found 
     " Ignore, like zr, zm, ... 
    finally 
     call winrestview(l:save_view) 
    endtry 
endfunction 
nnoremap <silent> zy :<C-u>call <SID>FoldOutline(v:count1)<CR>