Tabla de Contenidos
Vim
Editor de texto. Versión mejorada del editor de texto Vi, presente en todos los sistemas UNIX.
Advertencia
Antes de comenzar con Vim hay que tener en cuenta varios aspectos que pueden desconcertar o hacer complicado su uso inicial:
- La forma de salir del editor no es evidente (
:q) - Tener que teclear
:wpara guardar no es “cómodo” - No existe autocompletado
- No se utiliza el portapapeles del sistema
- El ratón no funciona
- La gestión de múltiples ficheros es “complicada”.
Consejos
- Ejecutar
vimtutorhasta comprender las bases de vim - Seguir el manual de vim dentro del propio vim con
:help user-manual - Echar un ojo a los antipatrones o acciones ineficientes, buscar mejoras, practicar y repetir de nuevo
Modos
Vim es un editor modal porque tiene diferentes modos de funcionamiento:
| Modo | Tecla | Descripción |
|---|---|---|
| Normal | Esc | navegar por los ficheros |
| Visual caracter | v | |
| Visual línea | V | |
| Visual bloque | Ctrl+v | |
| Insertar | I | |
| Seleccionar línea | ||
| Seleccionar bloque | ||
| Comando | : | Línea de comando de Vim |
| Reemplazar | : |
Para pasar de un modo a otro siempre hay que pasar primero por el modo normal (Esc)
El modo de funcionamiento por defecto es el normal.
Modo normal
Comandos
En el modo normal, podemos acceder al modo comando escribiendo :
:terminal: abre un terminal:split: divide el fichero actual en dos (también sirve la Ctrl+w s para división horizontal o Ctrl+w v para división vertical):tabe: nueva pestaña- Ctrl + f: búsqueda en el historial de comandos (también podemos lanzarlo con
q:). - Ctrl + a: incrementar el número bajo el cursor.
- Ctrl + x: disminuir el número bajo el cursor.
En cuando en el modo normal escribimos algo que empiece por dos puntos (:), se trata de comandos de ex. Ex es un editor de texto en el que se apoya Vim para ciertas acciones. A su vez, ex orignalmente era una extensión de otro editor más simple llamado ed.
Navegación
Para desplazarnos por el buffer (fichero abierto):
| Acción | Tecla |
|---|---|
| Subir | k |
| Bajar | j |
| Moverse a la derecha | l |
| Moverse a la izquierda | h |
| Avanzar por palabras | w |
| Retroceder por palabras | b |
| Moverse al final de la palabra | e |
| Moverse al principio de la línea | 0 |
| Moverse al final de la línea | $ |
| Moverse al primer caracter de la línea | ^ |
| Desplazamiento hacia arriba | Ctrl+U |
| Desplazamiento hacia abajo | Ctrl+D |
| Ir al comienzo del buffer | gg |
| Ir al final del buffer | G |
| Moverse a la parte inferior | L |
| Moverse a la parte superior | H |
| Moverse a la parte central | M |
| Moverse a la palabra que contenga X | fX |
| Moverse a la anterior palabra que contenga X | FX |
| Moverse entre grupos (llaves, paréntesis…) | % |
| Desplaza la pantalla para que el cursor quede en la parte alta de la pantalla | zt |
| Desplaza la pantalla para que el cursor quede en el centro de la pantalla | zz |
| Desplaza la pantalla para que el cursor quede en la parte baja de la pantalla | zb |
Las flechas también sirven para desplazarse.
El ordenador donde Bill Joy desarrolló originalmente Vi (Vim se basa en Vi) fue un ADM-3A cuyo teclado era así:
Por eso las teclas de desplazamiento coinciden con las teclas hjkl
Búsqueda
| Acción | Combinación |
|---|---|
| Buscar | / |
Buscar patata | /patata |
| Moverse a la siguiente coincidencia | n |
| Moverse a la anterior coincidencia | N |
| Buscar la siguiente aparición del texto sobre el cursor | * |
| Buscar la anterior aparición del texto sobre el cursor | # |
Si tenemos activado el resalte de las coincidencias de la búsqueda, se quedarán marcadas las palabras coincidentes incluso cuando sigamos editando. Para quitar este resaltado, empleamos el comando :noh (es la forma abreviada de :nohlsearch)
Edición
| Acción | Combinación |
|---|---|
| Deshacer | u |
| Rehacer | Ctrl+r |
| Borrar la palabra sobre la que está el cursor | dw |
| Borrar desde donde está el cursor hasta el final de la palabra | de |
| Borrar línea | dd |
| Borrar línea y entrar en modo insertar | cc |
| Borrar todo lo que hay entre comillas y entrar en modo insertar | ci" |
| Borrar todo lo que hay entre paréntesis y entrar en modo insertar | ci( |
| Copiar una línea | yy |
| Copiar una palabra | yw |
| Pegar | p |
Modificar/eliminar lo que haya entre <> | ci< / di< |
Modificar/eliminar lo que haya entre [] | ci[ / di[ |
Modificar/eliminar <> y lo que haya dentro | ca< / da< |
Modificar/eliminar [] y lo que haya dentro | ca[ / da[ |
| Repetir último comando de edición | . |
| Convertir a minúsculas la línea actual | guu |
| Convertir a minúsculas la palabra actual | guw |
| Convertir a mayúsculas la línea actual | gUU |
| Convertir a mayúsculas la palabra actual | gUw |
| Alternar mayúsculas y minúsculas un carácter | ~ |
Los comandos de borrar, reemplazar, copiar y pegar aceptan un movimiento como argumento.
Modo visual
Permite seleccionar fragmentos de texto y luego copiarlos, cortarlos o pegarlos con los comandos de edición del modo normal.
| Acción | Combinación |
|---|---|
| Seleccionar caracteres | v |
| Seleccionar líneas | V |
| Seleccionar bloques | Ctrl+V |
| Alternar mayúsculas/minúsculas | ~ |
Text-objects
Los objetos de texto son como regiones de texto que pueden ser manipuladas como si estuviésemos en el modo visual.
Un objeto de texto muy típico es w, que sirve para seleccionar palabras. Con dw borraríamos una palabra.
| Teclas | Descripción |
|---|---|
i( | Selecciona lo que haya entre paréntesis |
i{ | Selecciona lo que haya entre llaves |
it | Selecciona lo que haya entre etiquetas |
Y entonces e puede combiar con operaciones de modificación, copia y borrado:
| Teclas | Descripción |
|---|---|
ci( | Elimina lo que hay dentro de los paréntesis y entra en modo inserción |
di( | Elimina lo que hay dentro de los paréntesis |
Marcadores
Podemos delimitar zonas del fichero para luego poder acceder rápido a ellas. Usando el comando m<CARACTER> añadimos un marcador en la parte del texto en la que estemos. Por ejemlo, para el marcador k haríamos mk. Para ir a ese marcador, escribiríamos 'k.
Ventanas
Todo archivo que se abre con Vim se almacena en un buffer (en memoria). En Vim, una ventana (window) es la visualización, una representación gráfica de un buffer.
| Acción | Combinación / Instrucción |
|---|---|
| Moverse a la ventana superior | Ctrl+w k / Ctrl+w ↑ |
| Moverse a la ventana inferior | Ctrl+w j / Ctrl+w ↓ |
| Moverse a la ventana de la derecha | Ctrl+w l / Ctrl+w → |
| Moverse a la ventana de la izquierda | Ctrl+w h / Ctrl+w ← |
| Alternar entre ventanas abiertas | Ctrl+ww / Ctrl+w w |
| Aumentar anchura ventana (división horizontal) | Ctrl+w + |
| Reducir anchura ventana (división horizontal) | Ctrl+w - |
| Aumentar anchura ventana (división vertical) | Ctrl+w > |
| Reducir anchura ventana (división vertical) | Ctrl+w < |
| Todas las ventanas del mismo tamaño | Ctrl+w = |
| Pasar de una división vertical a una horizontal | Ctrl+w J |
| Pasar de una división horizontal a una vertical | Ctrl+w H / Ctrl+w L |
| Cerrar todas la ventanas y salir | :qall |
| Dividir la ventana y abrir un fichero en ella | :split <fichero> |
Si queremos abrir dos ficheros en dos ventanas separadas horizontalmente:
vim -o fichero1 fichero2
Si queremos abrir dos ficheros en dos ventanas separadas verticalmente:
vim -O fichero1 fichero2
Buffers
Los buffers se refieren a cualquier fichero cargado en Vim.
| Acción | Combinación |
|---|---|
| Siguiente buffer | :bn |
| Anterior buffer | :bp |
| Quitar buffer | :bd |
Registros
Cuando copiamos y cortamos texto, se guarda en registros. Podemos coger lo que se haya metido en los registros más tarde
Para ver cómo se llaman los registros y qué hay en ellos:
:reg
Si queremos pegar lo que hay en el registro "5:
"5p
Pestañas
| Acción | Combinación |
|---|---|
| Siguiente pestaña | gt |
| Anterior pestaña | gT |
| Ir a pestaña N | ngt |
| Abrir un fichero en una nueva pestaña | :tabe <fichero> / :tabedit <fichero> |
| Reorganizar los buffers abiertos en pestañas | :tab sball |
Atajos Navegación
Con las siguientes asociaciones en el fichero vimrc, podremos movernos entre las pestañas con la tecla “leader” y el número de posición de la pestaña, además de abrir una pestaña nueva con Ctrl + c:
noremap <leader>1 1gt noremap <leader>2 2gt noremap <leader>3 3gt noremap <leader>4 4gt noremap <leader>5 5gt noremap <leader>6 6gt noremap <leader>7 7gt noremap <leader>8 8gt noremap <leader>9 9gt noremap <leader>0 :tablast<cr> nnoremap <C-t> :tabnew<CR>
Tecla leader
<leader> Es una tecla que luego se empleará para crear atajos de teclado personalizados.
let mapleader = " "
En el ejemplo anterior estaríamos asociando la tecla leader al espacio.
Remap
Modo que queramos remap (asociación de teclas), luego
nnoremap <leader>boo :
n: modo normal.i: modo inserción.nore: no recursive execution.map: “mapea”.
Auto comandos
Configuración
Para saber dónde busca los ficheros de configuración Vim escribimos :version y nos fijamos en:
system vimrc file: "$VIM/vimrc"
user vimrc file: "$HOME/.vimrc"
2nd user vimrc file: "~/.vim/vimrc"
user exrc file: "$HOME/.exrc"
defaults file: "$VIMRUNTIME/defaults.vim"
fall-back for $VIM: "/usr/share/vim"
Esos son los ficheros donde Vim buscará vimrc, no quiere decir que tengan que existir. Si no tenemos un fichero .vimrc creado, Vim cargará $VIMRUNTIME/defaults.vim que siempre existirá en el sistema.
Si hacemos:
:echo $MYVIMRC
Veremos la ruta del vimrc que está usando Vim en ese momento. Si aparece vacío es que no está utilizando ninguno definido por el usuario.
Opciones
Para saber si una opción está activada y el valor que tiene le añadimos una interrogación:
:set nombreopcion?
Por ejemplo:
:set smartindent?
Si está activada, veremos smartindent. En caso contrario, pondrá nosmartindent
Si queremos, además de ver el valor de la opción, ver dónde está definida, usremos verbose:
:verbose set mouse?
Podemos ver el estado de todas las opciones con:
:set all
Si tenemos dudas y queremos dejar una opción con su valor por defecto:
:set opcion&
Para alternar los valores de las opciones booleanas, usamos !:
:set number!
Vim comprobará en qué estado se encuentra la opción, y lo cambiará al otro estado posible. Por ejemplo, si number está activada (number), la desactivará poniendo nonumber.
Esquemas de color
- onedark.vim: tema inspirado en One Dark del editor Atom.
Diapositivas sobre la creación de un esquema de colores en Vim.
vimrc
Fichero de configuración.
" No intentar ser compatible con vi set nocompatible " Mostrar la línea de estado set laststatus=2 " Número de líneas que se moverán con el cursor al desplazarse verticalmente set scrolloff=7 " set so=7 " Habilitar resaltado de sintaxis (no necesario si filetype plugin on) " syntax on colorscheme jellybeans set background=dark " Deshabilitar backup set nobackup set nowb set noswapfile " Configuración del sangrado filetype plugin on filetype indent on " Resaltar resultados de búsqueda set hlsearch " Búsqueda incrementarl (busar a medida que se va escribiendo) set incsearch " Deshabilitar sonidos de error set noerrorbells set novisualbell set t_vb= set tm=500 " Recargar fichero cuando se haya cambiado desde fuera set autoread au FocusGained,BufEnter * checktime " Usar espacios en lugar de tabulaciones set expandtab " 1 tabulador = 4 espacios set shiftwidth=4 set tabstop=4 " Mostrar número de línea set number " Mostrar número de línea relativo set relativenumber set ai "Auto indent set si "Smart indent set wrap "Wrap lines " Muestra un menú para el autocompletado set wildmenu " Recordar la última posición del cursor al abrir el documento if has("autocmd") au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif endif " Posibilidad de (des)hacer aunque se haya cerrado Vim o apagado el PC " Debe existir el directorio definido en 'undodir' if has('persistent_undo') "verificar si está soportada la opción set undodir=$HOME/.vim/undodir "directorio donde se almacenarán los ficheros para deshacer set undofile "habilita la característica endif
Utilidades
Mostrar fin de línea y retornos de carro
:set list
Mostrará los espacios en blanco:
$: fin de línea
Para mostrar retornos de carro, hay que abrir el fichero con la opción -b:
vim -b fichero
Los retornos de carro se mostrarán con ^M (solo en ficheros que no han sido creados en formato Unix)
Unix usa 0xA como caracter de nueva línea. Windows usa una combinación de dos caracteres: 0xD 0xA. 0xD es el caracter de retorno de carro. ^M es cómo Vim muestra 0xD (0x0D = 13, M es la letra número 13 en el alfabeto inglés).
Para eliminar los caracteres ^M:
:%s/^M//g
^M se escribe manteniendo pulsada la tecla Ctrl y escribiendo v seguida de m, y luego soltando Ctrl. Esto a veces se abrevia como ^V^M
Para conversiones entre ficheros creados en Windows a formato Unix existe la utilidad dos2unix. Si queremos hacer a la inversa, está la utilidad unix2dos
Insertar caracteres especiales
Los dígrafos se usan para escribir caracteres que normalmente no se pueden introducir por teclado.
Los dígrafos se escriben con Ctrl + k, y dos caracteres del dígrafo.
Por ejemplo, para poner el símbolo €, sería Ctrl + k, Eu
Para ver una lista de dígrafos dentro de Vim: :digraphs
Autocompletado
En Vim hay varios comandos para completar parte de una palabra o línea que ya ha sido escrita. Esto es útil cuando estamos escribiendo palabras complicadas.
La función más interesante para el autocompletado en Vim es omni completion.
Esta característica proporciona autocompletado. Cuando se invoca, el texto antes del cursor se inspecciona para adivinar qué vendrá después. Un menú emergente mostrará posibles opciones. Es una característica similar al IntelliSense de Visual Studio.
Para usarlo, mientras estamos en el modo de inserción, pulsaremos Ctrl+x y Ctrl+o. Si hay coincidencias, se mostrará un seleccionable por el que podremos navegaro con los cursores o con las combinaciones Ctrl+n y Ctrl+p
Más información sobre esto en :help ins-completion
Ejecutar comandos desde Vim
:!comando
Por ejemplo:
:!date
Salir a la shell
Si mientras editamos un fichero, necesitamos ejecutar algunos comandos, podemos usar:
:shell
Con esto abandonaremos temporalmente Vim y se nos presentará una terminal. Cuando terminemos, ejecutamos exit y regresaremos a Vim.
Podemos usar la versión abreviada para ahorrarnos unos caracteres: :sh
Sangrar texto
- >>: Sangra una línea
- <<: quita la sangría de una línea
Si tenemos seleccionada más de una línea, se puede aplicar sangría al texto seleccionado con > o quitarla con <. Este comando acepta motion:
3>
Hará una sangría de 3 tabulaciones.
Sangrar automáticamente un fichero
gg=G
= es el comando para sangrar. Aquí lo combinamos con gg que nos lleva al principio del fichero y G que nos mueve hasta el final del fichero. Por lo tanto, sangraría todas las líneas del fichero.
Quitar sangría de un fichero
Si queremos dejar todo alineado a la izquierda, sin que haya espacios antes de cada línea:
:%left
Si solo queremos hacerlo para un bloque, lo seleccionamos con V y luego:
:left
Eliminar todas las líneas en blanco de un fichero
:g/^\s*$/d
Ordenar palabras o números
Para ordenar las líneas alfabética y/o numéricamente, seleccionamos las líneas desadas y luego utilizamos el comando :sort.
Pegar texto copiado en modo inserción
Si hemos copiado texto (y) y estamos en modo inserción, podemos pegarlo con la combinación Ctrl + r 0
Borrar en modo inserción
Hay varios atajos de teclado para borrar mientras que estamos en el modo inserción:
- Ctrl + h: borra el carácter anterior (igual que si usáramos la tecla Retroceso)
- Ctrl + w: borra la palabra anterior
- Ctrl + u: borra la línea por detrás del cursor
En realidad, podríamos ejecutar comandos del modo normal sin salir del modo inserción mediante la combinación Ctrl + o seguido del comando
Borrar todo el texto
:%d
Insertar un texto delante de cada línea
Si queremos añadir el caracter # en todas las líneas desde la 1 hasta la 10:
:1,10s/^/#
Podemos también utilizar el modo visual de bloque para elegir solo el primer caracter de cada línea y luego pulsar i para entrar en modo insertar, escribimos lo que queramos y al pulsar Esc se habrá introducido ese texto en todas las líneas.
Abreviaturas
Si tenemos algún texto que se suela repetir y queremos ahorrarnos teclas, podemos definir una serie de abreviaturas:
:ab abreviatura esto es lo que se escribirá en su lugar
De esta manera, en el modo inserción, tras escribir abreviatura seguido de un espacio o signo de puntuación, Vim lo sustituirá automáticamente por esto es lo que se escribirá en su lugar
Podemos listar las abreviaturas que tenemos definidas con:
:ab
Si queremos eliminar una abreviatura:
:una abreviatura
Para eliminarlas todas:
:abclear
Escribir la salida de comandos
Si queremos ejecutar algún comando Linux desde Vim y que su salida se incluya en el fichero que estamos editando:
:r !comando
Por ejemplo, para meter el calendario del mes actual:
:r !cal
Acceder a man desde Vim
Si en el fichero que estamos viendo hay comandos de linux y queremos abrir man para consultarlo, estando en modo Normal, nos situamos sobre el comando y pulsamos K
Plegar bloques de código
Para ocultar ciertas funciones o bloques de código, podemos seleccionarla y luego:
:fold
A partir de ese momento:
zo: muestra el bloquezc: pliega el bloque
Modificar espacios en blanco por espacios
Si hemos decidido sustituir por espacios cada pulsación del tabulador, los caracteres de tabulación insertados hasta entonces continuarán, así que para reemplazarlos todos por espacios:
:retab
Deshabilitar sangría al pegar código
Si queremos deshabilitar temporalmente la sangría automática cuando vamos a pegar un bloque de código:
:set paste
Pegamos y volvemos a dejar todo como antes:
:set nopaste
Modificar la detección del tipo de fichero
Vim puede detectar el tipo de fichero que se está editando por la extensión del fichero. Para activar esta característica hay que ejecutar el comando filetype on. Si un fichero contiene diferentes lenguajes, Vim se regirá por el primer lenguaje que detecte y se aplicarán las reglas correspondientes. Es bastante típico que en un fichero .php se mezcle código PHP, HTML y JavaScript. Si queremos arreglar la sangría de ciertos bloques, podemos ir modificándolo sobre la marcha.
Por ejemplo, si hemos abierto un fichero PHP, podemos hacer lo siguiente para aplicar las reglas de HTML:
:set filetype=html
La versión abreviada es set ft=html
Si elegimos código HTML y luego ejecutamos el comando =, Vim aplicará la sangría adecuada para HTML.
Podemos luego volver al PHP con:
:set filetype=php
Si vamos a estar saltando continuamente entre lenguajes, es útil crear una asociación de teclas en el vimrc:
map <leader>h :set ft=html<CR> map <leader>p :set ft=php<CR>
Soporte ratón
Para habilitar el uso del ratón en Vim:
set mouse=a
La opción a habilita el uso del ratón en Vim en todos los modos:
- Normal
- Visual
- Inserción
- Línea de comandos
Edición
Buscar y reemplazar
Para reemplazar todas las apariciones de foo y sustituirlas por bar:
:%s/foo/bar/g
Si queremos que Vim solicite confirmación antes de hacer el cambio, añadimos c:
:%s/foo/bar/gc
Si queremos que ignore mayúsculas y minúsculas (es decir, que pueda sustituirse tanto Foo, como foo, como fOO..), añadimos i:
:%s/foo/bar/gi
Si queremos que la sustitución se haga solo por la palabra entera y no si empieza, contiene o termina en ella:
:%s/\<foo\>/bar/g
De esa manera sustituirá foo, pero no foobar o barfoo ya que foo no aparece aislada.
Si solo queremos hacer el cambio en la línea actual:
:s/foo/bar/g
Mostrar valores hexadecimales, ascci y octal de carácter
En modo normal:
| Comando | Descripción |
|---|---|
ga | Mostrar valor ascii, hexadecimal y octal del carácter bajo el cursor |
g8 | Mostrar valor ascii, hexadecimal y octal del carácter UTF-8 bajo el cursor |
En la línea de estado de Vim (abajo del todo) se mostrará algo como:
<A> 65, Hex 41, Octal 101
Donde A es el caracter bajo el cursor, 65 su valor ASCII, 41 en hexadecimal y 101 en octal.
Abrir fichero a partir de la ruta
Si un fichero que tenemos abierto contiene un nombre de archivo (con su ruta), Vim lo puede abrir con la secuencia:
gf
Navegador de archivos
Con Vim se incluye el plugin netrw.
Si ejecutamos vim pasándole como argumento un directorio, se abrirá netrw mostrándonos la lista de ficheros y directorios contenida en dicho directorio.
Si queremos lanzar netwr desde Vim:
:Explore: abrenetrwen la ventana actual.:Sexplore: abrenetrwen un panel horizontal:Vexplore: abrenetrwen un panel vertical
Para abrir un fichero en una división horizontal también se puede lograr con la abreviatura :Sex
Recursos:
Otro plugin que hace una función similar a netrw y que es muy popular es NERDTree
Plugins
Gestor de plugin minimalista: https://github.com/junegunn/vim-plug. Se instala:
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
Ejemplo de uso en el fichero .vimrc:
call plug#begin(expand('~/.vim/plugged')) "***************************************************************************** "" Plug install packages "***************************************************************************** Plug 'tpope/vim-commentary' Plug 'tpope/vim-sleuth' Plug 'scrooloose/nerdtree' Plug 'jiangmiao/auto-pairs' Plug 'vim-airline/vim-airline' Plug 'vim-airline/vim-airline-themes' Plug 'Yggdroot/indentLine' Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } Plug 'junegunn/fzf.vim' Plug 'mattn/emmet-vim' Plug 'ervandew/supertab' Plug 'justinmk/vim-sneak' call plug#end()
commentary.vim
Permite comentar o descomentar
gc (des)comenta una selección
The NERDTree
Explorador de archivos
Auto Pairs
Inserta o elimina comillas, paréntesis o corchetes a pares.
Vim-airline
Mejoras visuales en la barra de estado de Vim.
Vim-devicons
Añade iconos de ficheros a plugins como NERDTree
indentLine
Muestra líneas verticales en cada nivel de sangrado
fzf
Buscador de ficheros
emmet for vim
Emmet para Vim
Supertab
Permite usar el tabulador para tareas de autocompletado.
sleuth.vim
Ajusta las opciones de sangrado (indentation) en base a lo que se encuentra en el fichero que se está editando u otros similares.
sneak.vim
Permite buscar en el archivo con solo dos caracteres.
MUcomplete
Autocompletado utilizando la tecla Tab
DevIcons
Añade iconos a los ficheros según su tipo para plugins como NERDTree, vim-airline, CtrlP, powerline, denite, unite, lightline.vim, vim-startify, vimfiler, vim-buffet y flagship.
Trucos
Recargar el fichero vimrc
Si hemos editado el fichero .vimrc y queremos que Vim lo recargue sin tener que abandonar su edición:
:so $MYVIMRC
Recursos
- Lecture 3: Editors (vim) (2020) (YouTube)
- How to setup your Vim RC (2021) (YouTube)
- Editors (Vim) (The missing semester of your education)
- VimGolf: desafíos para hacer con Vim en el menor número de pulsaciones.
