Algoritmos y Estructuras de Datos Herramientas Lenguaje de programación
!Prog C/C++ Rust
Linux Matemáticas
Mates Discretas
Programación Orientada a Objetos Sistemas Operativos

Vim y Neovim


[words: 4697] [reading time: 23min] [size: 55041 bytes]

Una pequeña overview de las principales funcionalidades de Vim con sus comandos

Nota: La mejor forma para aprender Vim es practicándolo, no intentes memorizar todos los comandos de golpe, sino incorpóralos progresivamente y ve mecanizándolos poco a poco.

Porqué Vim

  1. Ligero
  2. Super personalizable
  3. Ergonómico, con los atajos de teclado puedes trabajar muy rápido y cómodo
  4. Muy poderoso: infinidad de opciones que no tendrás en otros editores
  5. Escalable: puedes editar un simple archivo de 50 líneas o todo un proyecto con miles de archivos.

Niveles de poder en Vim

No sé, pero creo que es curioso e interesante mencionarlos:

  1. No saber Vim
  2. Vim básico
  3. Usar el modo visual
  4. Usar varios movimientos
  5. No usar el modo visual

La ayuda de Vim

Otra increíble característica de Vim es su maravillosa documentación y manual de ayuda. De forma offline y sin salir del editor, puedes buscar lo que necesites saber gracias al comando :help o :h.

En la documentación habrá unas etiquetas que funcionarán como enlaces en una página web. Estas están entre |, pero se esconden cuando el resaltado de sintaxis está activado. Para seguir el enlace usa <C-]> (o buscar ayuda sobre donde está el cursor) y para regresar <C-o>.

Si no estás seguro de lo que estás buscando, puedes autocompletar el contenido del comando :help con <C-d>, que te mostrará todas las etiquetas relacionadas.

Para navegar más rápido entre las distintas secciones de la documentación, usa gO para mostrar la tabla de contenidos, y usa enter para moverte a cada una de ellas.

Consejos de búsqueda

Comandos de búsqueda para el manual de usuario:

Alternativamente puedes usar :helpg <patrón>, que busca en todos los archivos de la ayuda, no solamente en las etiquetas. Para ver el siguiente match usa :cnext o :cn; y el anterior con :cprevious o :cp. También puedes abrir todos los resultados en una ventana aparte con :cwindow o :copen.

Estructura de la ayuda

La ayuda de Vim consiste en dos partes:

En lugar de leer tanto texto al comenzar (¡aburridooo!), puedes usar la guia interactiva que proporciona Vim: el Vim Tutor. Es un tutorial de unos 30 minutos que te enseñará lo más básico. Ejecútalo con :Tutor.

La página principal de la ayuda está en help.txt, a la que puedes acceder simplemente con el comando :help, :h o :help help.txt. Esta es el índice para el resto de elementos de la ayuda, ya que contiene todos los enlaces a los demás archivos, incluyendo (al final de todo) la documentación de cada plugin a mayores que instales. Encontrarás un link a la página y su tema principal.

En la página index.txt se muestran todos los comandos (por defecto) del editor, con una breve descripción y un link para más información. Es buena idea consultar esta página cuando creas tu configuración y cambias los atajos, ya que podrías estar inhabilitando otros comandos útiles. Si no quieres ver absolutamente todos, y que habrá algunos que en tu vida usarás, ve a quickref.txt.

En el apartado de key-notation, puedes obtener más información de como Vim representa las diferentes teclas que puedes usar para los comandos. En este post estoy usando esa notación. Para escribir teclas más rápidamente puedes usar (en command mode) <C-v> y la tecla deseada.

Entendiendo la edición modal

Vim es un editor modal, lo que quiere decir que existen diferentes modos de funcionamiento y comportamiento dependiendo en qué modo te encuentres.

El modo normal donde pasarás la mayor parte del tiempo ya que aquí están los principales comandos de movimiento y sirve de transición hacia los otros modos. Toda tecla que pulses se tomará como un comando, no para escribir texto.

Para hacer esto último, debes acceder al modo insert presionando la tecla i. Ahora podrás escribir texto como en otros editores.

También existe el replace mode, al que se accede con R, y hace exactamente lo que dice: reemplazar el carácter actual por el nuevo que escribas.

El modo visual se inicia al hacer una selección de texto con v, permitiéndote operar con él. Este modo selecciona carácter por carácter, pero existen los modos visual line (V), que selecciona líneas enteras, y visual block (<C-v>), selección en bloque o por columnas. A partir de estas selecciones, podemos hacer cambios solamente en el texto seleccionado con otros comandos.

Paralelamente existe el select mode (accesible con gh gH g<C-h> -go highlight-, y con <C-g> alternas a/desde visual mode), muy similar al visual mode, pero en cambio se comporta de forma similar a los programas de edición de texto de Windows: seleccionas texto y al comenzar a escribir se sustituye el texto.

Nota: al sustituir el texto seleccionado al comenzar a escribir algo, h j k l dejan de funcionar y solo puedes usar las flechas del teclado. Si configuras las flechas a otras acciones, este modo resulta inútil. Además, se puede simular su funcionamiento desde visual mode, por lo que no es un modo esencial.

El modo terminal emula una consola de comandos que puedes utilizar dentro del propio editor, sin necesidad de cerrarlo. Para salir al modo normal, presiona <C-\><C-n>.

El modo cmd o command line mode es el usado cuando escribes commandos Ex :, patrones de búsqueda / ? y filtros !.

En todos estos modos (excepto el normal mode) se te indicará en cual de ellos te encuentras abajo de todo de la pantalla. En el caso del command line mode, estarás escribiendo en ese espacio. Y para regresar al modo normal usa la tecla Escape (<Esc>) (excepto en terminal mode).

Para describir en qué modo se está ejecutando determinado comando, se añade <char>_ antes de la notación de las teclas:

Vim como lenguaje

A partir de ahora, los comandos que aparecen listados se ejecutarán desde el modo normal a menos que se diga lo contrario.

Realmente, los comandos en Vim pueden entenderse como un lenguaje por sí mismo, así que cuando empieces a pensar en este lenguaje, podrás entender mucho mejor el editor. Se diferencian en operadores, movimientos/nombres y modificadores (hay quien les llama preposiciones). Combinándolos podrás crear las frases de este lenguaje para describir los cambios que quieras en tu archivo de texto.

Para leer sobre estos en la ayuda de Vim busca :h motion :h operador :h aw (continua leyendo las siguientes entradas en este último), recomendable en este orden.

Operadores: son los verbos del lenguaje de Vim, realizan acciones; y estos dependen del modo en el que te encuentres.

Movimientos / Nombres: estos se pueden usar tanto como para mover el cursor, como ser los objetos a los que realizar las acciones. Por ejemplo, puedo moverme una palabra y entonces considera un movimiento. En cambio puedo usar un operador para borrar y combinarlo con un movimiento de palabra. En este caso, yo lo considero un nombre, ya que está describiendo dónde el operador tiene que actuar. Pero ojo, no todos los operadores necesitan un nombre, pero sí la mayoría de ellos.

También, por norma general, al no haber ningún nombre para la línea; se repite el mismo operador para aplicarlo en la línea actual. Además, la versión en mayúscula del operador es sinónimo de combinarlo con $: D=d$, C=c$

Nota: Todos los movimientos son nombres, pero no todos los nombres son movimientos.

Modificadores (opcional)

Estes dos últimos solo se pueden aplicar a nombres.

Bonus:

1dj  ---> borra 2 líneas
2dvj ---> borra desde el cursor hasta el carácter de debajo
3d<C-v>j ---> igual que antes pero incluyendo el carácter inicial

Construyendo frases (con ejemplos)

Borrar dos palabras:

1d2w / 2dw

Cambiar (es decir, borrar y entrar en insert mode) la palabra en la que se encuentra el cursor:

1ciw

Y de forma similar sucede para movernos, por ejemplo bajar 10 líneas:

110j

Como no tenemos un modificador de línea, se repite la acción (ojo: ¡dj borra dos líneas!):

1dd ---> borra la línea actual
2yy ---> copia la línea actual
3cc ---> cambia la línea actual: la borra y entra en insert mode

Los modificadores también se pueden añadir al insert mode:

13ihola ---> holaholahola

Insert mode

Entrar al insert mode:

Comandos especiales en insert mode

Insertar texto ya insertado:

El comando <C-x> activa un submodo dentro del insert mode, permitiendo realizar más acciones, normalmente relacionadas con el autocompletado. Esos comandos se tratarán en su respectivo apartado, pero <C-x><C-e> <C-x><C-y> se puede usar para mover la ventana una línea hacia abajo, arriba; teniendo en cuenta que el cursor no puede salir de la ventana ni desplazarse.

Operaciones con registros:

Borrar:

Curiosidades dentro de insert mode:

Operadores

Reemplazar:

Eliminar texto, o más bien, cortarlo; ya que todo lo que borremos se almacenará:

Copiar y pegar:

Formatear texto:

El formateado del último comando se hace utilizando el contenido de las opciones 'formatexp' (expresión) y 'formatprg' (programa externo). En en caso de que ambas opciones estén vacías, el formateado se realizará con un programa interno de Vim, teniendo en cuenta 'textwidth' y 'formatoptions (ver :h fo-table).

Mayúsculas y minúsculas:

Seleccionar

Los operadores funcionan diferente en este modo: en lugar de requerir un nombre, se tomarán los caracteres marcados como el propio nombre de la operación.

Movimientos y nombres

Aparte de los movimientos ya comentados (a continuación, para recordar), existen muchos otros.

<C-g> g<C-g>: muestra tu posición en el archivo actual

¡Más comandos!:

Movimientos que también pueden ser nombres

En primer lugar encontramos los movimientos relacionados con las palabras. Vim separa las palabras con determinados caracteres, pero si quieres que sea una palabra estricta, es decir solamente separada por espacios (saltándose la puntuación), usa la versión en mayúscula.

Después, puedes desplazarte entre diferentes frases con ( ). Vim las separa con ., ! o ? (inclusive). Una frase también termina cuando lo haga el párrafo.

1Esto es una frase. ¡Y esto es otra frase para Vim!
2Esto es
3otro
4ejemplo.

Para moverte entre párrafos usa { }, y estos se consideran pedazos de texto separados por líneas en blanco (o con caracteres en blanco). También puedes interpretarlo como hacer un salto hasta la siguiente línea vacía.

1¡Hola! Este es un ejemplo
2de párrafo según Vim.
3
4Y este es otro párrafo
5de ejemplo, para que veas
6como debes separarlos.

Por último, si te quieres desplazar entre bloques de paréntesis o llaves, puedes usar [( ]) y [{ ]} respectivamente. Ten en cuenta que irá a por el paréntesis o llave que no esté cerrado. Mira este ejemplo:

1int main() { // bloque 1
2  ...
3  { // bloque 2
4    ...
5  }
6  ...
7}

Si te encuentras dentro del bloque 2 y realizas [{, el cursor se desplazará a la llave que tiene el comentario y dice ser el bloque 2. En cambio, si estás fuera del bloque 2 pero en dentro del bloque 1, se moverá entre las llaves de la primera y última línea.

Estos últimos movimientos, ( ) { } [{ ..., pueden usarse también como nombres, siempre y cuando no se usen con los modificadores i a, ya que se confundirían con los siguientes.

Nombres exclusivos con modificador

Es decir, nombres que no pueden ser movimientos; y dado que se confunden con los movimientos normales, y por lo tanto deben ir acompañados siempre de un modificador: i a.

Para esclarecer un poco estos últimos, puede que sea necesario ver algunos ejemplos:

Movimientos de Scroll

Movimientos de scroll, es decir, que mueven el contenido de la ventana y no el cursor (el cursor debe de estar siempre en la ventana, así como consecuencia del movimiento también es posible que se ajuste para que continue dentro). Al no ser movimientos del cursor no se pueden usar como nombres y combinar con operadores.

Moverse cuando hay líneas cortadas (es decir, wrap=false):

Más en scroll.txt.

También, cuando hay líneas que no aparecen completas horizontalmente en la ventana, podemos movernos cómodamente:

Ir a

Buscar

Estos comandos también funcionan como movimientos y nombres.

Buscan en la misma línea:

Multilínea:

Marcas

Sirven como una especie de marcapáginas: se colocan en determinadas posiciones de un archivo, para posteriormente regresar a ellas con un simple comando.

El identificador o nombre de las marcas será una letra:

Hay algunas marcas ya establecidas:

Con el comando :marks puedes listar todas las marcas actuales, y con delm[arks] <id> borrarlas (solo a-zA-Z0-9).

Cada uno de los saltos que realices, se guardarán en la jump list (cuyo contenido puedes ver con :jumpso :ju) y los comandos <C-o> y <C-i> te permitirán regresar a un salto anterior o posterior respectivamente.

Los movimientos de siguientes comandos se añadirán a la lista: gg G { } ( ) [{ ]} [[ ]] H M L % :tag <C-t> <C-]>

TODO: Yo personalmente uso mucho los movimientos de { }, y es muy molesto que esos también se consideren saltos, ya que me llena la lista con saltos inútiles cuando realmente quería conservar otro salto; como ir al principio del archivo, búsqueda, etc.

Supongo que hasta encontrar una solución usaré <C-d> <C-u>

Comandos Ex

Buffers, ventanas y pestañas

Si quieres conservar la configuración actual de buffers, ventanas, opciones… Puedes usar el comando :mks[ession] [<nombre-archivo>], que crea un archivo de VimScript que vuelve a configurar el editor. Cárgalo con :source <nombre-archivo>.

Buffers

Puedes listar los buffers activos con el comando :buffers: el primer número es su id, luego están los estados en los que se encuentra y el archivo al que corresponde.

Un buffer puede tener estar en los siguientes estados:

Estado¿Cargado en memoria?¿Aparece en una ventana?:buffers muestra…
activea
hiddenNoh
inactiveNoNo

También hay otros tipos de indicadores, aparte de los del estado, y pueden aparecer varios de ellos juntos:

Tipos especiales de buffers, que se consiguen combinando sus estados:

Nota: estas opciones se describen con :setlocal: :setlocal buftype=nofile

Comandos para moverse entre buffers:

Abrir en una nueva ventana horizontal:

Borrar buffers:

Hay más comandos que puedes usar en la ayuda: :h buffer-list.

Ventanas

No hay una forma de listar las ventanas activas, pero no es necesario, ya que se ven a simple vista.

Existen dos tipos de ventanas: split es una ventana que aparece en horizontal respecto a otra; y vertical split que es una ventana que aparece en vertical.

Estos comandos se ejecutan desde el normal mode, precedidos por <C-w>

Abrir y cerrar ventanas

Moverse entre ventanas

Mover ventanas

Cambiar de tamaño

Comandos Ex para las ventanas

Pestañas

La pestañas aparecerán listadas en la parte superior.

Moverse entre pestañas:

Abrir y cerrar pestañas:

Mover pestañas con :tabm [+-]<num>.

Otras funcionalidades

Rangos

Patrones de búsqueda

magic: algunos caracteres dentro de un patrón se toman literalmente; pero si se preceden con una barra invertida (\), actúan como caracteres especiales con un significado diferente (TODO: regex).

Por ejemplo: a se refiere al carácter a, mientras que \a se refiere a cualquier carácter alfanumérico. Otros casos: . se refiere a cualquier carácter, mientras que \., se refiere a un . literalmente.

\m = magic \M = nomagic

\v todos los caracteres ASCII menos 0-9a-zA-Z y _ tienen valor especial (very magic) \V solo los caracteres precedidos de \ tienen significado especial (very nomagic)

smartcase

patternmatches
wordword, Word, WORD…
WordWord
WORDWORD
WoRdWoRd

Sustituir

El comando :s permite sustituir texto usando patrones. Aquí está una versión completa de todas sus funciones:

1[<rango>]s[ubstitude]/<patrón-a-buscar>/<string-con-la-que-sustituir>/[<opciones>]

Opciones:

Registros

Cuando eliminamos texto, realmente no lo estamos eliminando, sino cortando. Dicho texto queda almacenado en los registros (automáticamente nombrados del 0 al 9, al menos que no se especifique uno manualmente), para que puedas volver a utilizarlo o pegarlo en otro lugar.

Para ver el contenido de tus registros usa :reg

Registros que no guardan nada (para evitar que se sobreescriban otros registros. Útil para plugins):

This register contains text from commands that delete less than one line, except when the command specifies a register with [“x].

Registros read-only:

Desplegables

Más información en :help fold.txt

Macros

Autocompletado

Corrección de ortografía

Plugins

Netrw

Este es un plugin que viene preinstalado en NeoVim, y permite mostrar archivos tanto locales como remotos a través de SSH, etc.

Referencias

Volver a Herramientas Siguiente: tmux