2009-05-12 7 views
3

J'essaie de créer un script Vim simple qui créerait des plis de haut niveau très compacts pour les fichiers c. Idéalement, si elle a été exécutée sur ce code:Compact C Pliage dans Vim

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 pli commencerait une ligne plus haut et s'é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 sais pas comment le mettre en fonction. C'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 entièrement sûr comment fonctionnent les fonctions. En outre, cela ne fonctionnera pas pour la dernière fonction du fichier, car il ne retrouvera pas '^ {' à nouveau. Si quelqu'un pouvait m'aider à faire fonctionner cela, et ajouter d'une façon ou d'une autre un cas pour la dernière fonction dans un fichier, je serais extrêmement reconnaissant.

Merci à l'avance :)

Répondre

2

Vous pouvez créer des plis à l'aide du programme foldexpr et foldtext. Essayez ceci, bien que vous pourriez avoir à modifier CFoldLevel de sorte qu'il n'avale pas de pièces 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 :help 'foldexpr' pour plus de détails.

+0

Merci beaucoup :), c'était exactement ce que je cherchais. Il a fallu un peu de modification, mais je l'ai fait travailler comme je le veux, et peut enfin enlever les marqueurs de mes projets C. Très apprécié. –

+2

Salut vincent, pourriez-vous partager votre version modifiée? merci –

+0

Hmm ... J'ai essayé le code vim ci-dessus, mais il ne se comporte pas bien avec un commentaire multi-ligne au-dessus de la fonction ... – chutsu