Referencia rápida

Chuleta de Vimscript

Guía de referencia completa para Vimscript: variables, funciones, comandos personalizados, estructuras de datos, mapeos y sintaxis.

· Publicado

Vimscript es el lenguaje de scripting integrado para personalizar y extender el editor de texto Vim.

Primeros Pasos

let name = "John"
echo "Hello, " . name

Puedes guardar este código en un script (script.vim) y cargarlo con (:source script.vim), o ejecutar comandos en modo normal mediante :let y :echo.

Aprender Mediante Ejemplos

function! SuperTab()
  let l:part = strpart(getline('.'), col('.') - 2, 1)
  if (l:part =~ '^\W\?$')
    return "\<Tab>"
  else
    return "\<C-n>"
  endif
endfunction

imap <Tab> <C-R>=SuperTab()<CR>

Variables

Definición

let var = "hello"

Prefijos de Ámbito de Variables

let g:ack_options = '-s -H'    " g: global
let s:ack_program = 'ack'      " s: local (to script)
let l:foo = 'bar'              " l: local (to function)
let a:arg = 'baz'              " a: function argument

El prefijo s: también se utiliza para nombres de funciones locales al script. Consulta :help local-variables.

Otros Ámbitos

let w:foo = 'bar'    " w: window local
let b:state = 'on'   " b: buffer local
let t:state = 'off'  " t: tab page local
echo v:version       " v: vim internal variable
let @/ = ''          " @  register
echo $PATH           " $  environment variable

Opciones de Vim

echo 'tabstop is ' . &tabstop
if &insertmode
echo &g:option
echo &l:option

Antepón & a los nombres de opciones para leerlos o modificarlos en expresiones.

Operadores Aritméticos y de Cadenas

a + b             " Numbers only!
'hello ' . name   " String concatenation
let var -= 2
let var += 5
let var .= 'string'

Cadenas de Texto (Strings)

Sintaxis de Cadenas

let str = "String"
let str = "String with \n newline"

let literal = 'literal, no \ escaping'
let literal = 'that''s enough'

echo "result = " . res

Funciones de Cadenas

strlen(str)
len(str)
strchars(str)

split("one two three")       "=> ['one', 'two', 'three']
split("one.two.three", '.')  "=> ['one', 'two', 'three']

join(['a', 'b'], ',')        "=> 'a,b'

tolower('Hello')
toupper('Hello')

Funciones

Definición de Funciones

function! s:Initialize(cmd, args)
  echo "Command: " . a:cmd
  return 1
endfunction

Sobrescritura de Funciones

function! MyFunc()
  echo "Function defined or replaced"
endfunction

Usar function! (con !) reemplaza cualquier función previamente definida con el mismo nombre sin emitir error.

Espacios de Nombres y Carga Automática (Autoload)

function! myplugin#hello()
  " autoload/myplugin.vim
endfunction

Invocación de Funciones

call s:Initialize()
call s:Initialize("hello", 123)

Captura de Valores de Retorno

let result = s:Initialize()

Abortar en Caso de Error

function! MyFunction() abort
endfunction

Argumentos Variables (Variádicos)

function! Infect(...)
  echo a:0
  echo a:1
  echo a:2

  for item in a:000
    echon ' ' . item
  endfor
endfunction

call Infect('jake', 'bella')

Bucles y Control de Flujo

Bucles (Loops)

for s in list
  echo s
  continue
  break
endfor
while x < 5
  let x += 1
endwhile

Comandos Personalizados (Custom Commands)

Definición de Comandos

command! Save :set fo=want tw=80 nowrap

Los comandos de usuario deben comenzar con letra mayúscula. La exclamación ! permite reemplazar un comando existente.

Llamada a Funciones en Comandos

command! Save call <SID>Foo()

function! s:Foo()
endfunction

Argumentos de Comandos

command! -nargs=? Save call script#foo(<args>)
Especificación de Argumento Descripción
-nargs=0 0 argumentos (por defecto)
-nargs=1 Exactamente 1 argumento (puede contener espacios)
-nargs=? 0 o 1 argumento
-nargs=* 0 o más argumentos separados por espacio
-nargs=+ 1 o más argumentos separados por espacio

Condicionales

If / Elseif / Else

let char = getchar()
if char == "\<LeftMouse>"
elseif char == "\<RightMouse>"
else
endif

Evaluación Booleana (Truthiness)

if 1       "=> True
if 0       "=> False
if "1"     "=> True
if "456"   "=> True
if "xfz"   "=> False

Vimscript no tiene un tipo booleano independiente: 0 es falso y los enteros distintos de cero son verdaderos.

Operadores de Comparación

if 3 > 2
if a && b
if (a && b) || (c && d)
if !c

Sensibilidad a Mayúsculas en Cadenas

if name ==# 'John'     " case-sensitive
if name ==? 'John'     " case-insensitive
if name == 'John'      " &ignorecase

Comparación de Identidad

if a is b
if a isnot b

Comprueba si a y b hacen referencia a la misma instancia exacta en memoria.

Coincidencias con Expresiones Regulares

"hello" =~ 'xx*'
"hello" !~ 'xx*'
"hello" =~ '\v<\d+>'

\v activa la sintaxis 'very magic', facilitando caracteres especiales sin necesidad de escapar.

Sentencias en una Sola Línea

if empty(a:path) | return [] | endif
let status = a ? b : c

Usa | para encadenar múltiples sentencias en una única línea.

Estructuras de Datos

Listas (Lists)

let mylist = [1, "two", 3, "four"]

let first = mylist[0]
let last  = mylist[-1]

let second = get(mylist, 1)
let fallback = get(mylist, 10, "NONE")

Operaciones con Listas

len(mylist)
empty(mylist)

let sortedlist = sort(copy(mylist))

let shortlist = mylist[2:-1]
let shortlist = mylist[2:]
let single = mylist[2:2]

let longlist = mylist + [5, 6]
let mylist += [7, 8]
call add(mylist, 9)

Métodos Funcionales de Listas

call map(files, "bufname(v:val)")
call filter(files, 'v:val != ""')

Diccionarios (Dictionaries)

let colors = {
  \ "apple": "red",
  \ "banana": "yellow"
}

echo colors["apple"]
echo get(colors, "apple")

Operaciones con Diccionarios

call remove(colors, "apple")

if has_key(dict, 'foo')
if empty(dict)
let k = keys(dict)
let v = values(dict)
let n = len(dict)

echo max(dict)
echo min(dict)

call extend(s:fruits, { "cherry": "red" })
for key in keys(mydict)
  echo key . ': ' . mydict[key]
endfor

Los prefijos de ámbito (s:, g:, l:, b:) son accesibles como diccionarios:

let script_keys = keys(s:)

Números y Aritmética

let int = 1000
let hex = 0xff
let oct = 0755
let fl = 100.1
let sci = 5.4e4
3 / 2     "=> 1
3 / 2.0   "=> 1.5
sqrt(100)
floor(3.5)
ceil(3.3)
abs(-3.4)

Características Específicas de Vim

Ejecución Dinámica de Comandos (execute)

execute "vsplit"
execute "edit " . fnameescape(filename)

Pulsaciones en Modo Normal (normal)

normal G
normal! G

execute "normal! gg/foo\<cr>dd"

Expansión de Nombres de Archivo

echo expand("%")      " path/file.txt
echo expand("%:t")    " file.txt
echo expand("%:p:h")  " /home/user/path
echo expand("%:r")    " path/file
echo expand("%:e")    " txt

Control de Salida y Mensajes

silent g/pattern/p

echo 'Simple text'
echomsg 'Persistent text recorded in :messages'
echoerr 'Error message'

echohl WarningMsg | echomsg "=> Warning!" | echohl None

Opciones de Configuración

set number
set nonumber
set number!
set numberwidth=5
set guioptions+=e

Introspección y Detección de Funcionalidades

has("clipboard")
executable("python3")
globpath(&rtp, "syntax/c.vim")

exists("$ENV")
exists(":command")
exists("variable")
exists("+option")

Mapeo de Teclas (Key Mappings)

Modos

[nvixso](nore)map

Modificadores Comunes de Mapeo

Modificador (Flag) Significado
<buffer> Local únicamente al buffer actual
<silent> No mostrar el comando en la barra de estado
<nowait> Ejecutar inmediatamente sin esperar combinaciones más largas

Resaltado de Sintaxis y Ocultación (Conceal)

Grupos de Resaltado

hi Comment term=bold gui=bold ctermfg=4 guifg=#80a0ff
hi def link markdownH1 htmlH1

Detección de Tipos de Archivo

augroup filetypedetect
  au! BufNewFile,BufRead *.json setf javascript
augroup END

au Filetype markdown setlocal spell

Ocultación de Texto (Conceal)

set conceallevel=2
syn match newLine "<br>" conceal cchar=}
hi newLine guifg=green

Guardas de Inclusión

if exists('g:loaded_myplugin')
  finish
endif
let g:loaded_myplugin = 1

Temas relacionados