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:)
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'
.