Question

Je suis en train de faire un simple script Vim qui créerait de haut niveau très compact se replie pour les fichiers c. Idéalement, si elle a été exécutée sur ce code:

static void funca(...)
{
   ... 
}

/* Example comment */
static void funcb(...)
{
   ... 
}

Ensuite, il créerait des plis qui ressemblerait à ceci fermé:

+-- x Lines: static void funca(...)----------------------
+-- x Lines: static void funcb(...)----------------------

Donc, fondamentalement, ce serait comme foldmethod = syntaxe avec foldlevel = 1, sauf que chaque fois commencerait une ligne plus haut, et étendrait plus bas pour inclure toutes les lignes vides suivantes.

Je sais comment faire un de ces plis (en supposant foldmethod = manuel):

/^{<cr>kVnn?^$<cr>zf

Mais je ne suis pas sûr de savoir comment le mettre en fonction. Ceci est mon effort:

function Cfold()
  set foldmethod=manual  " Manual folds
  ggzE                   " Delete all folds
  while (/^{<cr>)        " Somehow loop through each match
     kVnn?^$<cr>zf       " This would work fine except for the last function
  endwhile
endfunction
map <Leader>f  :call Cfold()<cr>

Mais ce n'est pas valide, je ne suis pas tout à fait sûr de savoir comment fonctionnent les fonctions. En outre, il ne fonctionnera pas pour la dernière fonction dans le fichier, car il ne trouvera pas « ^ { » à nouveau. Si quelqu'un pouvait me aider à obtenir ce travail, et en quelque sorte ajouter un cas pour la dernière fonction dans un fichier, je serais très reconnaissant.

Merci d'avance:)

Était-ce utile?

La solution

Vous pouvez créer des plis à l'aide de la programmation et foldexpr foldtext. Essayez ceci, bien que vous pourriez avoir à modifier CFoldLevel de sorte qu'il n'avale pas des parties non fonction du code:

function! CFoldLevel(lnum)
  let line = getline(a:lnum)
  if line =~ '^/\*'
    return '>1' " A new fold of level 1 starts here.
  else
    return '1' " This line has a foldlevel of 1.
  endif
endfunction

function! CFoldText()
  " Look through all of the folded text for the function signature.
  let signature = ''
  let i = v:foldstart
  while signature == '' && i < v:foldend
    let line = getline(i)
    if line =~ '\w\+(.*)$'
      let signature = line
    endif 
    let i = i + 1
  endwhile

  " Return what the fold should show when folded.
  return '+-- ' . (v:foldend - v:foldstart) . ' Lines: ' . signature . ' '
endfunction

function! CFold()               
  set foldenable
  set foldlevel=0   
  set foldmethod=expr
  set foldexpr=CFoldLevel(v:lnum)
  set foldtext=CFoldText()
  set foldnestmax=1
endfunction

Voir pour plus de détails :help 'foldexpr'.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top