Existe uma maneira de usar vários métodos de dobragem do vim de uma só vez?

13

Eu tenho foldmethod=indent definido no meu ~/.vimrc e, em geral, isso funciona para mim e eu gostaria de mantê-lo.

No entanto, existem alguns arquivos que eu edito regularmente (e que estão sob meu controle exclusivo), onde gostaria de adicionar um sistema baseado em marcadores, em particular para que, quando eu abrir o arquivo, A seção grande que eu raramente olho (que já é 'delimitada' por recuo) é pré-dobrada. Parece que foldmethod=marker me permitiria fazer isso (não me importo com o comentário estranho no arquivo para indicar essas "dobras prévias", se necessário), mas ainda quero foldmethod=indent set para poder usar zc , zo e assim por diante para dobrar ou desdobrar seções por recuo. Tanto quanto eu posso dizer que não posso definir o foldmethod para vários valores.

Existe outra maneira de conseguir isso (idealmente usando algo embutido no próprio arquivo)?

    
por Andrew Ferrier 03.03.2013 / 12:04

1 resposta

9

Cada janela pode ter seu próprio valor local de 'foldmethod' ; o que você define em ~/.vimrc é apenas o padrão global. Existem várias maneiras de definir um valor local diferente para um determinado buffer :

  1. manualmente com :setlocal foldmethod=marker
  2. Para um tipo de arquivo específico (por exemplo, arquivos Java): :autocmd FileType java setlocal foldmethod=marker (ou em ~/.vim/after/ftplugin/java.vim )
  3. Para arquivo (s) específico (s): :autocmd BufRead /path/to/file setlocal foldmethod=marker
  4. Dentro do próprio arquivo por meio de uma modeline (já que você precisa adicionar os marcadores de qualquer maneira, eu preferiria isso):

/* vim: set fdm=manual : */

Ainda pode haver apenas um método de dobra dentro de uma única janela. Se você quiser empregar estratégias diferentes, terá que escolher um método mais flexível (por exemplo, expr ) e reimplementar o (s) outro (s) método (s) (por exemplo, fazendo com que 'foldexpr' considere o recuo). Ou você usa duas divisões de janela para o mesmo buffer e define diferentes métodos de dobra para cada divisão.

Como provavelmente não é isso que você deseja ouvir, você pode hackear algo junto com um :autocmd CursorMoved que alterna o método de dobra com base na linha atual:

" Use markers when in the first 100 lines, else use indent.
:autocmd CursorMoved,CursorMovedI <buffer> let &l:foldmethod = (line('.') <= 100 ? 'manual' : 'indent')
    
por 03.03.2013 / 12:27

Tags