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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top