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

14

Eu foldmethod=indentestabeleci 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 eu gostaria de adicionar um sistema baseado em marcadores, especialmente para que, quando eu abrir o arquivo, uma seção grande raramente olhar (que já é 'delimitado' pelo recuo) é pré-dobrado. Parece que foldmethod=markerme permita fazer isso (eu não me importo o comentário estranho no arquivo para indicar esses 'pré-dobras', se necessário), mas eu ainda quero foldmethod=indentdefinir para que eu possa usar zc, zoe assim por diante, em seguida, dobre ou desdobre seções por recuo. Tanto quanto eu posso dizer, não posso definir foldmethod para vários valores.

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

Andrew Ferrier
fonte
Também estou tentando fazer com que os dois métodos de dobra e recuo funcionem ao mesmo tempo. Também acredito que usar a expressão fold é a melhor opção. Você encontrou uma expressão para corresponder ao travessão e ao marcador?
Jp_
1
@Jp_ não, 'frágil não.
Andrew Ferrier

Respostas:

10

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

  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 arquivos específicos: :autocmd BufRead /path/to/file setlocal foldmethod=marker
  4. Dentro do próprio arquivo através 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ê deseja empregar estratégias diferentes, deve escolher um método mais flexível (por exemplo expr) e reimplementar o (s) outro (s) método (s) nele (por exemplo, 'foldexpr'considerando seu travessão). Ou você usa duas divisões de janela para o mesmo buffer e define diferentes métodos de dobra para cada divisão.

Como isso provavelmente não é o que você deseja ouvir, você pode hackear algo junto com um :autocmd CursorMovedque alterne o método fold 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')
Ingo Karkat
fonte
1
Obrigado. Então isso me diz que eu posso definir o método foldmethod para marcar dentro desse buffer. Mas o que estou procurando é algo que ainda me permita usar o método de indent fold, enquanto algumas seções (que são delimitadas por um indent) são pré-dobradas. Se faço (4) acima, zc, zo, e assim por diante não funcionará como se pretende em que o tampão. Eu esclareci minha pergunta.
Andrew Ferrier
Sua pergunta não estava clara nesse aspecto, obrigado pelo esclarecimento. Eu alterei minha resposta.
Ingo Karkat 03/03
Sim, desculpas se eu não estivesse claro. O foldexpr parece a melhor abordagem, mas também é complicado. Vou tentar, no entanto. +1 para o ponteiro.
Andrew Ferrier
Obrigado novamente. Eu tenho tentado escrever o foldexpr e abriu um Q relacionada aqui que podem ser de interesse: superuser.com/questions/560167/...
Andrew Ferrier
@IngoKarkat: No primeiro parágrafo abaixo da linha que você escreveu, pode haver apenas um método de dobra por buffer . Eu acredito que deveria ser por janela .
precisa saber é o seguinte