VI fue el primer editor de pantalla completa que existió. Ese es uno de los argumentos de los detractores de Unix, pero también uno de los argumentos principales de sus defensores: si bien es complicado de aprender, también es una herramienta extremadamente potente una vez que uno se acostumbra a usarlo. Con unos pocos tecleos, un usuario de VI puede mover montañas y, aparte de Emacs, pocos editores de texto pueden decir lo mismo.
La versión provista con Linux-Mandrake es de hecho, VIm, por VI iMproved (VI Mejorado), pero lo llamaremos VI a lo largo de este capítulo.
Primero, necesitamos iniciar VI, lo cual se hace exactamente como con Emacs. Así que, volvamos a nuestros dos archivos e ingresemos:
$ vi archivo1 archivo2 |
En este punto, Ud. se encontrará frente a una ventana como la que se muestra en la Figura 4-4.
Ahora Ud. está en modo comando frente al primer archivo abierto. En modo comando, Ud. no puede insertar texto en un archivo... Para hacer esto, Ud. debe pasar a modo inserción, y por lo tanto debe ingresar uno de los comandos que le permiten hacerlo:
a e i: para insertar texto antes y después del cursor, respectivamente (A e I insertan texto al final y al principio de la línea corriente);
o y O: para insertar texto debajo y por encima, respectivamente, de la línea corriente.
En modo de inserción, Ud. verá aparecer la cadena --INSERT-- en la base de la pantalla (de esta forma, Ud. sabrá en que modo se encuentra). Es en este, y sólo en este modo, que Ud. puede ingresar texto. Para volver al modo comando, presione la tecla Esc.
En modo de inserción, Ud. puede usar las teclas Backspace y Supr para borrar texto a medida que avanza. Para desplazarse por el texto, tanto en modo comando como en modo inserción, Ud. usa las teclas de las flechas. También hay otras combinaciones de teclas en modo comando, que veremos más adelante.
Ud. accede al modo ex presionando la tecla : en modo comando. Aparecerá en la base de la pantalla los mismos :, y allí se posicionará el cursor. Todo lo que Ud. ingrese subsecuentemente, seguido por la presión de la tecla Intro, VI lo considerará como un comando ex. Si Ud. borra el comando y los : que ingresó, volverá al modo comando y el cursor retornará a su posición original.
Para grabar los cambios hechos a un archivo, Ud. ingresa la secuencia :w en modo comando. Si Ud. quiere grabe el contenido del buffer en otro archivo, ingrese :w <nombre_de_archivo>
Ud. puede tener varios buffers visibles en la pantalla a la vez, como con Emacs. Para esto, use el comando :split.
Para pasar de un archivo a otro, en un buffer, Ud. ingresa :next para moverse al archivo siguiente y :prev para moverse al archivo previo. Ud. puede usar :e <nombre_de_archivo> también, lo cual le permite tanto cambiar al archivo deseado, si es que ya está abierto, como también abrir otro archivo. Aquí también Ud. dispone del "completado".
Para cambiar de buffer, ingrese C-w j para ir al buffer de abajo o C-w k para ir al buffer de arriba. Ud. también puede usar las teclas de las flechas para arriba y para abajo, en lugar de k o j, respectivamente. El comando :close oculta un buffer, el comando :q lo cierra.
Atención, VI es fastidioso: si Ud. intenta ocultar o cerrar un buffer sin guardar los cambios, el comando no se llevará a cabo y Ud. obtendrá este mensaje:
No write since last change (use! to override)
(no se escribió desde el ultimo cambio (use ! para forzar el comando)) En este caso, haga lo que se le dice e ingrese :q! o :close!.
Además de las teclas Backspace y Supr en modo de edición, VI tiene muchos otros comandos para borrar, copiar, pegar, y reemplazar texto -- en modo comando. Aquí, veremos algunos. Todos los comandos que se muestran aquí están, de hecho, separados en dos partes: la acción a realizar y su efecto. La acción puede ser:
c: para cambiar (Change) o reemplazar; el editor borra el texto que se pide y vuelve al modo de inserción después de este comando;
d: para borrar (Delete);
y: para copiar (Yank), lo veremos en la sección siguiente.
.: repite la última acción.
El efecto define al grupo de caracteres sobre los cuales actúa el comando. Estos mismos comandos de efecto ingresados como están en modo comando corresponden a los desplazamientos:
h, j, k, l: un caracter a la izquierda, abajo, arriba, a la derecha[1] respectivamente;
e, b, w: hasta el final (respecto al comienzo) de la palabra corriente; del comienzo de la palabra siguiente;
^, 0, $: hasta el primer caracter no blanco de la línea corriente, hasta el comienzo de la línea corriente, hasta el final de la línea corriente;
f<x>: hasta la próxima ocurrencia del caracter <x>; por ejemplo, fe desplaza el cursor hasta la próxima ocurrencia del caracter e;
/<cadena>, ?<cadena>: hasta la próxima ocurrencia de la cadena o expresión regular <cadena>, y lo mismo yendo hacia atrás en el archivo; por ejemplo, /pepe mueve el cursor hasta la próxima ocurrencia de la palabra pepe;
{, }: hasta el comienzo, hasta el final, del párrafo corriente;
G, H: hasta el final del archivo, hasta el comienzo de la pantalla.
Cada uno de estos caracteres de efecto o comandos de movimiento puede estar precedido por un número de repetición. G referencia al número de línea en el archivo. A partir de esto, Ud. puede hacer toda clase de combinaciones. Algunos ejemplos:
6b: se mueve 6 palabras hacia atrás;
c8fk: borrar todo el texto hasta la octava ocurrencia del caracter k y luego pasar a modo de inserción;
91G: ir a la línea 91 del archivo;
d3$: borra hasta el final de la línea corriente más las dos líneas siguientes.
Es cierto que estos comandos no son muy intuitivos, pero como siempre, el mejor método es la práctica. Aunque Ud. puede ver que la expresión "mover montañas con unas pocas teclas" no es tan exagerada :-)
VI tiene un comando para copiar texto que ya hemos visto: el comando y. Para cortar texto, simplemente use el comando d. Ud. tiene 27 memorias para almacenar texto: una memoria anónima y 26 memorias que llevan el nombre de las 26 letras minúsculas del alfabeto inglés.
Para usar la memoria anónima Ud. ingresa el comando tal cual. Así, el comando y12w copia a la memoria anónima las 12 palabras que están después del cursor[2]. Si Ud. quiere cortar este área, use d12w.
Para usar una de las 26 memorias nombradas, ingrese la secuencia "<x> después del comando, donde <x> da el nombre de la memoria. Entonces, para copiar las mismas 12 palabras en la memoria k, Ud. puede ingresar "ky12w, y "kd12w para cortarlas.
Para pegar el contenido de la memoria anónima, Ud. usa los comandos p o P (por Paste, Pegar), para insertar texto después o antes del cursor, respectivamente. Para pegar el contenido de una memoria nombrada, use "<x>p o "<x>P de la misma forma (por ejemplo, "dp pegará el contenido de la memoria d después del cursor).
Veamos el ejemplo de la Figura 4-5.
Para efectuar esta acción, nosotros:
volveremos a copiar las primeras 6 palabras de la oración en la memoria r (por ejemplo): "ry6w[3];
pasaremos al buffer file2, que está ubicado abajo: C-w j;
copiaremos el contenido de la memoria r antes del cursor: "rp.
El resultado, mostrado en la Figura 4-6, es el que esperábamos.
La búsqueda de texto es muy simple: en modo comando, Ud. simplemente ingresa / seguida de la cadena a buscar, y luego presiona la tecla Intro. Por ejemplo, /fiesta buscará la cadena fiesta desde la posición corriente del cursor. Presionar n lo lleva a la próxima ocurrencia, y si Ud. llega al final del archivo, la búsqueda comenzará nuevamente por el principio. Para iniciar una búsqueda hacia atrás, use ? en vez de /.
El comando para salir, es :q (de hecho, este comando cierra el buffer activo, como hemos visto, pero si es el único buffer presente, Ud. sale de VI). Hay un atajo: la mayoría de las veces, Ud. edita solo un archivo. Entonces, para salir Ud. usará:
:wq para guardar los cambios y salir (una solución más rápida es ZZ), o
:q! para salir sin grabar.
Ud. habrá notado que si tiene varios buffers, :wq escribirá el buffer activo y luego lo cerrará.
[1] | Un atajo para dl (borrar un caracter hacia adelante) es x; un atajo para dh es X; dd borra la línea corriente. |
[2] | ... si el cursor está posicionado ¡al comienzo de la primer palabra! |
[3] | y6w significa literalmente: "Yank 6 words". |