Editor VI Extenso

Anuncio
Introducción
Se aconseja la lectura previa del documento Manejo de terminales en UNIX para mejor
entender el funcionamiento del vi.
Es un EDITOR, no un PROCESADOR DE TEXTOS. Está hecho para escribir y
modificar ficheros de texto sencillos, programas, etc. No permite justificar párrafos,
utilizar distintos tipos de letra, escribir a varias columnas, insertar gráficos, etc. No hay
ningún programa de estas características que se proporcione con UNIX. Normalmente,
es necesario adquirirlos por separado.
El editor vi es el más utilizado en ordenadores que utilicen el sistema operativo UNIX.
Los usuarios no informáticos lo consideran demasiado complicado, sobre todo
acostumbrados a los editores del sistema operativo DOS. Por eso se tiende a
considerarlo muy atrasado, sin embargo es realmente potente. Su dificultad de manejo
se justifica por las características de los terminales que había cuando fue diseñado y
porque un objetivo primordial de su diseñador fue que pudiera ser utilizado en casi
cualquier tipo de terminal por lo que no requiere el uso de teclas especiales, como las de
movimiento del cursor o las de función (aunque en la mayoría de los terminales, las
teclas de flechas sí se pueden utilizar, si se desea). Claro, esto es a costa de su sencillez
de manejo. Es más sencillo para un usuario pulsar, por ejemplo, la tecla F10 para grabar
el fichero que: w.
Comandos e introducción de texto
Por tanto, queda claro que no se pueden usar las teclas de función. En el vi a muchas
funciones (como grabar fichero, borrar líneas, etc) se accede de dos formas posibles:
Usando la tecla Ctrl
Pulsar esa tecla (también llamada Control) junto con otra tecla alfabética. Por ejemplo,
si dejo pulsada la tecla Ctrl mientras pulso f, avanzaré una página en mi documento.
Hay que hacer notar que esto es posible porque todos los terminales generan el mismo
código numérico al pulsar Ctrl junto con una letra, por tanto no hay problema de
incompatibilidad entre fabricantes,
Usando comandos compuestos de teclas normales
Estos últimos requieren una explicación. A base de utilizar sólo comandos compuestos
por la tecla Ctrl y otra letra alfabética, tengo sólo 26 posibilidades (a...z) ya que Ctrla genera el mismo código que Ctrl-A (aquí no hay diferencia entre minúsculas y
mayúsculas). Si no puedo usar las teclas de función ni otras especiales (por
incompatibilidad entre fabricantes), ¿cómo puedo acceder a las muchas funciones que
tiene el editor? Pues mediante teclas normales. Pero si me dicen que el símbolo $
significa ir al final de la línea, esto no parece lógico, porque si pulso ese carácter,
aparecerá en la pantalla tal como lo escribo.
Por eso el vi tiene dos modos de funcionamiento, entre los cuales el usuario debe
alternar continuamente durante una sesión de edición:
Modo edición
Todo lo que escribo, aparece en pantalla, como es habitual en todos los editores.
Modo comando
Lo que escribo estando en este modo (al cual se accede pulsando la tecla ESC, llamada
también escape), las teclas tienen un significado especial. Por ejemplo, $ mueve el
cursor hasta el final de la línea, j lo mueve una línea hacia abajo, w graba el fichero, q
es para salir del editor.
Del modo edición se pasa al modo comando usando la tecla ESC. Del modo comando
se pasa al modo edición con alguna de las siguientes teclas: i, I, a, A, o, O (y
alguna otra).
Hay que tener presente que al entrar en el editor vi, el modo inicial es el MODO
COMANDO.
Entrada al editor vi
Si estamos en un terminal trabajando con un ordenador central que funcione con el
sistema operativo UNIX (en cualquiera de sus muchas variantes), usaremos el programa
vi para editar un fichero con el siguiente comando:
vi fichero
Tras ejecutar ese comando, se borra la pantalla y, si el fichero ya existía
previamente, aparece su contenido. Si no existía, quedan todas las líneas de la
pantalla vacías pero con una tilde (~) al principio. Con esa tilde representa el vi las
líneas que están vacías.
Si no ocurre de esta forma y la pantalla queda desencajada, el problema puede estar
relacionado con la variable TERM. Véase Manejo de terminales en UNIX para saber
cómo solucionarlo.
Como dijimos antes, nada más entrar en el vi, estamos en el MODO COMANDO.
Podemos usar aquí cualquiera de los comandos que veremos más adelante aplicables en
este modo (y que están resumidos al final de este documento). Si queremos escribir algo
en el fichero, iremos (en el modo comando) al lugar donde deseamos empezar a escribir
y pulsaremos una de las teclas que nos pasan al MODO EDICION. En ese momento,
todo lo que escribamos aparecerá en la pantalla.
Una cosa que hay que tener en cuenta en el manejo del vi es que conviene estar el
máximo tiempo posible en el modo COMANDO, pues así las modificaciones no
deseadas en el texto son menores. En cuanto terminemos de escribir, debemos pulsar
ESC para ir al modo comando. Si queremos editar en otra parte del fichero, iremos a esa
parte en este modo y en ahí pasaremos de nuevo al modo edición.
Primeros comandos
Antes que nada, tendremos que empezar a escribir algo en un fichero. Si vamos a llamar
a este con el nombre primero, ejecutamos desde UNIX:
vi primero
Al pulsar la tecla INTRO aparece la pantalla vacía con una tilde al principio de
cada línea. Estamos en modo comando, por lo que para comenzar a escribir hay
que pasar al modo edición. La forma más habitual de hacer esto es con el comando
i. Al pulsar esa letra, no ocurre nada, no vemos ningún cambio en la pantalla, pero
el modo ha cambiado al de EDICION.
Comenzamos ahora a escribir y el texto va apareciendo en la pantalla. Si escribimos
más letras de las que caben en el ancho de la misma (normalmente 80 caracteres),
continuarán por la línea siguiente.
Si nos equivocamos en una letra, podemos usar la tecla de borrado (normalmente tiene
la inscripción <- o Backspace) para eliminar la última letra escrita. Si seguimos
pulsando la tecla, borraremos las letras anteriores. Pero sólo podemos borrar así las
últimas que hayamos escrito. Si escribimos un texto, luego pasamos al modo comando
para hacer algo, y luego otra vez al modo edición, la tecla de borrado no me sirve para
borrar lo que escribí antes. Habrá que moverse al sitio donde quiero borrar y usar el
comando para ello. Algunos de los comandos que usaremos para estas operaciones
(todos ellos se utilizan en MODO COMANDO) son (atención a la diferencia entre
mayúsculas y minúsculas):
i
Pasar a modo EDICION (ya se ha explicado)
h
Desplaza el cursor una posición a la izquierda
j
Idem a la línea inferior
k
Idem a la línea superior
l
Idem una posición a la derecha
^f
Desplaza el cursor una pantalla hacia adelante (unas 24 líneas)
^b
Idem hacia atrás
^g
Nos informa del nombre del fichero que estamos editando, del número de la
línea en la que estamos, y del número total de líneas del fichero.
G
Ir al final del fichero.
1G
Ir al principio del fichero.
x
Borra el carácter sobre el que está el cursor
dd
Borra la línea sobre la que está el cursor
^
Desplaza el cursor al principio de la línea actual
$
Idem al final de la línea
:w!
Graba el fichero (y seguimos dentro del vi)
: q!
Salir del editor, sin grabarlo previamente
:wq!
Salir del editor, grabando previamente el fichero
En la mayoría de terminales, se pueden usar las teclas de flechas en lugar de h, j, k, l.
Hay que aclarar dos cosas en esta lista:
En primer lugar, usaremos la nomenclatura ^f para indicar que se mantiene pulsada la
tecla Ctrl mientras pulsamos f.
En segundo lugar, el comando 1G es especial porque lleva un número al comienzo.
Cuando ocurre esto, se considera como si dijéramos ejecuta el comando G con el
argumento 1. Casi todos los comandos pueden llevar un número delante. En el caso del
comando G, el número indica a qué línea del fichero queremos ir. Así, 1G significa ir a
la línea 1, 20G es ir a la línea 20. Una sola G indica ir a la última línea.
En la mayoría de los comandos, un número precediendo al comando significa ejecuta n
veces este comando. Así, si dd significa borrar una línea, 5dd significa borrar 5 líneas
(la actual y las cuatro siguientes).
Los comandos que se ejecutan en modo comando no aparecen por pantalla, a excepción
de los que empiezan por /,? o :
Otros comandos para pasar al modo edición
Ya hemos mencionado que para entrar en el modo edición se usa el comando i (de
insertar). Al pulsarlo, lo que escribamos se añade justo donde está el cursor. A veces,
debemos usar otro comando. Este es el caso de tener que añadir texto al final de una
línea. Si tenemos una línea tal como la siguiente:
En un lugar de la Mancha
Si nos desplazamos al final para añadir lo que falta, el cursor no pasará más allá
de la última a (nunca se puede mover el cursor después del último carácter de una
línea). Si ahora pulsamos i y escribimos un texto, éste se insertará entra la h y la a.
Lo que queremos en este caso no es INSERTAR, sino AÑADIR. Para ello se usa el
comando a. Al introducirlo, el cursor -que estaba, recordemos, encima de la o- se
sitúa después de esta letra, permitiéndonos escribir ahí.
Otro caso que se puede presentar es la necesidad de escribir texto ANTES de la primera
línea. ¿Cómo podemos hacerlo?. Si pulsamos i, insertamos texto en la línea actual. Se
podría hacer lo siguiente:
Situar el cursor al principio de la primera línea
Pulsar i para insertar
Pulsar INTRO para insertar una línea en blanco
Pulsar ESC para pasar al modo comando
Pulsar k (o flecha arriba) para subir a la línea anterior
Pulsar i para insertar
Ya hemos abierto una línea y podemos escribir. Pulsando INTRO podemos abrir
más líneas si queremos. Para evitar esa secuencia tan tediosa, hay otro comando
significa abrir una línea antes de la que está el cursor y pasar en ella al modo
edición. Este comando es O (o mayúscula).
Un comando relacionado es o (o minúscula) que significa abrir una línea después de la
actual y pasar en ella al modo edición. La usaremos por ejemplo para añadí líneas al
final del fichero.
Resumimos los comandos para pasar al modo edición (hay alguno más pero estos son
los más habituales):
i
Insertar texto delante de donde está el cursor
a
Añadir texto a continuación de donde está el cursor
O
Abrir una línea antes de la actual y editar en ella
o
Abrir una línea después de la actual y editar en ella
Practiquemos con un ejemplo. Tenemos el texto:
Con diez cañones por banda,
No cruza el mar sino vuela,
un velero bergantín.
Evidentemente, falta el segundo verso. Si queremos escribirlo ahora, vamos a
indicar tres formas de hacerlo (suponemos que estamos en modo comando):
Forma 1
Ir a la primera línea.
Ir al final de ella (con $ o pulsando l hasta llegar al final)
Pulsar a para añadir
Pulsar INTRO. Esto inserta un salto de línea, o sea, una línea nueva y deja el
cursor al principio de la misma. Ya podemos escribir
Forma 2
Ir a la primera línea
Pulsa o. Esto inserta una línea debajo y pone el cursor en ella. Ya podemos
escribir.
Forma 3
Ir a la segunda línea
Pulsar O. Esto inserta una línea encima de la actual y pone el cursor en ella. Ya
podemos escribir.
Borrar y copiar
En cualquier editor, las operaciones de borrado y copiado de texto son muy importantes,
pues se usan muy a menudo. Ya mencionamos en el apartado 3 algunos comandos para
borrar. Damos aquí una lista más amplia:
x
Borra el carácter sobre el que está el cursor.
dd
Borra la línea en la que está el cursor.
d$
Borra desde el cursor hasta el final de la línea.
J
Une, al final de la línea actual, la siguiente (borra la separación entre
ambas).
:1,10d
Borra las líneas 1 a la 10.
:10,$d
Borra las líneas desde el número 10 hasta la última.
:,$d
Borra las líneas comprendidas entre la actual y la última.
Para copiar texto de un sitio del fichero a otro, primero hay que marcar el texto que
vamos a copiar, luego ir al sitio donde queremos copiarlo, y dar la orden de copia. Esta
orden de copia es el comando p. Hay varia formas de marcar el texto que queremos
copiar. Por ejemplo:
Y
Marca la línea actual.
3Y
Marca tres líneas (la actual y las dos siguientes).
:1,y
Marca desde la primera línea hasta la actual.
:,$y
Marca desde la línea actual hasta el final.
Por ejemplo, si tenemos el texto:
Con diez cañones por banda,
viento an popa a toda vela.
No cruza el mar sino vuela,
un velero bergantin.
Queremos copiar las dos primeras líneas al final del texto. Para ello, situamos el
cursor en la primera línea (se supone que estamos en modo comando; para
asegurarnos, no está de más pulsa la tecla ESC) y usamos el comando 2Y (marcar
dos líneas). A continuación, movemos el cursor hasta la última línea y usamos el
comando p (este comando añade las líneas marcadas en la línea SIGUIENTE a la
que está el cursor).
Si queremos copiar de la línea actual sólo lo que hay desde el cursor hasta el final,
marcamos eso con y$. Para marcar desde el principio de la línea hasta el cursor: y^.
Luego vamos al sitio donde queramos pegarlo y usamos el comando p.
Rangos de líneas
En algunos comandos, como vimos por ejemplo en el caso de dd, podemos indicar el
rango de líneas en que hay que aplicarlo. Por ejemplo, 10dd significa borrar 10 líneas
(la actual y las 9 siguientes). ¿Y si queremos borrar todas las líneas desde donde
estamos hasta el final del fichero? No es necesario contar cuántas son, pues podemos
hacer :,$d
El comando :d también sirve para borrar líneas. A la mayoría de los comandos que
comienzan por :,/,? podemos aplicar un rango de líneas a las que queremos aplicar el
comando. Ese rango puede ser o un número de línea o un par de ellas separadas por
coma. Si dejamos una sin número, indica la línea actual. Un signo $ indica la última
línea. Ejemplos:
:1,d
Borra desde la primera línea hasta la actual
:1,$d
Borra todo el fichero
:,$d
Borra desde la línea actual al final
:1,10d
Borra las 10 primeras líneas
Puede haber un problema si queremos borrar un tango de líneas pero no sabemos cuáles
son sus números. Para ello el vi tiene un comando que hace que todas las líneas
aparezcan en pantalla numeradas:
:set number
vi tiene unos cuantos comandos para activar y desactivar determinadas
características. Una lista exhaustiva se da al final de este manual. Si se desea usar
siempre el vi con las líneas numeradas, en vez de escribir siempre el comando, se
puede añadir esa línea al fichero .exrc de nuestro directorio actual.
Hemos visto cómo referirnos a la primera línea, a la última, la actual y a cualquier línea
por su número. También podemos indicar líneas por su posición relativa a la actual:
:,+5d
Borrar la línea actual y las cinco siguientes.
:-2,+2y
Marca desde dos líneas antes de la actual hasta dos después
Búsqueda y sustitución
El editor vi es bastante potente en lo que se refiere a búsqueda y sustitución de texto,
pues no se limita a palabras exactas, sino que puede tratar con patrones. Podemos
pedirle, por ejemplo, que busque las líneas que comienzan por un número, o las palabras
que tienen 7 caracteres, etc. La sintaxis de estos patrones es algo complicada, pero no
está de más aprenderla si se va a trabajar frecuentemente con UNIX, pues muchos otros
programas utilizan una sintaxis muy semejante. Los comandos para buscar son:
/
Buscar hacia adelante (desde el cursor hasta el final del fichero)
?
Buscar hacia atrás (desde el cursor al principio del fichero)
Al usar cualquiera de estos comandos, aparece en la última línea de la pantalla dicho
comando (sea / o ?) y el cursor a continuación. Ahí debemos introducir lo que
queremos buscar, e INTRO a continuación. Si el texto o patrón es encontrado, el cursor
se posicionará en él. Pulsando sucesivamente / o ? seguidos de INTRO (es decir, sin
introducir texto de búsqueda), se localizará la siguiente (en caso de /) o anterior (en caso
de ?) ocurrencia del texto buscado.
La explicación de los patrones de búsqueda está más allá de este texto (está explicada en
la página de manual UNIX del comando ed; se puede ver con la orden orden man ed),
pero debemos explicar algunas cosas. Por ejemplo, el patrón
^[0-9]:
buscará las líneas que comiencen (esto se indica con ^) por un dígito (indicado por
[0-9]) y luego el carácter :. otro ejemplo:
^.. ...$
Busca las líneas compuestas únicamente por dos caracteres, un espacio y 3
caracteres más. El carácter ^ indica el comienzo de línea; el $ indica el final de
línea y el punto un carácter cualquiera. Así estamos indicando que entre el
principio y el final sólo debe haber dos caracteres cualesquiera, un espacio y otros
tres caracteres.
El problema que se plantea es cuando queremos buscar el texto
100$
Si lo buscamos con /100$, el signo $ se interpretará como fin de línea. Nosotros no
queremos que sea así, sino buscar en el texto ese carácter. El mismo problema
tenemos con los signos que tienen un sentido especial (como ^,[,],.). Estos
caracteres deben ir con el signo [bsol ] delante para que se tomen literalmente,
sin su sentido especial. Así para buscar 100$ sería:
/100\$
Esto se aplica a los siguientes caracteres:
^ $ . [ ] / \
Para SUSTITUIR texto, se usa el comando:
:s/texto a buscar/texto sustituto/
Al introducir :s, el cursor va a la última línea
de la pantalla y ahí escribimos el
resto del comando. Eso sustituirá en la línea actual el texto a buscar por texto
sustituido. Si queremos hacer esta operación en todo el fichero, haremos:
:1,$s/texto a buscar/texto sustituto/
Vemos que entre el carácter :y la letra s podemos
indicar el rango de líneas.
El comando s sustituye, como hemos dicho, un texto por otro, pero sólo la primera vez
que aparezca el texto a buscar en cada línea. Si queremos sustituir todas las veces que
aparezca, añadimos al final g:
:1,$s/texto a buscar/texto sustituto/g
Como ya hemos dicho, en la página del manual del comando ed se explica todo esto en
más profundidad.
Otras posibilidades
Algunas de las muchas posibilidades adicionales que permite el vi, pero que no vamos a
detallar son:
Registros
Los registros son como zonas de memoria donde podemos guardar trozos de texto para
pegarlos en otros lugares. Ya vimos cómo hacer esto con los comandos Y, y y p, pero
sólo con un trozo a la vez.
Marcar lugares del texto
Podemos marcar puntos determinados del texto y movernos de unos a otros de forma
sencilla.
Macros
Si hay secuencias de teclas que repetimos muy a menudo, podemos definir un comando
especial que realice todos ellos con sólo dar ese comando.
Por último, en la siguiente table mencionamos algunos comandos útiles (atención a
la mayúsculas y minúsculas, ya que al no ser comandos que se usan con la tecla
Ctrl esto es importante):
.
Repite el último comando.
u
Deshacer el último cambio (undo).
J
Pega la línea siguiente al final de la actual.
%
Si usamos este comando cuando el cursor está situado sobre alguno de
estos caracteres: (,{,[ o su correspondiente cerrado, el cursor se va
hacia el lugar del documento donde esté el que lo cierra (o abre). Esto
es muy interesante cuando se están editando programas.
Abandonar el documento actual y cargar el otro fichero. Si no hemos
:efichero grabado el actual, no nos lo permitirá a menos que usemos el comando
:e! fichero.
:rfichero
Carga el contenido del fichero en el lugar del documento actual donde
esté el cursor.
:w
fichero
Grabar el documento con el nombre fichero (que puede no coincidir
con el nombre de que estamos editando).
:,$w
fichero
Grabar desde la línea actual hasta el final en el fichero.
:n
Si hemos ejecutado el vi con varios nombres, por ejemplo: vi *.c, con
este comando abandonamos el actual y pasamos a editar el siguiente. Si
no hemos grabado el actual no nos lo permitirá a menos que usemos
:n!.
^l
Si aparecen mensajes por la pantalla o ésta se queda desajustada, con
este comando la refrescamos.
c$
Cambiar hasta el final de la línea. Tras escribir este comando, todo lo
que escribamos a continuación hasta que pulsemos ESC sustituirá a lo
que había desde el cursor hasta el final de la línea.
c^
Lo mismo pero sustituirá a lo que hay desde el principio de la línea
hasta el cursor.
cw
Lo mismo pero sustituirá a la palabra sobre la que está el cursor.
:!sh
Ejecutar una subshell donde podemos escribir comandos del sistema
operativo. Cuando la abandonemos (con exit) volvemos al vi.
Para terminar, admitir que a pesar de su potencia es difícil dominar todo lo que hemos
visto, y difícil es explicarlo, pero creo que se entiende fácilmente la lógica de sus
comandos, y a veces aunque no se sepa qué comando existe para hacer algo, se puede
deducir. Por ejemplo, ¿ cómo marco la palabra actual y las tres siguientes para pegarlas
en otro lado? No es difícil pensar que será el mismo comando para marcar una palabra,
yw repetida tres veces, por tanto: 3yw.
Descargar