Gosto de dobrar com recuo, mas incluir os comentários na dobra (quero dizer que cada comentário tem o mesmo nível de dobra da linha anterior).
Infelizmente, a palavra-chave foldignore funciona apenas para comentários de uma linha. Então eu dobrei com expr no vimrc:
set foldmethod=expr
set foldexpr=FoldMethod(v:lnum)
function! FoldMethod(lnum)
"get string of current line
let crLine=getline(a:lnum)
" check if empty line
if empty(crLine) "Empty line or end comment
return -1 " so same indent level as line before
endif
" check if comment
let a:data=join( map(synstack(a:lnum, 1), 'synIDattr(v:val, "name")') )
if a:data =~ ".*omment.*"
return '='
endif
"Otherwise return foldlevel equal to indent /shiftwidth (like if
"foldmethod=indent)
else "return indent base fold
return indent(a:lnum)/&shiftwidth
endfunction
O último bloco:
indent(a:lnum)/&shiftwidth
Retorna uma base de nível de dobra no recuo.
E o outro :
join( map(synstack(a:lnum, 1), 'synIDattr(v:val, "name")') )
Verifica se o primeiro caractere da linha é considerado como um comentário com a sintaxe. Portanto, é uma boa maneira de mesclar o recuo e a dobra de sintaxe com a expressão, a dobra mais avançada.
Observe que você também pode "definir o texto da dobra", dependendo de como deseja que o resultado seja.