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