¿Hay alguna manera de usar varios métodos de plegado vim a la vez?

14

He foldmethod=indentestablecido en mi ~/.vimrc, y en general eso funciona para mí y me gustaría mantenerlo.

Sin embargo, hay algunos archivos que tengo que edito regularmente (y que están bajo mi control exclusivo), donde me gustaría agregar un sistema basado en marcadores, en particular para que cuando abra el archivo una sección grande rara vez se mira (que ya está 'delimitado' por sangría) está predoblado. Parece que foldmethod=markerme permitiera hacer eso (no me importa que otro comentario en el archivo para indicar estos 'pre-pliegues' si es necesario), pero todavía quiero foldmethod=indentestablece de modo que pueda utilizar zc, zoy así sucesivamente a continuación, doblar o desplegar secciones por sangría. Por lo que puedo decir, no puedo establecer el método de plegado en múltiples valores.

¿Hay alguna otra manera de lograr esto (idealmente usando algo incrustado en el archivo)?

Andrew Ferrier
fuente
También estoy tratando de hacer que ambos métodos de plegado de marcador y sangría funcionen al mismo tiempo. También creo que usar la expresión de pliegue es la mejor opción. ¿Encontró una expresión que coincida con sangría y marcador?
Jp_
1
@Jp_ nope, 'fraid no.
Andrew Ferrier

Respuestas:

10

Cada ventana puede tener su propio valor local de 'foldmethod'; lo que configura ~/.vimrces solo el valor predeterminado global. Hay varias formas de establecer un valor local diferente para un búfer en particular :

  1. Manualmente con :setlocal foldmethod=marker
  2. Para un tipo de archivo en particular (por ejemplo, archivos Java): :autocmd FileType java setlocal foldmethod=marker(o en ~/.vim/after/ftplugin/java.vim)
  3. Para archivos particulares: :autocmd BufRead /path/to/file setlocal foldmethod=marker
  4. Dentro del archivo en sí a través de una línea de modelo (ya que de todos modos tiene que agregar los marcadores, preferiría esto):

/* vim: set fdm=manual : */

Todavía puede haber solo un método de plegado dentro de una sola ventana. Si desea emplear diferentes estrategias, debe elegir un método más flexible (por ejemplo expr) y volver a implementar el "otro" método (s) allí (por ejemplo, haciendo que 'foldexpr'considere la sangría). O usa dos divisiones de ventana para el mismo búfer y establece diferentes métodos de plegado para cada división.

Dado que probablemente eso no sea lo que quieres escuchar, podrías hackear algo junto con un :autocmd CursorMovedque cambia el método de plegado en función de la línea actual:

" Use markers when in the first 100 lines, else use indent.
:autocmd CursorMoved,CursorMovedI <buffer> let &l:foldmethod = (line('.') <= 100 ? 'manual' : 'indent')
Ingo Karkat
fuente
1
Gracias. Entonces esto me dice que puedo establecer el método de plegado en el marcador dentro de ese búfer. Pero lo que estoy buscando es algo que todavía me permita usar el método de pliegue de sangría, mientras que algunas secciones (que están delimitadas por una sangría) se pliegan previamente. Si lo hago (4) anterior, zc, zo, y así sucesivamente ya no funcionará como se pretende en ese búfer. He aclarado mi pregunta.
Andrew Ferrier
Su pregunta no fue clara en ese aspecto, gracias por la aclaración. He modificado mi respuesta.
Ingo Karkat
Sí, disculpas si no estaba claro. El foldexpr suena como el mejor enfoque pero también complicado. Sin embargo, lo intentaré. +1 para el puntero.
Andrew Ferrier
Gracias de nuevo. He estado tratando de escribir el foldexpr y he abierto una Q relacionada aquí que puede ser de interés: superuser.com/questions/560167/…
Andrew Ferrier
@IngoKarkat: En el primer párrafo debajo de la línea, escribió que solo puede haber un método de plegado por búfer . Creo que debería ser por ventana .
garyjohn