Aprende-Vim/ch20_views_sessions_viminfo.md

397 lines
13 KiB
Markdown
Raw Normal View History

2021-03-12 19:13:37 +01:00
# Capítulo 20: Vistas, sesiones y Viminfo
2020-11-14 20:48:48 +01:00
2021-03-12 19:13:37 +01:00
Después de haber trabajado en un proyecto durante un tiempo, puedes encontrar que el proyecto de manera gradual va tomando forma con sus propios ajustes, carpetas, *buffers*, diseños, etc. Es como decorar tu apartamento después de vivir en el durante un tiempo. Es problema es, que cuando cierras Vim, pierdes esos cambios. ¿No sería genial si pudieras mantener esos cambios para que la próxima vez que abras Vim, pareciera que nunca lo hubieras cerrado?
2020-11-14 20:48:48 +01:00
2021-03-12 19:13:37 +01:00
En este capítulo, aprenderás a utilizar las vistas, sesiones y Viminfo para preservar una *instantánea" de tus proyectos.
2020-11-14 20:48:48 +01:00
2021-03-12 19:13:37 +01:00
## Vista (View)
2020-11-14 20:48:48 +01:00
2021-03-12 19:13:37 +01:00
Una vista es el subconjunto más pequeño de los tres temas de este capítulo (vista, sesiones, Viminfo). Es una colección de ajustes para una ventana. Si pasas mucho tiempo trabajando en una ventana y quieres preservar los mapas y carpetas, puedes utilizar una vista.
2020-11-14 20:48:48 +01:00
2021-03-12 19:13:37 +01:00
Vamos a crear un archivo llamado `foo.txt`:
2020-11-14 20:48:48 +01:00
```
foo1
foo2
foo3
foo4
foo5
foo6
foo7
foo8
foo9
foo10
```
2021-03-12 19:13:37 +01:00
En este archivo, creamos tres cambios:
1. En la línea 1, crea un pliegue de texto (fold) manual con `zf4j` (pliega el contenido de las cuatro líneas siguientes).
2. Cambia el ajuste de la numeración de las líneas `number`: `setlocal nonumber norelativenumber`. Esto eliminará los indicadores de número de la parte izquierda de la ventana.
3. Crea un mapeado local para bajar dos líneas cada vez que presiones `j` en vez de solo una línea, mediante `:nnoremap <buffer> j jj`.
2020-11-14 20:48:48 +01:00
2021-03-12 19:13:37 +01:00
Tu archivo ahora deberá tener un aspecto similar a este:
2020-11-14 20:48:48 +01:00
```
+-- 5 lines: foo1 -----
foo6
foo7
foo8
foo9
foo10
```
2021-03-13 18:59:56 +01:00
### Configurar los atributos de las vistas
2020-11-14 20:48:48 +01:00
2021-03-13 18:59:56 +01:00
Ejecuta:
2020-11-14 20:48:48 +01:00
```
:set viewoptions?
```
2021-03-13 18:59:56 +01:00
De manera predeterminada debería aparecer (aunque tu mensaje podría ser diferente dependiendo de tu archivo vimrc):
2020-11-14 20:48:48 +01:00
```
viewoptions=folds,cursor,curdir
```
2021-03-13 18:59:56 +01:00
Vamos a configurar `viewoptions`. Los tres atributos que quieres mantener son los pliegues de texto (folds), los mapeados y las opciones configuradas de manera local. Si tus ajustes se parecen a los míos, ya tienes la opción `folds`. Necesitas configurar las vistas para que recuerde las `localoptions`. Ejecuta:
2020-11-14 20:48:48 +01:00
```
:set viewoptions+=localoptions
```
2021-03-13 18:59:56 +01:00
Para aprender qué otras opciones están disponibles para `viewoptions`, echa un vistazo a `:h viewoptions`. Ahora si ejecutas `:set viewoptions?`, deberías ver algo así:
2020-11-14 20:48:48 +01:00
```
viewoptions=folds,cursor,curdir,localoptions
```
2021-03-13 18:59:56 +01:00
### Guardando las vistas
2020-11-14 20:48:48 +01:00
2021-03-13 18:59:56 +01:00
Con la ventana en la que aparece el archivo `foo.txt` correctamente plegada y teniendo las opciones de `nonumber norelativenumber`, vamos a guardas las vistas. Ejecuta:
2020-11-14 20:48:48 +01:00
```
:mkview
```
2021-03-13 18:59:56 +01:00
Vim crea un archivo de vistas.
2020-11-14 20:48:48 +01:00
2021-03-13 18:59:56 +01:00
### Archivos de vistas
2020-11-14 20:48:48 +01:00
2021-03-13 18:59:56 +01:00
Quizás te preguntes ¿dónde guardó Vim el archivo de las vistas? Para ver donde lo guardó Vim, ejecuta:
2020-11-14 20:48:48 +01:00
```
:set viewdir?
```
2021-03-13 18:59:56 +01:00
De manera predeterminada lo hace en esta ruta `~/.vim/view` (si tienes un sistema operativo diferente, podría mostrar una ruta diferente. Echa un vistazo a `:h viewdir` para más información). Si quieres cambiar esa ruta a otro sitio de tu sistema, añade esto en tu archivo de configuración vimrc:
2020-11-14 20:48:48 +01:00
```
2021-03-13 18:59:56 +01:00
set viewdir=$HOME/tu_ruta/personalizada
2020-11-14 20:48:48 +01:00
```
2021-03-13 18:59:56 +01:00
### Cargando el archivo de vistas
2020-11-14 20:48:48 +01:00
2021-03-13 18:59:56 +01:00
Cierra el archivo `foo.txt` si todavía no lo has hecho y después vuelve a abrirlo de nuevo. **Deberías ver el texto original sin los cambios.** Eso es lo esperado.
2021-03-13 18:59:56 +01:00
Para restaurar el estado, necesitas cargar el archivo de vistas. Ejecuta:
2020-11-14 20:48:48 +01:00
```
:loadview
```
2021-03-13 18:59:56 +01:00
Ahora en tu archivo deberías ver:
2020-11-14 20:48:48 +01:00
```
+-- 5 lines: foo1 -----
foo6
foo7
foo8
foo9
foo10
```
2021-03-13 18:59:56 +01:00
Los pliegues de texto (folds), los ajustes locales y los mapeados locales se han recuperado. Si te das cuenta, también el cursor debería estar en la línea en la que estaba cuando ejecutaste `:mkview`. Siempre que tengas la opción `cursor`, las vistas también recuerdan la posición del cursor.
2020-11-14 20:48:48 +01:00
2021-03-13 19:12:01 +01:00
### Multiples vistas
2020-11-14 20:48:48 +01:00
2021-03-13 19:12:01 +01:00
Vim te permite guardar hasta un número de 9 vistas (1-9).
2020-11-14 20:48:48 +01:00
2021-03-13 19:12:01 +01:00
Supongamos que quieres hacer un pliegue (fold) adicional (por ejemplo quieres plegar texto de las dos últimas líneas) con `:9,10 fold`. Vamos a guardar esto como vista 1. Ejecuta:
2020-11-14 20:48:48 +01:00
```
:mkview 1
```
2021-03-13 19:12:01 +01:00
Si quieres hacer un pliegue de texto más con `:6,7 fold` y guardarlo como una vista diferente, ejecuta:
2020-11-14 20:48:48 +01:00
```
:mkview 2
```
2021-03-13 19:12:01 +01:00
Cierra el archivo. Cuando vuelvas a abrir `foo.txt` y quieras cargar la vista 1, ejecuta:
2020-11-14 20:48:48 +01:00
```
:loadview 1
```
2021-03-13 19:12:01 +01:00
Para cargar la vista 2, ejecuta:
2020-11-14 20:48:48 +01:00
```
:loadview 2
```
2021-03-13 19:12:01 +01:00
Para cargar la vista original, ejecuta:
2020-11-14 20:48:48 +01:00
```
:loadview
```
2021-03-13 19:12:01 +01:00
### Automatizar la creación de vistas
2020-11-14 20:48:48 +01:00
2021-03-13 19:12:01 +01:00
Una de las peores cosas que te pueden pasar trabajando con Vim es que después de pasar incontables horas organizando un archivo enorme con pliegues de texto, de manera accidental cierres la ventana y pierdas toda la información de los pliegues (folds). Para prevenir esto, quizás quieras crear automáticamente una vista cada vez que cierres un *buffer*. Para ello añade esto en tu archivo vimrc:
2020-11-14 20:48:48 +01:00
```
autocmd BufWinLeave *.txt mkview
2020-11-14 20:48:48 +01:00
```
2021-03-13 19:12:01 +01:00
de manera adicional, podría estar bien el cargar la vista cada vez que abres un *buffer*:
2020-11-14 20:48:48 +01:00
```
autocmd BufWinEnter *.txt silent loadview
2020-11-14 20:48:48 +01:00
```
2021-03-13 19:12:01 +01:00
Ahora no te tienes que preocupar de crear o cargar una vista nunca más cuando estés trabajando con archivos `txt`. Ten en cuenta que con el paso del tiempo, tu `~/.vim/view` podría empezar a acumular muchos archivos de vistas. Es buena idea limpiarlo cada pocos meses.
2020-11-14 20:48:48 +01:00
2021-03-15 18:44:37 +01:00
## Sesiones
2020-11-14 20:48:48 +01:00
2021-03-15 18:44:37 +01:00
si una vista guarda los ajustes de una ventana, una sesión guarda la información de todas las ventanas (incluyendo el diseño).
2020-11-14 20:48:48 +01:00
2021-03-15 18:44:37 +01:00
### Creando una nueva sesión
2020-11-14 20:48:48 +01:00
2021-03-15 18:44:37 +01:00
Supongamos que estás trabajando con estos 3 archivos en un proyecto llamado `foobarbaz`:
2020-11-14 20:48:48 +01:00
2021-03-15 18:44:37 +01:00
Dentro de `foo.txt`:
2020-11-14 20:48:48 +01:00
```
foo1
foo2
foo3
foo4
foo5
foo6
foo7
foo8
foo9
foo10
```
2021-03-15 18:44:37 +01:00
Dentro de `bar.txt`:
2020-11-14 20:48:48 +01:00
```
bar1
bar2
bar3
bar4
bar5
bar6
bar7
bar8
bar9
bar10
```
2021-03-15 18:44:37 +01:00
Dentro de `baz.txt`:
2020-11-14 20:48:48 +01:00
```
baz1
baz2
baz3
baz4
baz5
baz6
baz7
baz8
baz9
baz10
```
2021-03-15 18:44:37 +01:00
Vamos a suponer que el diseño de las ventanas es similar al que aparece a continuación (utilizando de manera estratégica para ello `split` y `vsplit`):
2020-11-14 20:48:48 +01:00
![Session Layout](images/session-layout.png)
2020-11-14 20:48:48 +01:00
2021-03-15 18:44:37 +01:00
Para preservar este aspecto, necesitas guardar la sesión. Ejecuta:
2020-11-14 20:48:48 +01:00
```
:mksession
```
2021-03-15 18:44:37 +01:00
A diferencia de `mkview` donde de manera predeterminada guarda la configuración en `~/.vim/view`, `mksession` guarda el archivo de sesión (`Session.vim`) en el directorio actual. Echa un vistazo al archivo si tienes curosidad de qué guarda dentro Vim.
2020-11-14 20:48:48 +01:00
2021-03-15 18:44:37 +01:00
Si quieres guardar el archivo de sesión en algún otro lugar, puedes pasar un argumento al comando `mksession`:
2020-11-14 20:48:48 +01:00
```
2021-03-15 18:44:37 +01:00
:mksession ~/otra/ruta/distinta.vim
2020-11-14 20:48:48 +01:00
```
2021-03-15 18:44:37 +01:00
Si quieres sobreescribir el archivo de sesión existente, invoca el comando con el símbolo `!` (`:mksession! ~/otra/ruta/distinta.vim`).
2020-11-14 20:48:48 +01:00
2021-03-15 18:56:59 +01:00
### Cargando una sesión
2020-11-14 20:48:48 +01:00
2021-03-15 18:56:59 +01:00
Para cargar una sesión existente, ejecuta:
2020-11-14 20:48:48 +01:00
```
:source Session.vim
```
2021-03-15 18:56:59 +01:00
¡Ahora Vim vuelve a tener el mismo aspecto que cuando lo cerraste! De manera alternativa también puedes cargar el archivo de sesión desde la terminal:
2020-11-14 20:48:48 +01:00
```
vim -S Session.vim
```
2021-03-15 18:56:59 +01:00
### Configurando atributos de la sesión
2020-11-14 20:48:48 +01:00
2021-03-15 18:56:59 +01:00
Puedes configurar los atributos que se guardan de las sesiones. Para ver qué es lo que actualmente se está guardando, ejecuta:
2020-11-14 20:48:48 +01:00
```
:set sessionoptions?
```
2021-03-15 18:56:59 +01:00
En mi caso aparece lo siguiente:
2020-11-14 20:48:48 +01:00
```
blank,buffers,curdir,folds,help,tabpages,winsize,terminal
```
2021-03-15 18:56:59 +01:00
Si no quieres guardar la `terminal` cuando guardes una sesión, elimina esta opción de la sesión, para ello, ejecuta:
2020-11-14 20:48:48 +01:00
```
:set sessionoptions-=terminal
```
2021-03-15 18:56:59 +01:00
Si quiere añadir las `options` cuando guardes una sesión, ejecuta:
2020-11-14 20:48:48 +01:00
```
:set sessionoptions+=options
```
2021-03-15 18:56:59 +01:00
Estos son algunos de los atributos que `sessionoptions` pueden gestiona:
- `blank` almacena las ventanas vacía
- `buffers` almacena los *buffers*
- `folds` almacena los plegados de textos
- `globals` almacena variables globales (debe comenzar con una letra mayúscula y contener al menos una letra minúscula)
- `options` almacena las opciones y mapeados
- `resize` almacena las líneas y columnas de las ventanas
- `winpos` almacena la posición de las ventanas
- `winsize` almacena los tamaños de las ventanas
- `tabpages` almacena las pestañas
- `unix` almacena archivos en formato Unix
2020-11-14 20:48:48 +01:00
2021-03-15 18:56:59 +01:00
Para consultar la lista completa, echa un vistazo a `:h 'sessionoptions'`.
2020-11-14 20:48:48 +01:00
2021-03-15 18:56:59 +01:00
Las sesiones son una herramienta útil para preservar los atributos externos de tu proyecto. Sin embargo, algunos atributos internos no se guardan en las sesiones, como las marcas locales, registros, historiales, etc. Para guardarlos, ¡necesitas utilizar Viminfo!
2020-11-14 20:48:48 +01:00
## Viminfo
If you notice, after yanking a word into register a and quitting Vim, the next time you open Vim you still that text stored in the register. This is actually a work of Viminfo. Without it, Vim won't remember the register after you close Vim.
2020-11-14 20:48:48 +01:00
If you use Vim 8 or higher, Vim enables Viminfo by default, so you may have been using Viminfo this whole time without knowing it!
2020-11-14 20:48:48 +01:00
You might ask: "What does Viminfo save? How does it differ from Session?"
To use Viminfo, first you need to have `+viminfo` feature available (`:version`). Viminfo stores:
2020-11-14 20:48:48 +01:00
- The command-line history.
- The search string history.
- The input-line history.
- Contents of non-empty registers.
- Marks for several files.
- File marks, pointing to locations in files.
- Last search / substitute pattern (for 'n' and '&').
- The buffer list.
- Global variables.
In general, Session stores the "external" attributes and Viminfo the "internal" attributes.
2020-11-14 20:48:48 +01:00
Unlike Session where you can have one Session file per project, you normally will use one Viminfo file per computer. Viminfo is project-agnostic.
The default Viminfo location for Unix is `$HOME/.viminfo` (`~/.viminfo`). If you use a different OS, your Viminfo location might be different. Check out `:h viminfo-file-name`. Each time you make "internal" changes, like yanking a text into a register, Vim automatically updates the Viminfo file.
*Make sure that you have `nocompatible` option set (`set nocompatible`), otherwise your Viminfo will not work.*
### Writing And Reading Viminfo
2020-11-14 20:48:48 +01:00
Although you will use only one Viminfo file, you can create multiple Viminfo files. To write a Viminfo file, use the `:wviminfo` command (`:wv` for short).
```
:wv ~/.viminfo_extra
```
To overwrite an existing Viminfo file, add a bang to the `wv` command:
```
:wv! ~/.viminfo_extra
```
By default Vim will read from `~/.viminfo` file. To read from a different Viminfo file, run `:rviminfo`, or `:rv` for short:
```
:rv ~/.viminfo_extra
```
To start Vim with a different Viminfo file from the terminal, use the `i` flag:
2020-11-14 20:48:48 +01:00
```
vim -i viminfo_extra
```
If you use Vim for different tasks, like coding and writing, you can create a Viminfo optimized for writing and another for coding.
2020-11-14 20:48:48 +01:00
```
vim -i viminfo_writing
vim -i viminfo_coding
```
### Starting Vim Without Viminfo
2020-11-14 20:48:48 +01:00
To start Vim without Viminfo, you can run from the terminal:
2020-11-14 20:48:48 +01:00
```
vim -i NONE
```
To make it permanent, you can add this in your vimrc file:
2020-11-14 20:48:48 +01:00
```
set viminfo="NONE"
```
### Configuring Viminfo Attributes
2020-11-14 20:48:48 +01:00
Similar to `viewoptions` and `sessionoptions`, you can instruct what attributes to save with the `viminfo` option. Run:
```
:set viminfo?
```
You will get:
```
!,'100,<50,s10,h
```
This looks cryptic. Let's break it down:
- `!` saves global variables that start with an uppercase letter and don't contain lowercase letters. Recall that `g:` indicates a global variable. For example, if at some point you wrote the assignment `let g:FOO = "foo"`, Viminfo will save the global variable `FOO`. However if you did `let g:Foo = "foo"`, Viminfo will not save this global variable because it contains lowercase letters. Without `!`, Vim won't safe those global variables.
- `'100` represents marks. In this case, Viminfo will save the local marks (a-z) of the last 100 files. Be aware that if you tell Viminfo to save too many files, Vim can start slowing down. 1000 is a good number to have.
- `<50` tells Viminfo how many maximum lines are saved for each registers (50 in this case). If I yank 100 lines of text into register a (`"ay99j`) and close Vim, the next time I open Vim and paste from register a (`"ap`), Vim will only paste 50 lines max. If you don't give maximum line number, *all* lines will be saved. If you give it 0, nothing will be saved.
2020-11-14 20:48:48 +01:00
- `s10` sets a size limit (in kb) for a register. In this case, any register greater than 10kb size will be excluded.
- `h` disables highlighting (from `hlsearch`) when Vim starts.
There are other options that you can pass. To learn more, check out `:h 'viminfo'`.
2020-11-14 20:48:48 +01:00
## Using Views, Sessions, And Viminfo The Smart Way
2020-11-14 20:48:48 +01:00
Vim has View, Session, and Viminfo to take different level of your Vim environment snapshots. For micro projects, use Views. For larger projects, use Sessions. You should take your time to check out all the options that View, Session, and Viminfo offers.
2020-11-14 20:48:48 +01:00
Create your own View, Session, and Viminfo for your own editing style. If you ever need to use Vim outside of your computer, you can just load your settings and you will immediately feel at home!