El editor vi es el editor por excelencia de UNIX. Es bastante potente y complicado de manejar a pleno rendimiento, debido a la gran cantidad de opciones que tiene, pero es fácil dar los primeros pasos e ir avanzando poco a poco. Es difícil de utilizar al principio, pero puede llegar a convertirse en el más cómodo y rápido.
En UNIX existen otros editores más potentes, con entornos de trabajo más amigables, otros más sencillos de manejar, pero el único editor que está en todas las versiones y se maneja igual es el vi.
La sintaxis del comando vi es, al igual que la de cualquier comando UNIX:
vi [opciones] archivo
Entre las opciones más importantes se pueden destacar:
En vi existen 3 modos de trabajo:
En las páginas siguientes se detallan los comandos más importantes de vi clasificados según el modo en que se ejecutan y las tareas que realizan.
vi es independiente del tipo de terminal, pero la variable de ambiente TERM debe estar fijada correctamente. Si no se conoce o no existe, en la base de datos de terminales del sistema, el tipo exacto de terminal con el que se está trabajando, se puede usar el tipo vt100 o el ansi (dan buenos resultados en la mayoría de los terminales).Para modificar el tipo de terminal se deberá teclear:
TERM=[tipo de terminal];export TERM
o directamente:
export TERM=[tipo de terminal]
Con algunos comandos, especialmente more y a veces vi, el terminal o el emulador que se está usando pueden no responder bien, que no aparezcan los cambios que se realizan correctamente en la pantalla. En estos casos, puede usarse Ctrl-l para refrescar la pantalla.
Un usuario puede generar bajo su directorio $HOME un archivo llamado .exrc, en el que podrá adaptar el entorno del editor vi a su gusto. En este archivo se pueden incluir:
set [opcion[=valor]]
ab [abr] [cadena]
map [Key|#n] [acción]
donde:
Tanto las opciones, como las abreviaturas y macros se pueden definir en modo ex para la edición en curso, pero solo tendrán valor durante la edición actual, no siendo válidas para las siguientes llamadas al comando vi. Por ello, para que afecte a cualquier llamada del comando vi, será necesario insertarlas en el archivo .exrc exrc (en el directorio de cada usuario). Para ver todas las opciones por defecto, desde vi habrá que escribir (en modo ex):
:set all
En la siguiente tabla podemos ver algunas opciones del editor que podemos encontrar:
Opción | Abrev. | Valor por defecto | Efecto al configurarla |
---|---|---|---|
all | ˜ | ˜ | Presenta una lista de todas las opciones del editor en la pantalla. |
autoindent | ai | noai | Comienza cada nueva línea de texto de la misma columna como la línea anterior (útil para los programadores). |
ignorecase | ic | noic | Hace que vi haga caso omiso de las mayúsculas y minúsculas durante las búsquedas. |
number | nu | nonu | Numera cada línea de texto. |
readonly | ˜ | noreadonly | Activa la protección contra escritura en el archivo que esté en proceso de modificación. Esto impide que se cambie o destruya accidentalmente el contenido del archivo. |
showmatch | sm | nosm | Muestra el paréntesis o corchete de apertura cuando se escribe el correspondiente paréntesis o corchete de cierre. Esta opción resulta útil cuando se escriben expresiones matemáticas o se redactan programas en un lenguaje que utilice paréntesis o corchetes. |
showmode | ˜ | noshowmode | Muestra un mensaje como MODO DE ENTRADA o MODO DE SUSTITUCION en la parte inferior de la pantalla siempre que se está en alguno de los dos modos. |
wrapmargin | wm | wm=0 (cero) | Cambia el margen derecho. n es igual al número de espacios que hay en el margen derecho. Por ejemplo, si utiliza un terminal de 80 columnas, :set wm=8 configura el margen derecho en la columna 72. |
Como ejemplo, si en el archivo .exrc escribimos:
set nu set showmode set ai ab xq por que ab cqd como queriamos decir map K :1^M
Cada vez que utilicemos el editor vi tendremos:
i |
Insertar antes del cursor. |
I |
Insertar al principio de la línea. |
a |
Añadir después del cursor. |
A |
Añadir al final de la línea. |
o |
Abrir línea debajo de la actual. |
O |
Abrir línea encima de la actual. |
R |
Sobreescribir (cambiar) texto. |
r |
Sobreescribir el carácter sobre el que está el cursor. |
c |
Reemplaza caracteres. |
cw |
Reemplaza palabras. |
C o c$ |
Reemplaza hasta el fin de línea. |
c0 |
Reemplaza desde el comienzo de línea. |
Los comandos de reemplazo admiten multiplicadores que consisten en un número antecediendo al comando. Al dar un comando de reemplazo el editor coloca un símbolo $ en donde termina el pedido de reemplazo. El usuario sobrescribe normalmente hasta donde necesite, y sale con la tecla ESC. Estos comandos admiten multiplicadores, por ejemplo 3cw abre un área de reemplazo para 3 palabras.
BS (Back Space) |
Borrar carácter hacia la izquierda. |
ESC |
Salir de Modo Texto y pasar a modo comando. |
Algunos de estos comandos admiten multiplicadores, que consisten en un número antecediendo al comando.
flechas |
Mover en distintas direcciones. |
h ó BS (Back Space) |
Una posición hacia la izquierda. |
l ó SP (Espacio) |
Una posición hacia la derecha. |
k ó - |
Una línea hacia arriba. |
j ó + |
Una línea hacia abajo. |
$ |
Fin de línea. |
0 (Cero) |
Principio de línea. |
1G |
Comienzo del archivo. |
G |
Fin del archivo. |
18G |
Línea número 18. |
Ctrl-G |
Mostrar número de línea actual. |
w |
Comienzo de la palabra siguiente. |
e |
Fin de la palabra siguiente. |
E |
Fin de la palabra siguiente antes de espacio. |
b |
Principio de la palabra anterior. |
^ |
Primera palabra de la línea. |
% |
Hasta el paréntesis que aparea. |
H |
Parte superior de la pantalla. |
L |
Parte inferior de la pantalla. |
M |
Al medio de la pantalla. |
23| |
Cursor a la columna 23. |
Ctrl-f |
Una pantalla adelante. |
Ctrl-b |
Una pantalla atrás. |
Ctrl-l |
Refrescar la pantalla. |
Ctrl-d |
Media pantalla adelante. |
Ctrl-u |
Media pantalla atrás. |
/str |
Buscar hacia adelante cadena de caracteres 'str'. |
?str |
Buscar hacia atrás cadena de caracteres 'str'. |
n |
Buscar siguiente (si se usó /) o anterior (si se usó ?). |
N |
Buscar anterior (si se usó /) o siguiente (si se usó ?). |
fc |
Buscar el siguiente carácter 'c' en la línea. |
Fc |
Buscar el anterior carácter 'c' en la línea. |
tc |
Ir al carácter anterior al siguiente 'c'. |
Tc |
Ir al carácter posterior al precedente 'c'. |
; |
Repetir el último comando f, F, t, o T. |
, |
último comando f, F, t, o T en sentido inverso. |
La cadena a buscar en / o ? puede ser una expresión regular.
La acción de f, F, t y T alcanza sólo a la línea actual; si el carácter buscado no está en esa línea el cursor no se mueve.
x |
Borrar carácter bajo el cursor. |
dd |
Borrar línea, queda guardada. |
D |
Borrar desde cursor a fin de línea. |
dw |
Borrar desde cursor a fin de palabra. |
d$ |
Borrar desde cursor a fin de línea. |
d0 |
Borrar desde cursor a principio de línea. |
d) |
Borra hasta el final del párrafo. |
Y o yy |
Copiar línea. |
P |
Pegar antes del cursor. |
p |
Pegar después del cursor. |
yw |
Copiar palabra. |
y$ |
Copiar de cursor a fin de línea. |
"ayy o "aY |
Copiar línea en buffer llamado 'a'. |
'a' "ayw |
Copiar palabra en buffer llamado 'a'. |
"ap |
Pegar desde buffer 'a', a la derecha del cursor. |
"aP |
Pegar desde buffer 'a', a la izquierda del cursor. |
"bdd |
Borrar línea y guardar en buffer 'b'. |
"bdw |
Borrar palabra y guardar en buffer 'b'. |
J |
Unir la línea actual y la siguiente (suprimir el retorno de carro). |
ZZ |
Grabar cambios si los hubo y salir. |
u |
Deshacer última acción. |
U |
Deshacer todos los cambios en una línea desde que se posicionó el cursor en ella. |
. |
Repetir el último comando. |
:q |
Salir si no hubo cambios. |
:q! |
Salir sin guardar cambios. |
:w |
Guardar cambios. |
:w arch1 |
Guardar cambios en archivo arch1. |
:wq |
Guardar cambios y salir. |
:r arch2 |
Insertar un archivo. |
:e arch2 |
Editar un nuevo archivo. |
:e! arch2 |
Idem sin salvar anterior. |
:r! comando |
Insertar salida de comando. |
:shell |
Salir al shell (vuelve con exit). |
:.= |
Muestra el número de línea en que se halla en cursor. |
:1 |
Mueve a línea 1. |
:15 |
Mueve a línea 15. |
:$ |
Mueve a última línea. |
:set |
Cambio de opciones. |
:set nu |
Mostrar números de línea. |
:set nonu |
No mostrar números de línea . |
:set showmode |
Mostrar modo actual de vi. |
:set noshowmode |
No mostrar modo actual de vi. |
:ab [abr] [cadena] |
Cada vez que se teclee la cadena abr, ésta se expandirá escribiendo cadena. |
:ab |
Muestra las abreviaturas creadas. |
:una [abr] |
Elimina la abreviatura abr. |
:map [c] [accion] |
Genera la macro c que ejecutará la acción indicada. |
:map |
Muestra las macros definidas. |
:[desde],[hasta] s/[buscar]/[reemplazar]/ |
Reemplaza todas la primera ocurrencia de la cadena [buscar], en cada línea, por la cadena [reemplazar] entre las líneas [desde] y [hasta] del archivo. |
:[desde],[hasta] s/[buscar]/[reemplazar]/g |
Reemplaza todas las ocurrencias de la cadena [buscar] por la cadena [reemplazar] entre las líneas [desde] y [hasta] del archivo. |
:[desde],[hasta] d |
Borra las líneas comprendidas entre las líneas [desde] y [hasta]. |
:1,$s/Martes/martes/g |
Cambia Martes por martes en todo el archivo. |
:.,5s/ayuda/&ndo/g |
Cambia ayuda por ayudando desde línea actual hasta la 5ª línea. |
:.,$ d |
Elimina todas las líneas desde la línea actual al final del archivo. |
:ab pp Hola Pepe |
Cada vez que se teclee "pp " se expandirá en "Hola Pepe". |