03. Vim: ámbito de variables

Publicado por

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.

Variable local a script
Variable local a script

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:

Variable local contra variable global
Variable local contra variable global

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!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *