Cuando lees un archivo, a menudo hay mucho texto irrelevante que te impide entender lo que realiza ese archivo. Para ocultar ese *ruido* innecesario, utiliza el plegado de texto que ofrece Vim (Vim Fold).
Imagina que estás doblando una hoja de papel para cubrir una parte de texto. El texto actual no ha desaparecido, todavía sigue ahí. El plegado de Vim funciona de una manera similar. Este pliega una parte del texto, evitando mostrarlo pero sin eliminarlo del archivo.
El comando para plegar texto en Vim es un operador, por lo que cumple las reglas gramaticales de Vim (`verbo + sustantivo`). Puedes pasarle al operador de plegado un movimiento o un objeto de texto. Para plegar el párrafo en el que se encuentra el cursor, ejecuta `zfip`. Para plegar desde la posición actual hasta el final del archivo, ejecuta `zfG`. Para plegar los textos entre `{` y `}`, ejecuta `zfa{`.
También puedes ejecutar un plegado de texto desde la línea de comandos con el comando `:fold`. Para plegar la línea actual y la línea posterior, ejecuta:
`,+1` es el rango. Si no le pasas parámetros al rango, el comando de manera predeterminada lo aplica a la línea actual. `+1` es el indicador de rango para la línea siguiente. Para plegar las líneas de la 5 a la 10, ejecuta `:5,10fold`. Para plegar desde la posición actual hasta el final de la línea, ejecuta `:,$fold`.
Puedes ejecutar `zR` y `zM` estando en cualquier línea, pero `za` solo funciona cuando estás en una línea que pertenece a un plegado de texto. Para aprender más sobre los comandos de los plegados de texto, echa un vistazo a `:h fold-commands`.
Para ver el método de plegado de texto que estás utilizando actualmente, ejecuta `:set foldmethod?`. De manera predeterminada, Vim utiliza el método `manual`.
Con este método de plegado de texto, Vim mira cuantos espacios tiene cada línea al comienzo y lo compara con la opción `'shiftwidth'` para determinar cómo lo puede plegar. `'shiftwidth'` devuelve el número de espacios requeridos para cada paso del sangrado de línea. Si ejecutas:
El valor predeterminado de Vim de `'shiftwidth'` es 2. En el texto del ejemplo anterior, hay dos espacios al comienzo de la línea y los textos "Dos" y "Dos de nuevo". Cuando Vim comprueba el número de espacios al inicio de la líea y el valor 2 de `'shiftwidth'`, Vim cosidera que las líneas tienen que ser plegadas en un primer nivel.
Ahora mismo si ejecutas `:set foldmethod=indent`, Vim no plegará el texto sangrado debido a que no tiene el margen indicado en cada línea. Un solo espacio no es considerado dentro de sangrado de margen. Sin embargo, si cambias el valor de la variable `'shiftwidth'` a 1:
Devuelve de nuevo el valor de `shiftwidth` a 2 y los espacios de las líneas de nuevo a dos. Y además añade otras dos líneas de texto, como en el ejemplo:
Los plegados anidados son válidos. El texto "Dos" y "Dos de nuevo" están plegados en un primer nivel. El texto "Tres" y "Tres de nuevo" están plegados en un segundo nivel. Si tienes un texto plegado con un nivel de plegado mayor con texto plegado dentro, tienes múltiples capas de plegados.
Vim ve `{{{` y `}}}` como indicadores de plegado y pliega el texto que hay entre ellos. Con el plegado por marcador, Vim busca los marcadores especiales, definidos por la opción `'foldmarker'`, para marcar las áreas de plegado. Para ver qué marcadores utiliza Vim, ejecuta:
Ahora Vim utiliza `coffee1` y `coffee2` como los nuevos marcadores de plegado de texto. Como nota complementaria, un indicador debe ser una cadena literal y no puede ser una expresión regular.
El plegado por sintaxis está determinado por el resaltado de lenguaje de sintaxis. Si utilizas un complemento de sintaxis de lenguaje como [vim-polyglot](https://github.com/sheerun/vim-polyglot), el plegado por sintaxis funcionará sin necesidad de configurar nada. Simplemente cambia el método de plegado a sintaxis:
Vamos a asumir que estás editando un archivo en lenguaje JavaScript y tienes el complemento vim-polyglot instalado. Si tienes un array como el siguiente:
Esto será plegado con un plegado por sintaxis. Cuando defines un resaltado de sintaxis para un lenguaje en particular (normalmente dentro del directorio `syntax/`), puedes añadir un atributo `fold` para hacer que puede ser plegado. A continuación tienes una porción de código del archivo de sintaxis de vim-polyglot para JavaScript. Ten en cuenta la palabra clave `fold` al final de la línea.
Esta guía no tratará de manera detallada la funcionalidad de `syntax`. Si tienes más curiosidad por esto, echa un vistazo a la ayuda de Vim `:h syntax.txt`.
El plegado por expresión te permite definir una expresión que encaje en un plegado de texto. Después de definir las expresiones que se pueden plegar, Vim busca cada línea el valor de `'foldexpr'`. Esta es la variable que tienes que configurar para devolver el valor adecuado. Si `'foldexpr'` devuelve un valor 0, entonces la línea no puede meterse en un plegado. Si devuelve un valor 1, entonces esa línea tiene un nivel de plegado de 1. Si devuelve un 2, entonces esa línea tiene un nivel de plegado de 2. Hay más valores que números, pero no voy a repasarlos todos. Si tienes curiosidad, echa un vistazo a `:h fold-expr`.
-`:set foldexpr` establece la opción `'foldexpr'` para que acepte expresiones personalizadas.
-`getline()` es una función de Vimscript que devuelve el contenido de cualquier línea dada. Si ejecutas `:echo getline(5)`, esto devolverá el contenido de la línea 5.
-`v:lnum` es una variable especial de Vim para la expresión `'foldexpr'`. Vim busca cada línea y en cada momento almacena cada número de línea en la variabl `v:lnum`. En la línea 5, `v:lnum` tiene el valor 5. En la línea 10, `v:lnum` tiene el valor 10.
-`[0]` en el contexto de `getline(v:lnum)[0]` es el primer caracter de cada línea. Cuando Vim rastrea una línea, `getline(v:lnum)` devuelve el contenido de cada línea. `getline(v:lnum)[0]` devuelve el primer caracter de cada línea. En la primera línea de nuestra lista, "donut", `getline(v:lnum)[0]` devuelve "d". En la segunda línea de nuestra lista, "churros", `getline(v:lnum)[0]` devuelve "c".
-`==\\"c\\"` es la segunda mitad de la expresión de igualdad. Esta comprueba si la expresión que acaba de evaluar es igual a "c". Si esto es cierto, esto devuelve 1. Si esto es falso, esto devuelve 0. En Vim, 1 es verdadero y 0 es falso. Así que las líneas que comiencen con "c" devuelven un 1. Recuerda que si `'foldexpr'` tiene un valor de 1, entonces tiene un nivel de plegado de 1.
Vim de manera automática pliega algunas líneas idénticas. Cuando ejecutas el comando `vimdiff`, Vim automáticamente utiliza `foldmethod=diff`. Si ejecutas ahora `:set foldmethod?`, verás que devuelve `diff` como método de plegado utilizado.
Your folds are restored. However, you have to manually run `mkview` and `loadview`. I know that one of these days, I will forget to run `mkview` before closing the file and I will lose all the folds. How can we automate this process?
-`BufWinLeave` for when you remove a buffer from a window.
-`BufWinEnter` for when you load a buffer in a window.
Now after you fold inside a `.txt` file and exit Vim, the next time you open that file, your fold information will be restored.
By default, Vim saves the fold information when running `mkview` inside `~/.vim/view` for the Unix system. For more information, check out `:h 'viewdir'`.
When I first started Vim, I neglected ot learn fold because I didn't think it was useful. However, the longer I code, the more useful I find folding is. Strategically placed folds can give you a better overview of the text structure, like a book's table of content.
When you learn fold, start with the manual fold because that can be used on-the-go. Then gradually learn different tricks to do indent and marker folds. Finally, learn how to do syntax and expression folds. You can even use the latter two to write your own Vim plugins.