Aprende-Vim/ch26_vimscript_variables_scopes.md

263 lines
8.3 KiB
Markdown
Raw Normal View History

2021-04-16 19:15:13 +02:00
# Capítulo 26. Variables de Vimscript y su ámbito
2021-04-16 19:15:13 +02:00
Antes de adentrarnos en las funciones de Vimscript, vamos a aprender las diferentes fuentes y ámbitos en los que operan las variables en Vim.
2021-04-14 20:44:15 +02:00
## Variables mutables e inmutables
2021-04-14 20:44:15 +02:00
Puedes asignar un valor a una variable en Vim con `let`:
```
2021-04-14 20:44:15 +02:00
let tortitas = "tortitas"
```
2021-04-14 20:44:15 +02:00
Después puedes llamar a la variable en cualquier momento.
```
2021-04-14 20:44:15 +02:00
echo tortitas
" devuelve "tortitas"
```
2021-04-14 20:44:15 +02:00
`let` es mutable, esto significa que puedes cambiar el valor de la variable en cualquier momento en el futuro.
```
2021-04-14 20:44:15 +02:00
let tortitas = "tortitas"
let tortitas = "no gofres"
2021-04-14 20:44:15 +02:00
echo tortitas
" devuelve "no gofres"
```
2021-04-14 20:44:15 +02:00
Ten en cuenta que cuando quieres cambiar el valor de una variable, necesitas utilizar `let`.
```
2021-04-14 20:44:15 +02:00
let bebida = "leche"
2021-04-14 20:44:15 +02:00
bebida = "zumo de naranja"
" lanza un error
```
2021-04-14 20:44:15 +02:00
Puedes definir variables inmutables con `const`. Al ser inmutables, una vez que a la variable se le asigna un valor, ya no puedes reasignarle un valor diferente más adelante.
```
2021-04-14 20:44:15 +02:00
const gofres = "gofres"
const gofres = "tortitas"
" lanza un error
```
2021-04-15 09:00:36 +02:00
## Fuentes de variable
2021-04-15 09:00:36 +02:00
Hay tres fuentes de las que obtener los valores de variables: variables de entorno, variables de opciones y variables de registro.
2021-04-15 09:00:36 +02:00
### Variables de entorno
2021-04-15 09:00:36 +02:00
Vim puede acceder a las variables de entorno de tu terminal. Por ejemplo, si tienes la variable `SHELL` de entorno en tu terminal, puedes acceder a ella desde Vim mediante:
```
echo $SHELL
2021-04-15 09:00:36 +02:00
" devuelve el valor de $SHELL. E mi caso devuelve /bin/bash
```
2021-04-15 09:00:36 +02:00
### Variables de opciones
2021-04-15 09:00:36 +02:00
Puedes acceder a las opciones de Vim con `&` (estos son ajustes a los que accedes con `set`).
2021-04-15 09:00:36 +02:00
Por ejemplo, para ver qué fondo utiliza Vim, puedes ejecutar:
```
echo &background
2021-04-15 09:00:36 +02:00
" devuelve un valor que puede ser "light" o "dark" (claro u oscuro)
```
2021-04-15 09:00:36 +02:00
De manera alternativa, siempre puedes ejecutar `set background?` para ver el valor de la opción `background`.
2021-04-15 09:00:36 +02:00
### Variables de registro
2021-04-15 09:00:36 +02:00
Puedes acceder a los registros de Vim (ver el capítulo 08) mediante `@`.
2021-04-15 09:00:36 +02:00
Supongamos que el valor "chocolate" está ya guardado en el registro a. Para acceder a el, puedes utilizar `@a`. También puedes actualizarlo con `let`.
```
echo @a
" devuelve chocolate
let @a .= " donut"
echo @a
" devuelve "chocolate donut"
```
2021-04-15 09:00:36 +02:00
Ahora cuando pegues el contenido del registro a (`"ap`), este mostrará el contenido que es "chocolate donut". El operador `.=` une dos cadenas. La expresión `let @a .= " donut"` es lo mismo que `let @a = @a . " donut"`
2021-04-16 19:15:13 +02:00
## Ámbito de las variables
2021-04-16 19:15:13 +02:00
Hay 9 diferentes ámbitos en los que pueden operar las variables en Vim. Puedes reconocerlos porque les antecede una letra:
```
2021-04-16 19:15:13 +02:00
g: Variable global
{nothing} Variable global
b: Variable de buffer local
w: Variable de ventana local
t: Variable de pestaña local
s: Variable procedente de Vimscript
l: Variable de función local
a: Variable de parámetro de función formal
v: Variable propia de Vim
```
2021-04-16 19:21:30 +02:00
### Variable global
2021-04-16 19:21:30 +02:00
Cuando estás declarando una variable "normal":
```
2021-04-16 19:21:30 +02:00
let tortita = "tortita"
```
2021-04-16 19:21:30 +02:00
`tortita` es de hecho una variable global. Cuando defines una variable global, puedes llamarla desde cualquier lugar.
2021-04-16 19:21:30 +02:00
Al anteponer `g:` a la declaración de una variable, también estás creando una variable global:
```
2021-04-16 19:21:30 +02:00
let g:gofre = "gofre"
```
2021-04-16 19:21:30 +02:00
En este caso tanto `pancake` como `g:waffle` tienen el mismo ámbito de trabajo, son globales. Puedes llamar a cada una de ellas con o sin `g:`.
```
2021-04-16 19:21:30 +02:00
echo tortita
" devuelve "tortita"
2021-04-16 19:21:30 +02:00
echo g:tortita
" devuelve "tortita"
2021-04-16 19:21:30 +02:00
echo gofre
" devuelve "gofre"
2021-04-16 19:21:30 +02:00
echo g:gofre
" devuelve "gofre"
```
2021-04-16 19:33:56 +02:00
### Variable de buffer
2021-04-16 19:33:56 +02:00
Una variable precedida de `b:` es una variable de *buffer*. Una variable de *buffer* es una variable que es local al *buffer* actual (ver capítulo 02). Si tienes múltiples *buffers* abiertos, cada *buffer* tendrá su propia lista separada de variables de *buffer*.
2021-04-16 19:33:56 +02:00
En el *buffer* 1:
```
const b:donut = "chocolate donut"
```
2021-04-16 19:33:56 +02:00
En el *buffer* 2:
```
2021-04-16 19:33:56 +02:00
const b:donut = "frambuesa donut"
```
2021-04-16 19:33:56 +02:00
Si ejecutas `echo b:donut` en el *buffer* 1, mostrará "chocolate donut". Si ejecutas lo mismo pero ahora en el *buffer* 2, en este caso se mostrará "frambuesa donut".
2021-04-16 19:38:19 +02:00
Como nota complementaria, Vim tiene una variable de *buffer* "especial" `b:changedtick` que guarda el número acumulado de todos los cambios realizados en el *buffer* actual.
2021-04-16 19:33:56 +02:00
1. Ejecuta `echo b:changedtick` y toma nota del número que devuelve..
2. Haz cambios en Vim.
3. Vuelve a ejecutar `echo b:changedtick` y comprueba el número que devuelve ahora.
2021-04-16 19:38:19 +02:00
### Variable de ventana
2021-04-16 19:38:19 +02:00
Una variable precedida con `w:` es una variable cuyo ámbito de trabajo es la ventana. Existe solo en esa ventana en la que se ha declarado.
2021-04-16 19:38:19 +02:00
En la ventana 1:
```
const w:donut = "chocolate donut"
```
2021-04-16 19:38:19 +02:00
En la ventana 2:
```
2021-04-16 19:38:19 +02:00
const w:donut = "frambuesa donut"
```
2021-04-16 19:38:19 +02:00
En cada ventana podrás ejecutar `echo w:donut` y verás que en cada una devolverá valores únicos.
2021-04-16 19:40:41 +02:00
### Variable de pestaña
2021-04-16 19:40:41 +02:00
Una variable precdida de `t:` es una variable propia de esa pestaña. Solo existe en esa pestaña.
2021-04-16 19:40:41 +02:00
En la pestaña 1:
```
const t:donut = "chocolate donut"
```
2021-04-16 19:40:41 +02:00
En la pestaña 2:
```
2021-04-16 19:40:41 +02:00
const t:donut = "azucarado donut"
```
2021-04-16 19:40:41 +02:00
En cada pestaña, podrás ejecutar `echo t:donut` para obtener valores distintos en cada una de ella.
2021-04-16 19:52:54 +02:00
### Variable de script
2021-04-16 19:52:54 +02:00
Una variable precedida de `s:` es una variable de script. A estas variables solo se puede acceder desde dentro de ese script.
2021-04-16 19:52:54 +02:00
Si tienes un archivo llamado `docena.vim` y dentro del archivo tienes lo siguiente:
```
2021-04-16 19:52:54 +02:00
let s:docena = 12
function Consume()
2021-04-16 19:52:54 +02:00
let s:docena -= 1
echo s:docena " quedan"
endfunction
```
2021-04-16 19:52:54 +02:00
Haz que Vim tenga en cuenta este archivo mediante `:source dozen.vim`. Ahora llama a la función `Consume`:
```
:call Consume()
2021-04-16 19:52:54 +02:00
" devuelve "11 quedan"
:call Consume()
2021-04-16 19:52:54 +02:00
" devuelve "10 quedan"
:echo s:dozen
" Undefined variable error
```
2021-04-16 19:52:54 +02:00
Cuando llamas a la función `Consume`, ves que se decrementa el valor de la variable `s:dozen` tal como se espera. Cuando tratas de obtener directamente el valor de `s:dozen`, Vim no la encontrará porque la estás invocando fuera de su ámbito. `s:dozen` solo es accesible desde dentro de `dozen.vim`.
2021-04-16 19:52:54 +02:00
Cada vez que vuelvas a hacer que Vim tenga en cuenta el archivo `dozen.vim` con el comando `source`, Vim resetea el contado de `s:dozen`. Si estás en la mitad de la acción de decrementar el valor de `s:dozen` y ejecutas `:source dozen.vim`, el contador volverá a poner su valor a 12. Esto puede ser un problema para los usuarios menos avezados. Para solucionar este problema, vamos a modificar el código:
```
2021-04-16 19:52:54 +02:00
if !exists("s:docena")
let s:docena = 12
endif
function Consume()
2021-04-16 19:52:54 +02:00
let s:docena -= 1
echo s:docena
endfunction
```
2021-04-16 19:52:54 +02:00
Ahora cuando volvemos a ejecutar el comando `source` con el archivo `dozen.vim` mientras estemos a la mitad del proceso de decremento de la variable, Vim lee `!exists("s:docena")`, encuentra que esto es verdad y no resetea el valor de nuevo a 12 manteniendo el valor que tenía.
2021-04-17 19:40:14 +02:00
### Variables de función local y función formal de parámetro
2021-04-17 19:40:14 +02:00
Tanto la variable de función local (`l:`) como la variable de función formal (`a:`) serán tratadas en el próximo capítulo.
2021-04-17 19:40:14 +02:00
### Variables propias de Vim
2021-04-17 19:40:14 +02:00
Una variable precedida con `v:` es una variable especial propia de Vim. No puedes definir estas variables, solo utilizarlas. Ya hemos visto algunas de estas.
- `v:version` muestra la versión de Vim que estás utilizando.
- `v:key` contiene el valor del elemento actual cuando interactuas con un diccionario.
- `v:val` contiene el valor del elemento actual cuando ejecutas una operación `map()` o `filter()`.
- `v:true`, `v:false`, `v:null` y `v:none` son tipos de datos especiales.
2021-04-17 19:40:14 +02:00
Hay otras variables. Para consultar una lista de todas las variables propias de Vim, echa un vistazo a `:h vim-variable` o `:h v:`.
2021-04-17 19:47:07 +02:00
## Utilizando los ámbitos de las variables de Vim de la manera más inteligente
2021-04-17 19:47:07 +02:00
Ser capaz de acceder rápidamente a variables de entorno, opción y registros te da una mayor flexibilidad para personalizar tu editor y tu entorno de la terminal. También has aprendido que Vim tiene 9 ámbitos diferentes para las variables, cada una existe bajo ciertas condiciones. Puedes utilizar esto en tu beneficio usando estas variables únicas para usarlas en tu programa.
2021-04-17 19:47:07 +02:00
Has llegado muy lejos. Has aprendido sobre los tipos de datos, el significado de las combinaciones y el ámbito de las variables. Solo queda una cosa: funciones.