Múltiplos métodos de dobra no vim

9

Eu uso bastante a opção de dobrar vim e geralmente definimos foldmethod para a sintaxe. Recentemente, descobri que é possível adicionar dobras personalizadas, de modo que eu possa colocar blocos inteiros em /*{{{*/ e /*}}}*/ , o que é muito útil para agrupar grandes seções de um arquivo de origem. No entanto, para usar esse recurso, preciso definir o foldmethod para marker e perder a sintaxe.

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

    
por Bjarke Freund-Hansen 08.12.2010 / 11:55

2 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 estiver disposto a aprender a escrever regras de realce de sintaxe e hackear o arquivo de realce para o idioma ao qual deseja adicionar a emulação de marcador. Fazer isso tem algumas desvantagens:

  1. Os comandos para criar / remover uma dobra ("zf", "zd" e assim por diante) que funcionam com marcadores e métodos de dobra manual não funcionarão quando o método fold for configurado para "sintaxe".

  2. Emulando marcadores que "forçam" o nível de dobra (por exemplo, " {{{1 " / " }}}1 ") em oposição a aumentar / diminuir o nível de dobra em um (por exemplo, " {{{ " / " }}} ") é problemático; ou você tem que ignorar totalmente os números do nível de dobra ou ter a chance de interferir - e possivelmente quebrar - o restante das regras de dobra baseadas em sintaxe.

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

    
por 08.12.2010 / 18:56
2

Eu estava procurando a mesma coisa. Desde que eu não quero hackear o arquivo de sintaxe, em vez disso eu tenho um mapeamento para alternar entre foldmethods. No momento, só alterno 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
    
por 15.09.2011 / 19:49