Ya quedó bien establecido que los plugins de Vim son en realidad scripts, programas escritos en el lenguaje que nos proporciona el editor: Vim script, que como cualquier lenguaje de programación, tiene mecanismos para definir el ámbito de las variables, y en esta ocasión te mostraré cómo es que trabaja con las variables globales, locales y argumentos dentro de una función.
Lo primero que hay que saber, dado que es una característica muy particular del lenguaje, es que el ámbito de una variable puede inferirse a partir de su nombre. Para tal efecto, se utilizan prefijos especiales.
Variables locales
Como ya hemos visto, el ámbito de toda variable definida dentro del cuerpo de una función es local a esta; sin embargo es posible agregarles el prefijo l:
para indicar explícitamente que ese es el alcance de la variable. Si decides utilizar este prefijo puedes evitar algunos problemas de colisión de nombres con variables definidas previamente por el editor, por lo tanto su uso es recomendado y se considera una buena práctica.
function Foo() let mi_variable = 'Hola mundo' echom mi_variable echom l:mi_variable endfunction
La función definida arriba, imprimirá el mismo mensaje dos veces:
:call Foo() Hola mundo Hola mundo
Además de las variables con prefijo l:
(el cual es opcional), tenemos otras que aunque locales, tienen un alcance amplio:
Prefijo | Local a… |
---|---|
b: |
el buffer actual |
w: |
la ventana (window) actual |
t: |
la pestaña (tab) actual |
s: |
el script actual |
Las variables locales a la ventana y pestaña actuales son borradas cuando estas se cierran, las variables locales al buffer actual, cuando este es limpiado o eliminado, por ejemplo, con el comando :bdelete
.
Vim tiene un variable especial predefinida para cada buffer: b:changedtick
, que guarda un contador de los cambios realizados hasta el momento en dicho buffer. Esta variable no puede ser modificada ni destruida por el usuario.
A deferencia de las anteriores, las variables locales al script actual, permanecen en memoria mientras dure la sesión y sus valores pueden ser recuperados la siguiente vez que dicho script sea cargado.
Argumentos de función
Considera la siguiente función:
function Saluda(nombre) echo "¡Hola" nombre . "!" endfunction
Aunque la sintaxis es correcta, al llamarla obtendremos un error como el siguiente:
:call Saluda($USER) Se ha detectado un error al procesar function Saluda: línea 1 E121: Variable sin definir: nombre E15: La expresión no es válida: nombre "!" Pulse INTRO o escriba una orden para continuar
Al parecer Vim está loco, al no reconocer la variable nombre
. El problema es que Vim script requiere que le indiquemos que nombre
es uno de los parámetros de la función; esto se hace mediante el prefijo a:
, de modo que esta versión de la rutina si funcionará:
function Saluda(nombre) echo "¡Hola" a:nombre . "!" endfunction
Y al llamarla obtendremos una salida como esta:
call Saluda('Juan') ¡Hola Juan!
Además de esto, las funciones en Vim pueden recibir hasta veinte argumentos extra si se utiliza el parámetro especial ...
, estos argumentos sin nombre son opcionales y se identifican por su posición, siendo el primero a:1
. Además de estos, existen a:0
que guarda la cantidad de parámetros adicionales recibidos y a:000
, una lista que contiene todos los argumentos adicionales que se le hayan pasado a la función. Esto quedará más claro con un ejemplo:
function Saluda(nombre, ...) echo "¡Hola" a:nombre "!" if a:0 > 0 echo 'Parece que vienes con alguien' for alguien in a:000 echo "¡Hola" alguien "!" endfor endif endfunction
Variables globales
Dentro de una función pueden crearse variables globales, simplemente agregando el prefijo g:
a su nombre. Como ilustración, observa la siguiente demostración:
En la demo podemos ver en acción un pequeño plugin llamado global.vim
, que define una función llamada CreaMensaje()
, nota como gracias al prefijo g:
es posible utilizar el mismo identificador para dos variables diferentes, una es local y la otra global.
Existe otro tipo de variables globales: las variables de Vim, y el prefijo que las distingue es v:
. Estas variables son definidas y mantenidas por el mismo editor, y no pueden ser modificadas por el usuario porque almacenan información inherente al estado del mismo. Algunos ejemplos de este tipo de variables son:
Variable | Almacena |
---|---|
v:errmsg |
El último mensaje de error |
v:lang |
La configuración de idioma del sistema |
v:exception |
El valor de la última excepción atrapada |
Si quieres consultar la lista completa de estas variables, puedes consultar la sección vim-variables
de la ayuda de Vim.
¡Y listo!
A partir de ahora ya puedes manipular las variables y argumentos de una función. Espero que esta nota te sirva para construir tus propios plugins. En la siguiente entrega terminaré de explicar los demás prefijos. ¡Hasta entonces!