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:

Consejos

  1. Ejecutar vimtutor hasta comprender las bases de vim
  2. Seguir el manual de vim dentro del propio vim con :help user-manual
  3. 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 :

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.

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 :

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

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:

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

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:

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:

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:

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

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:

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