Múltiplos métodos de dobra no vim

9

Eu uso bastante a opção de dobrar do vim e geralmente defini foldmethod para sintaxe. Recentemente, descobri que é possível adicionar dobras personalizadas, para que eu possa inserir blocos inteiros /*{{{*/e /*}}}*/que é muito útil para agrupar grandes seções de um arquivo de origem. No entanto, para usar esse recurso, preciso definir foldmethod como marcador e perco a dobra da sintaxe.

É possível ter dois métodos de dobra ativos ao mesmo tempo no vim? set foldmethod=syntax,markernão funciona.

Bjarke Freund-Hansen
fonte

Respostas:

4

Não, estritamente falando, não é possível ter vários métodos de dobra ativos no Vim ao mesmo tempo.

Você pode emular a dobra baseada em marcador se quiser aprender a escrever regras de destaque de sintaxe e hackear o arquivo de destaque do idioma ao qual deseja adicionar a emulação de dobra de marcador. Fazer isso tem algumas desvantagens:

  1. Os comandos para criar / remover uma dobra ("zf", "zd" e assim por diante) que funcionem com os métodos de marcador e dobra manual não funcionarão quando o método da dobra estiver definido como "sintaxe".

  2. Emular marcadores que "forçam" o nível de dobra (por exemplo, " {{{1" / " }}}1") em vez de aumentar / diminuir o nível de dobra em um (por exemplo, " {{{" / " }}}") é problemático; ou você deve ignorar completamente os números do nível de dobra ou arriscar-se a interferir - e possivelmente quebrar - o restante das regras de dobra baseadas em sintaxe.

Sugiro que, quando você achar que precisa de dobragem baseada em marcador, use esse método inteiramente. Pode levar algum tempo e esforço extra, mas se você realmente precisar da flexibilidade, pode valer a pena, especialmente considerando as dificuldades de tentar combinar os dois.

Heptite
fonte
2

Eu estava procurando a mesma coisa. Como não quero invadir o arquivo de sintaxe, tenho um mapeamento para alternar entre os métodos foldmet. No momento, alterno apenas entre sintaxe e marcador:

nmap <Leader>ff :call <SID>ToggleFold()<CR>
function! s:ToggleFold()
    if &foldmethod == 'marker'
        let &l:foldmethod = 'syntax'
    else
        let &l:foldmethod = 'marker'
    endif
    echo 'foldmethod is now ' . &l:foldmethod
endfunction
idbrii
fonte