Manual de VI/VIm

A la vista del título de esta entrada muchos estaréis pensando "Que nivel de inglés tiene este tío", pero realmente de lo que voy a hablaros es de que para ser un friki de la vieja escuela hay que dominar el editor VI, (y emacs, pero eso lo dejamos para otra entrada).

Nos saltamos la historia de VI, que podéis buscar en la wikipedia si queréis, y vamos al lío.
Nota: Estos comandos son válidos para VI y para VIm (VI improved, o sea el VI mejorado con resaltado de código y más)

Iniciar VI

Desde el prompt de un terminal podemos simplemente pulsar
$ vi
e iniciaremos el editor con un documento en blanco sin nombre o tecleamos
$ vi nombre
y se abre el archivo nombre para su edición o se crea en caso de que no existiera.

Otras formas de abrir VI, con más control de la apertura serían.
$ vi + num archivo
Abre el archivo por la linea num
$ vi + archivo
Abre el archivo en la última linea
$ vi archivo1...archivon
Abre los archivos indicados, después de guardar podemos pulsar n para pasar al siguiente.
$ vi + /cadena archivo
Abre el archivo por la primera coincidencia de la palabra cadena
$ vi - archivo
Recupera la última versión de archivo grabada

VI tiene 2 modos de trabajo el modo comandos y el modo de inserción; en el modo de comandos las teclas que pulsemos tienen funciones especiales, podemos pasar al modo de comandos en cualquier momento pulsando la tecla ESC, También conviene recordar que los comandos son diferentes con teclas mayúsculas y minúsculas.

Salir de VI

Desde el modo de comandos podemos salir tecleando :q y pulsando enter, si tienes cambios sin grabar te lo indicará, podemos grabar con la combinación :w (para cambiarle el nombre :w nombre) y también combinar los 2 comandos :wq con lo que grabaría y saldría del editor, también realizaríamos lo mismo pulsando ZZ.
La forma de salir sin grabar los cambios es tecleando :q! o :x y enter.

Moverse por el editor

Para moverse  por el editor podemos usar las flechas o en el modo de comandos también se pueden usar las teclas h j k l, que respectivamente serían izquierda, abajo, arriba y derecha.

Modo inserción

Los comandos que nos harían entrar en el modo de inserción son los siguientes: 

i Nos pondría el punto de inserción antes del cursor.
I Nos pondría el punto de inserción al principio de la línea
a Nos permitiría añadir texto detrás del cursor
A Añadiríamos texto al final de la línea
o Nos pondría el punto de inserción en la línea de abajo de la actual
O Nos pondría el punto de inserción en la línea de encima de la actual

Reemplazar texto (desde el modo de comandos)

[num]r[car] Reemplazar el número de caracteres (num) por [car], o uno si se omite num (repetiría num veces el carácter indicado).
R Reemplazar texto desde la posición del cursor hasta que pulsemos ESC
[numero]s Substituir el número de caracteres (num) por texto a insertar, o un único carácter si se omite el número, te deja en el modo de inserción. 
S Substituir la línea actual
C Cambiar hasta el final de la línea
[numero]cw Cambiar el número de palabras, o una si se omite num

[num]x borra el número de caracteres (num) o 1 si se omite.
X Borra el caracter que está antes del cursor
u deshacer (undo) la última acción
U deshacer todos los cambios en la linea actual
[num]c Cambia hasta ... Ejemplo cw cambiaría desde la posición del cursor hasta el final de la palabra
cc cambia toda la linea e indicando un número cambiaría esa cantidad de líneas.

Copy & Paste

Que sería de un editor de texto sin las funciones básicas de copiar, cortar y pegar.
[num]yy Copia num lineas al buffer general
[num]dd Corta num lineas y las mete en el buffer general
D Corta desde el cursor hasta el final de la linea
p Pega el contenido del buffer después del cursor
P Pega el contenido del buffer antes del cursor
. Repite el último comando de actualización realizado (borrar,pegar,sustituir)

Múltiples buffers

VI tiene unos espectaculares 36 buffers de memoria para almacenar texto copiado:
1 Buffer sin nombre que es el buffer por defecto para las operaciones simples de copiar y cortar.
9 Buffers sin nombre, que son los buffers LIFO del 1-9.
26 Buffers con nombre a-z
Para usar un buffer con nombre se usan las comillas dobles " seguidas del nombre del buffer y despues el comando de copiar, cortar o pegar deseado.
Nota:  Si se usa el nombre del buffer en minúscula en las operaciones de copiar o cortar se reemplaza el buffer, pero si se usa en nombre en mayúsculas se añade lo copiado o cortado al buffer. 
"b3dd Corta 3 lineas y las mete en el buffer b
"B5dd Corta 5 lineas y las añade al contenido del buffer b
"ap Pega el contenido del buffer a después del cursor.

Caracteres especiales

Hay unos caracteres especiales que se pueden usar con los comandos para formar comandos avanzados.

^ Comienzo de la linea (Usado al principio de una expresión de búsqueda), puede usarse para desplazarse.
. Comodín que reemplaza un caracter único
* Comodín que reemplaza cero o más caracteres
$ Final de la linea (Usado al final de una expresión de búsqueda), puede usarse para desplazarse.
[ Comienzo de un grupo de expresiones coincidentes o no. Por ejemplo; /f[iae]t coincide con: fit, fat, fet, /a[^bcd] coincidiria con cualquier palabra que comience por a, pero no sea seguida por b, c ni d.
< Puesto en una expresión escapada con la barra invertida \ encontraría el inicio de una palabra. Ej /\<op localizaría opera, operacion, oportunidad,...
> Como la superior pero localizaría el final de la palabra. Ej. /la\> localizaría hola, amapola, ...

Desplazarse dentro de un archivo

[num]CTRL+B Desplazamiento una página atrás, o del número indicado de ellas.
[num]CTRL+D Avanza [num] medias ventanas.
[num]CTRL+F Avanza [num] páginas.
[num]CTRL+H Mueve el cursor a la izquierda los espacios indicados.
[num]CTRL+J Mueve el cursor [num] lineas abajo en la misma columna.
CTRL+M Desplaza el cursor al primer caracter de la siguiente línea.
[num]CTRL+N Mueve el cursor [num] lineas abajo en la misma columna.
[num]CTRL+P Mueve el cursor [num] lineas arriba en la misma columna.
[num]CTRL+U Retrocede [num] medias ventanas.
[num]$ Mueve el cursor al final de [num] lineas indicadas o de la linea actual si no se indica número.
% Mueve el cursor al paréntesis o corchete de su sección.
^ Mueve el cursor al primer caracter no blanco.
( Mueve el cursor al principio de una sentencia.
) Mueve el cursor al principio de la siguiente sentencia. 
{ Mueve el cursor al párrafo precedente.
} Mueve el cursor al párrafo siguiente. 
[num]| Mueve el cursor a la columna indicada por el número.
+ Mueve el cursor al primer caracter no blanco de la linea siguiente.
- Mueve el cursor al primer caracter no blanco de la linea previa.
_ Mueve el cursor al primer caracter no blanco de la linea actual.
0
Mueve el cursor a la primera columna de la linea actual.
B Retrocede el cursor una palabra, saltándose la puntuación.
E Avanza hasta el final de una palabra, saltándose la puntuación.
[num]G Se desplaza a la línea especificada, o al final de la actual si no se especifica ninguna.
H Mueve el cursor al primer caracter no blanco en la parte superior de la pantalla.
L  Mueve el cursor al primer caracter no blanco en la parte inferior de la pantalla.
M Mueve el cursor al primer caracter no blanco en el centro de la pantalla.
W Avanza al principio de una palabra, saltándose la puntuación.
e Avanza una palabra. Si el cursor está en el medio de una palabra, lo mueve al último caracter de esa palabra.
h Mueve el cursor a la izquierda una posición.
j Mueve el cursor hacia abajo una línea.
k Mueve el cursor arriba una línea.
l  Mueve el cursor a la derecha una posición.
w Avanza el cursor una posición. Si está en medio de una palabra avanza hasta el primer caracter de la siguiente palabra.

Mover el cursor por la pantalla

[num]CTRL+E Avanza [num] líneas, o una si no se especifica número.
[num]CTRL+Y Retrocede [num] líneas, o una si no se especifica número.
z Redibuja la pantalla con las siguientes opciones. z + ENTER sitúa la línea actual en el borde superior de la pantalla; z. sitúa la linea actual en el centro de la pantalla; y z- sitúa la línea actual en la parte inferior de la pantalla. Si se indica un número se usaría la línea especificada en vez de la actual, ejemplo 16z. situaría la línea 16 en el centro de la pantalla.

Búsqueda de texto o caracteres

/[cadena] Busca la cadena especificada avanzando por el archivo.
?[cadena] Busca la cadena especificada retrocediendo por el archivo.
n Repite la última búsqueda realizada con / o ?
N Repite la última búsqueda realizada con / o ? pero a la inversa
F[car] Busca hacia atrás en la línea actual el caracter especificado, y se mueve a su posición. 
T[car] Busca hacia atrás en la línea actual el caracter especificado, y se mueve a la columna siguiente. 
; Repite la última búsqueda realizada con F T o f
, Repite la última búsqueda realizada con F T o f pero a la inversa
f[car] Busca en la línea actual el caracter especificado, y se mueve a su posición.
t[car] Busca en la línea actual el caracter especificado, y se mueve a la columna anterior.


Manipulación de caracteres y formateo de lineas

[num]~ Cambia de mayúsculas a minúsculas y viceversa los caracteres indicados o el de debajo del cursor si no se indica número.
J Unir a la línea actual la siguiente
< Desplaza las lineas a la izquierda hasta donde se indique, ejemplo <w
> Desplaza las lineas a la derecha hasta donde se indique
<< Desplaza las lineas a la izquierda, puede especificarse un número
>> Desplaza las lineas a la derecha, puede especificarse un número

Miscelanea

CTRL+G Muestra el nombre del archivo actual y su estado
CTRL+L Limpia y redibuja la pantalla
CTRL+R Redibuja la pantalla eliminando líneas falsas
:! Ejecuta un comando del S.O.
:r! Ejecuta un comando del S.O. y lo pega en la posición del cursor
:[num]r archivo Pega el contenido del archivo en la linea indicada o en la posición del cursor si no se indica linea
:!! Ejecuta el último comando del shell
:s/cadena1/cadena2 Substituye el texto cadena1 por cadena2 la primera vez que aparece en la línea
:s/cadena1/cadena2 /g Substituye todas las apariciones de cadena1 por cadena2 en la línea
:m,n s/txt/txt2 /g Substituye en el rango de líneas [m,n]
:= Número de líneas del archivo
:.= Muestra la línea actual
@[buffer] Ejecuta el comando almacenada en el buffer indicado, o en el buffer por defecto si no se indica ninguno
& Repite el último comando s ejecutado
:ab cadena1 cadena2 Abreviaturas, si tecleamos la palabra indicada en cadena1 VI la sustituirá por cadena2
:una cadena1 Elimina la abreviatura definida previamente
:sh Sale al shell, teclear exit para volver

Recuperar texto eliminado por error

Además de usar los comandos u y U podemos usar la capacidad de buffers multiples para recuperar texto borrado.
"1p Recupera el último texto borrado sacándolo del buffer 1
"np Recupera texto borrado del buffer n

Trabajar con múltiples archivos

Como hemos indicado antes VI nos permite abrir varios archivos a la vez de la siguiente manera

$ vi uno dos tres

:[num]n Para cambiar al siguiente archivo para avanzar el numero de ficheros que queramos
:ar Indica los ficheros abiertos y en cual nos encontramos
AltGr+CTRL+~ Cambia entre los 2 últimos archivos abiertos
:rew Rebobina el puntero de archivos para que apunte al primero
:rew! Rebobina el puntero de archivos para que apunte al primero y lo reabre
:e# Abre el archivo previo
:e archivo Reabre el archivo desde disco

Grabar el archivo

:w Graba el archivo
:w nombre Graba el archivo con el nombre indicado
:w! nombre Graba el archivo con el nombre indicado o lo sobreescribe
:10,20 w nombre Graba en el archivo nombre de las lineas 10 a la 20
:10,20 w! nombre Graba en el archivo nombre de las lineas 10 a la 20 o lo sobreescribe
:10,20 w >> nombre Añade las lineas 10-20 al final de del archivo nombre
:w %xxx Graba el archivo con el nombre actual añadiendole el patrón xxx
:w /a/b/c/nombre Graba el archivo nombre en la ruta /a/b/c
:'a,'b w nombre Graba el archivo desde el marcador a al b, solo si no existe
:.,/patron/w Graba el archivo desde la posición actual hasta que encuentra el patrón sobreescribiendo el archivo actual

Variables de entorno

Existen una serie de variables de entorno que se pueden modificar, para activarlas se usa :set variable y para desactivarlas se usa :set novariable
Unos ejemplos son:
  
:set list Muestra los caracteres no imprimibles ^I son tabuladores y $ fin de línea


:set ic Ignora mayúsculas y minúsculas en las búsquedas
:set smd Activa el modo SHOW que muestra INSERT cuando está en el modo insert

Tutoriales

Vim dispone de un par de tutoriales como son el comando
:help tutor
Y más interactivo estilo juego http://vim-adventures.com/

No hay comentarios:

Publicar un comentario