Manual de busybox vi

vi es un programa que permite editar archivos de texto. Es muy liviano y no requiere un entorno gráfico, solo requiere un terminal de texto para ser usado. En dispositivos embedidos, suele haber una versión proveida por el conjunto de herramientas BusyBox. BusyBox es también instalado en el sistema JSLinux.

La version vi de BusyBox es una implementación simplificada de ese editor que solemos encontrar en las distribuciones Linux comunes y corrientes. Tiene la misma filosofía de edición pero menos funcionalidades.

En esta página vamos a ver buena parte de las funcionalidades de busybox vi. Al final de la página se encuentra un resumen de comandos.

Usar vi

Arrancar vi

La forma más típica de arrancar el editor vi desde la línea de comando es dándole el nombre del archivo que queremos editar con vi archivo. Si el archivo archivo existe, el editor cargará su contenido. Si no existe, arrancará sin contenido, y el archivo se creará cuando guardemos el contenido del editor.

Se puede arrancar vi sin especificar ningun nombre de archivo. Pero en ese caso, cuando se tratará de guardar el texto a un archivo tendremos que especificar un nombre.

Modos de operación

Es importante entender que vi es un editor modal. Eso significa que nuestros teclazos van a ser interpretados de manera distinta según el modo en qué estamos. Es una característica muy poderosa pero también un dolor de cabeza al principio.

busybox vi tiene tres modos de operación:

El modo comando es el modo por defecto. Se puede siempre volver a ese modo usando la tecla ESC. Los modos inserción y reemplazo son para editar texto. La única diferencia es que en modo reemplazo, los carácteres bajo el cursor son reemplazados, mientras que en modo inserción son desplazados a la derecha. El sub-modo comandos dos-puntos es un modo especial donde podemos ingresar desde el modo comando usando la tecla :.

El modo actual está indicado por un carácter en el rincón inferior izquierdo de la pantalla:

Mover el cursor

Cuando arrancamos vi, estamos en modo comando. Eso significa que no podemos ingresar texto, pero (entre otras cosas) podemos mover el cursor. Hay varias maneras de moverse en vi pero la manera básica es moverse de un carácter en cada dirección. Se puede hacer de dos maneras, con las teclas flechas, que no es la forma recomendada, porque nos hace alejar los dedos de la fila central del teclado, o usando las teclas h, j, k, l. Recomiendo que usen las teclas hjkl en lo posible.

Otro argumento en contra de usar las teclas flecha es que como busybox vi es usado en la mayoría de los dispositivos embedidos, es posible que su terminal no esté configurado correctamente para utilizarlas. En esa situación estarán frustrados cada vez que aprieten una tecla flecha.

Para mover el cursor a la izquierda o derecha, también podemos usar las teclas SPACE y BACKSPACE. Notamos que si estamos en el modo inserción, podemos mover el cursos pero las teclas hjkl no están disponibles (porque sirven para entrar texto, por supuesto).

Edición básica

Para tipear algun texto, necesitamos pasar al modo inserción. Los comandos más básicos para entrar a ese modo son a (para agregar texto después de la posición actual del cursor) y también i (para insertar antes de la posición actual del cursor), y R para entrar al modo reemplazo. Después de insertar texto, podemos usar ESC para volver al modo comando. Cuando estamos en modo inserción/reemplazo, podemos también suprimir texto usando las teclas DEL y BACKSPACE.

Guardar un archivo y salir

Ahora sabemos mover el cursor y hacer edición básica. Pero ¿cómo guardar el archivo y salir del editor? Hay distintas maneras. Si estamos editando un archivo que ya tiene nombre, podemos usar ZZ en modo comando. Significa “guardar y salir” (e irse a dormir, por eso “ZZ…”). Para solo guardar los cambios sin salir, podemos usar el comando :write (solo apretamos la tecla dos-puntos y luego tipeamos write, finalmente apretamos ENTER). Para salir, podemos usar el comando :quit, pero vi no nos deja salir si hay modificaciones que no fueron escritas al archivo. Si no queremos guardar esos cambios, agregamos ! al final del comando para forzar la salida. Los comandos write y quit tienen versiones más cortas: podemos usar :w y :q. Para guardar y salir en un solo comando podemos usar :wq o :x.

Editar en modo comando

El modo comando no es solo para mover el cursor. Hay unos comandos que sirven para editar texto. El más básico es el comando suprimir. Apretamos la tecla x para suprimir el carácter que está bajo el cursor, y con X (mayúscula) suprimimos el carácter que está justo antes del cursor.

Cada vez que borramos algo en vi, es guardaro en una memoria temporaria. Podemos pegar el contenido de esa memoria usando p (para pegar después del cursor) o P (para pegar antes del cursor).

Podemos copiar una línea entera usando yy (o Y), y usando dd podemos borrar una línea. También, una línea borrada es copiada a la memoria temporaria, así que la podemos pegar en otro lado usando p o P. De esa forma podemos cortar y pegar en vi.

Más formas de moverse dentro de un archivo

Cuando editamos un archivo, solemos movernos bastante por todos lados. vi tiene unos comandos útiles para hacerlo de manera más eficiente. Echémoles un vistazo.

En lugar de moverse a la izquierda o derecha de solo un carácter, podemos movernos de una palabra entera. Hay un par de comandos que nos permiten hacerlo. Un detalle primero. Para vi, hay dos cosas distintas que se pueden llamar “palabras”. Llamémolas palabra y PALABRA. El primer tipo de palabra es una secuencia de letras, números y guiones bajos. Cualquier carácter que no es parte de ese conjunto es considerado como un separador de palabra. Luego está la otra definición. Una PALABRA es, básicamente, cualquier secuencia de carácteres separada por un carácter blanco. Entonces para vi, “that’s” es constituido de dos palabras pero una sola PALABRA.

Ahora veamos los comandos. w avanza el cursor hasta el principio de la próxima palabra, e lo avanza al final de la palabra siguiente, mientras b lo mueve al principio de la palabra anterior. Para hacer los mismo con PALABRAS, usamos los comandos W, B y E.

El comando 0 (o la tecla HOME) trae el cursor al principio de la línea, mientras $ (o la tecla FIN) lo lleva al final. En lugar de ir al principio de la línea, si tenemos ganas de ir al primer carácter no blanco de la línea actual, usamos la tecla ^.

Podemos buscar secuencias de carácteres en el archivo. Para hacerlo, usamos el comando /xyz (seguido de ENTER) para buscar hacia adelante. Para repetir la búsqueda, usamos n (hacia adelante) o N (hacia atrás).

Finalmente tenemos un comando muy útil: %. Sirve para saltar al símbolo que cierra (o abre) el paréntesis, la llave o el corchete sobre cual tenemos el cursor: (), {} or [].

Repetir comandos

Ya vimos ciertos comandos para editar texto o moverse dentro de un archivo. La mayoría de esos comandos pueden ser prefijados con un número. Eso permite repetir el comando la cantidad de veces indicada. Por ejemplo, para borrar 10 líneas, podemos usar el comando 10dd. Si queremos borrar 5 carácteres, podemos usar 5x, y para avanzar de 3 palabras, 3w, etc.

El comando punto

El comando punto (apretando la tecla .) sirve para ahorrar esfuerzos, porque repite el último comando que modificó el texto. Nada más. No parece mucho, pero dado que podemos hacer bastante con un solo comando en vi, podemos ahorrar un montón de tipeo. Por ejemplo, si acabamos de borrar 10 líneas con 10dd, podemos borrar 10 líneas más solo apretando la tecla punto.

Deshacer

busybox vi tiene una función de “undo” limitada. Podemos cancelar el último cambio con u, y repetir para cancelar los cambios anteriores. En versiones viejas de busybox vi, sin embargo, solo tenemos el comando U que cancela todos los cambios de la línea actual desde la última vez que llegamos a esa misma. Lamentablemente no existe el “redo” o “volver a hacer”. Entonces ¡con cuidado!

Otros comandos que pasan al modo inserción

Ya conocemos ciertas maneras de entrar al modo inserción, pero hay un par más. A es un comando muy útil que salta primero al final de la línea actual y luego entra al modo inserción. Es un atajo de $a. Hay un atajo similar para c$, es C. Borra todo entre la posición del cursor y el final de la línea, y luego entra al modo inserción. En cuanto a ^i, tenemos I.

Finalmente, tenemos los comandos o y O (las letras, no el número). Los dos insertan una línea nueva y pasan al modo inserción. o agrega una línea después de la línea actual, mientra que O lo hace antes de la línea actual.

Resumen de comandos

Moverse

h ir un carácter a la izquierda
j ir una línea abajo
k ir una línea arriba
l ir un carácter a la derecha
0 ir al principio de la línea actual
$ ir al final de la línea actual
w avanzar al principio de la palabra siguiente
e avanzar al final de la palabra siguiente
b ir atrás de una palabra
% ir al símbolo correspondiente: () [] {}
G ir a la última línea
gg ir a la primera línea

Las teclas flecha, principio y fin también funcionan como esperado.

Buscar

/xyz buscar la secuencia de carácteres xyz hacia adelante
n repetir la última búsqueda
N repetir la última búsqueda hacía atrás

Insertar texto

i insertar antes del carácter actual
a insertar después del carácter actual
o insertar una línea después de la línea actual
O insertar una línea antes de la línea actual
I insertar antes del primer carácter no blanco de la línea actual
A insertar despues del último carácter no blanco de la línea actual

Suprimir texto

x borrar el carácter bajo el cursor
dd borrar la línea actual
dM borrar hasta donde el movimiento M llevaría el cursor
D borrar desde la posición actual hasta el fin de la línea

El texto borrado es puesto dentro del búfer temporario.

Copiar y pegar texto con el búfer temporario

yy copiar la línea actual en el búfer
yM copiar texto al búfer hasta donde el movimiento M llevaría el cursor
p pegar el texto del búfer después de la línea actual
P pegar el texto del búfer antes de la línea actual

Modificar texto

rc reemplazar el carácter actual con c.
cc reemplazar la línea actual por una vacía, entra al modo inserción
C reemplazar desde la posición actual hasta el final de la línea
R entrar al modo reemplazo

Comandos empezando por dos-puntos

:q salir
:q! salir sin chequear que el archivo fue guardado
:w guardar el archivo
:wq guardar y salir
:10 ir a la línea 10

Estos comandos tienen que ser confirmados con la tecla ENTER.

Otros

u cancelar el último cambio
U cancelar todos los cambios en la línea actual
. repetir el último comando de cambio
ZZ guardar y salir

Fuentes

El contenido de esta página fue traducido y modificado a partir de las páginas siguientes: