Domanda
Sto cercando di fare un semplice script Vim che creerebbe molto compatta di alto livello piega per file C. Idealmente, se è stato eseguito su questo codice:
static void funca(...)
{
...
}
/* Example comment */
static void funcb(...)
{
...
}
Poi si creerebbe pieghe che sarebbe simile a questa quando è chiuso:
+-- x Lines: static void funca(...)----------------------
+-- x Lines: static void funcb(...)----------------------
Quindi sostanzialmente come sarebbe foldmethod = sintassi con foldlevel = 1, eccetto che ciascuna piega inizierebbe una riga più in alto, e si estenderebbe più in basso per includere tutte le successive righe vuote.
So come fare una di queste pieghe (supponendo foldmethod = manuale):
/^{<cr>kVnn?^$<cr>zf
Ma io non sono sicuro di come mettere in una funzione. Questo è il mio impegno:
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>
Ma non è valido, non sono del tutto sicuro di come funzionano le funzioni. Inoltre, non funzionerà per l'ultima funzione nel file, dal momento che non troverà '^ {' di nuovo. Se qualcuno potesse aiutarlo ad ottenere questo lavoro, e in qualche modo aggiungo un caso per l'ultima funzione in un file, sarei estremamente grato.
Grazie in anticipo:)
Soluzione
È possibile creare pieghe di programmazione utilizzando l'foldexpr
e foldtext
. Prova questo, anche se potrebbe essere necessario modificare CFoldLevel
in modo che non inghiottire parti non funzione del codice:
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
Vedere :help 'foldexpr'
per maggiori dettagli.