Como definir o foldlevelstart no vim para apenas dobrar nada inicialmente, ainda permitindo que o zr funcione imediatamente?

8

No vim, geralmente defino foldmethodpara indenta maioria dos tipos de arquivo. Em geral, gosto de abrir arquivos com todas as dobras abertas. No entanto, é útil começar a usar imediatamente zmpara começar a fechar dobras globalmente no arquivo, um nível de cada vez, permitindo-me ver a estrutura geral do arquivo sem que os detalhes atrapalhem.

A única solução geral que encontrei é definir foldlevelstartum número muito alto, por exemplo, 99, para garantir que todos os arquivos (tendo em mente que arquivos diferentes terão níveis diferentes de recuo máximo) sejam desdobrados completamente. No entanto, eu teria que usar zmrepetidamente para reduzir foldlevelao nível máximo de dobra do arquivo, normalmente muito menor que 99, o que é complicado e impraticável. Eu poderia definir foldlevelmanualmente usando a linha de comando vim, mas ainda precisaria saber o recuo máximo no arquivo.

Existe uma maneira prática de abrir um arquivo com o foldlevelconjunto exatamente um a mais que o nível máximo de avanço / dobra atual no próprio arquivo?

Por exemplo, dado o seguinte arquivo:

a
  b
    c
      d1
      d2
    e
      f1
      f2

O primeiro pressionamento de tecla zmmostraria isso:

a
  b
    c
+--  2 lines: d1------
    e
+--  2 lines: f1------

(Observe, no entanto, que ele deve funcionar no caso geral em que o recuo máximo inicial do arquivo pode ter qualquer valor).

Andrew Ferrier
fonte
11
Você está confundindo zrcom zm; o último reduz o nível de dobra.
Ingo Karkat
@IngoKarkat, você está certo, eu estou. Desculpe a confusão - eu sempre acho esses combos contra-intuitivos. Eu corrigi minha pergunta.
Andrew Ferrier
"Eu sempre acho esses combos contra-intuitivos". É suposto significar zm= vezes mais (foldlevel subtrair) e zr= vezes menos (foldlevel add)
wisbucky

Respostas:

9

Este encontra o nível de dobra mais alto no arquivo atual:

:let &foldlevel = max(map(range(1, line('$')), 'foldlevel(v:val)'))

Para definir isso automaticamente, você pode usar um :autocmd:

:autocmd BufWinEnter * let &foldlevel = max(map(range(1, line('$')), 'foldlevel(v:val)'))
Ingo Karkat
fonte
11
Ingo, perfeito, era exatamente isso que eu estava procurando. Obrigado. A vergonha foldlevelstartnão tem uma opção como esta.
precisa
Isso não parece funcionar no Cygwin Vim. Meu foldlevelé 0 e foldlevelstarté -1 quando inicio um arquivo com essas configurações.
CMCDragonkai
0

Em vez de usar zr, use zR, o que abrirá todas as dobras. Da mesma forma, zMfechará todas as dobras.

garyjohn
fonte
Gary, obrigado. Está perto, mas não faz o que eu descrevo. Eu gostaria de um comando que reduza o nível de dobra em apenas um, mas a partir do nível máximo de dobra relevante para o arquivo em questão. Para fazer isso, eu precisaria usar o zM para reduzir o nível de dobra para 0 e, em seguida, zr repetidamente para abrir mais detalhes. Estou procurando uma combinação de comando / chave.
Andrew Ferrier
2
Você pode fazer zR(defina o nível de dobra para o nível mais alto) e depois zmfuncionará. É apenas um passo extra.
wisbucky
0

A opção set nofoldenablepermite iniciar o arquivo com todas as dobras abertas

HarshaNadimpalli
fonte
Essa não é a pergunta que fiz. Quero dobrar ativado.
Andrew Ferrier