10 enero, 2008

Manual vi

Introducción:

El vi es el editor estándar de Unix. Este trabaja en modo 'full screen' . El vi tiene dos modos de trabajo:

-comandos e insercción. En el modo comandos todo lo que el usuario introduce es interpretado como un comando;

-en el modo insercción lo que el usuario introduce es tetxo qu eserá guardado en el archivo de salida.

La mejor forma de aprender a utilizar el vi es utilizándolo por ejemplo modificando un archivo existente (sea cuidadoso no edite o modifique un archivo que sea necesario, utilice un archivo de test con una copia de un archivo. Por ejemplo haga lo siguiente

% vi test

Cuando Ud entra en el editor puede salir pasando primero al modo comando. Esta acción se realiza mediante la tecla ESC el cursor bajará a la última línea y pondrá los ':' este prompt (:) indica que está en el modo comando, por ejemplo para salir descartando todas las modificaciones es q! generalmente todos los comando son la primera letra de la acción (quit en este caso) y en el caso de ! indica que sin confirmación. Si se desean salvar los cambios será w (por write) y salvar los cambios y salir wq (por write & quit).


Modo Comando

El editor se inicia en el modo comando. Hay diferentes formas de ir al modo de insercción pero siempre se regresa a este modo con la tecla de ESC. Si no se está seguro en que modo está presione el ESC hasta que oiga un beep, lo cual le indicará que está en modo comandos.

Los comandos básicos de vi son:

:wq Salvar y Salir
:q! Salir sin salvar:
a Append: Modo insertar e la siguiente posición del cursor
i Insert: Modo insertar sobre la posición del cursor
x Borra caracter bajo el cursor
dw Borra palabra
dd Borra línea
u Deshacer (Undo)
Ctrl-F Pantalla sgte.
Ctrl-B Pantalla anterior
O Inserta línea en blanco

Secuencia de comandos básicos

El vi utiliza el editor ex cuando trabaja en modo comandos y siempre es la última línea de la pantalla con el prompt : por donde se le indican los comandos al ex. Los comandos admiten repetición que indicará cuantas veces se ejecutará el comando. Por ejemplo dd borra una línea pero 4dd borrará 4 líneas. La mayoría de los comando no producen salida por display de la acción, pero si cuando la acción es finalizada, por ejemplo cunado ponga 11dd (borrar 11 líneas) el vi le dirá '11 lines deleted'.

Movimientos dentro del archivo

Ud. debe estar en modo comando para moverse dentro del archivo. Generalmente las teclas de cursor funcionan bien (pueden no funcionar si Ud. está conectado a través de un emulador de terminal - desde un PC por ejemplo - y no coincide la variable TERM de Unix con la que Ud. está emulando, solución: cambie la variable TERM con -en csh- setenv TERM vt100 -en sh- TERM=vt100 export TERM y en el emulador seleccione como terminal vt100). Si Ud. está en modo insertar y presiona las teclas de cursor le insertará el caracter que ellas representan. Presionando la tecla RETURN se moverá a la siguiente línea. La tabla siguiente muestra los movimientos más comunes:

Return Siguiente línea
j Siguiente línea
k Línea previa
l Siguiente caracter
h Caracter anterior
Ctrl-F Pantalla siguiente
Ctrl-B Pantalla anterior
Ctrl-D Media pantalla siguiente
Ctrl-U Media pantalla anterior
[[ Inicio documento
]] Fin documento
nG Ir a línea n
w una palabra a la derecha
b una palabra a la izquierda
{ fin párrafo
} fin párrafo anterior
/string Busca string

Para ir a la línea 10 introduzca 10G (si sólo introduce G se moverá hasta el final del archivo). Para averiguaren que línea está presione Ctrl-G. Las palabras, sentencias, y párrafos tienen especial significado para el vi y existen comandos para moverse a través de ellas. Una palabra es cualquier caracter delimitado por blancos o puntuación y también cada símbolo de puntuación es una palabra. Sin embargo si Ud. utiliza la mayúcula del comando de movimiento se saltará la puntuación, por ejemplo B es lo mismo que b y mueve el cursor una palabra hacia atrás pero si hay un punto b se parará aqui pero B no.

Una sentecia es un string con un punto final y dos espacios en blanco. Con ) y ( Ud. se moverá hacia adelante una sentencia o hacia atrás respectivamente.

Un párrafo es el que termina con dos Return.

Búsqueda de strings

Las búquedas se realizarán en modo comando y para iniciarla debe presionar /. Esto causará que el cursor baje a la línea inferior, indique el string a buscar finalizando con un Return. Si desea buscar en orden inverso presione ? en vez de /.


Modo texto

Antes de ir al modo texto recordar que siempre se sale de él mediante un . La tabla siguiente muestra los

comando básicos para pasar a modo texto.

a append inserta después del caracter sobre el cual estamos
i insert antes de caracter sobre el que estamos
A append al final de la línea actual
I insert antes del 1º caracter diferente de espacio en la línea corriente
o abre una línea en blanco abajo de la actual
O ídem anterior pero sobre la actual

Correcciones

La única forma de corregir un error en modo texto es hacer un backspace y reintroducir los caracteres.

Correcciones más complejas deben ser realizadas desde el modo comandos. La tabla siguiente muestra los

comando que pueden ser utilizados:

x borra caracter
dw borra palabra
dd borra línea
r reemplaza un caracter sobre el cursor
R reemplaza un string de caracteres (sobreescribe)
cw cambia una palabra
s sustituye un caracter por un string
. repite el ultimo cambio

Un comando interesante es el punto (.) el cual repite el último cambio hecho en edición. Este puede ser

utilizado para cambiar cada ocurrencia de un string con otro, por ejemplo: si introducimos el comando /feo para buscar el string "feo". Entonces entre el comando cw e introduca "lindo" para reemplazar feo por lindo. Presione para aceptar el cambio. Para encontrar la siguiente ocurrencia introduzca el comando n y luego . para repretir el último cambio.


Comandos ex

La flexibilidad del vi está en el editor ex. En particular operaciones de búsqueda global y reemplazo están soportadas por el ex. Siempre sabemos cuales son los comandos ex porque aparecerá los : como prompt. Para pasar al modo comandos del ex Ud debe introducir desde el modo comando del vi (no insertando) los dos puntos (:). En este modo el cursor bajará a la última línea del display y aceptará comando en modo ex. El comando es ejecutado cuando Ud. presiona el Return. Con Ctrl-C el comando es anulado. La siguiente tabla muestra alguno de los comandos básico del ex:

:w Escribe el archivo
:q sale sin guardar cambios
:e nombre Edita archivo nombre
:sh ejecuta un shell sin salir del editor

Movimientos dentro del ex

Sobre el ex puede ejecutar comando refiriéndose a las líneas del texto. Por ejemplo el punto (.) representa la línea actual, y el $ la última línea. Por lo tanto se pueden combinar tal como .,$ lo cual significaría desde la línea actual hasta hasta la última línea en el archivo. Combinando este tipo de especificación se pueden crear comandos tales como :.+1,$d para borra cada línea desde la actual hasta el fin del archivo. La palabra g puede ser utilizado para realizar el tratamiento com global.

Búsqueda y reemplazo global

El siguiente ejemplo es una búsqueda global con reemplazo para mostrar las capacidades del vi.

Se desea buscar la cadena viejo y sustituirla por nuevo, desde el principio al final del texto:

:1,$s/viejo/nuevo/g

Se desea buscar en todo el archivo "feo" y reeemplazarlo por "lindo":

:g/feo/s//lindo/g

Si se desea utilizar caracteres especiales de debe emplear el \ (backslash). Por ejemplo para reemplazar todos los $ en **:

:g/\$/s//**/g

El return también puede ser especificado introduciendo 'ControlV'.


Quick Reference

La siguiente tabla da una referencia rápida con lo que soporta el vi (generalmente el vi tiene los mismo comandos en diferentes sistemas):

Obs: Los comandos comienzan por : y termina con return, preste atención a la tecla de Mayúsculas porque los comando difieren sin está apretada o no

Para empezar

vi file edita file
vi -r file edita la última versión salvada de file (recupera)
vi + n file edita y pone el cursor en la línea n
vi + file ídem pero a la última línea
vi file1 ... filen edita file1 a filen, despues de salvar file1, presione n para la siguiente
vi + /str file edita y sitúa el curso en la línea que contiene str
Salvar y Salir
ZZ o :wq o :x salva y sale
:w file salva en file, si no existe file salva en la actual
:w! salva y no controla la protección de escritura
n,mw file salva desde la línea n a la m en file
n,mw>> file añade desde n a m al final de file
:q sale (si hay cambios no lo ejcuta el comando)
:q! sale (si hay cambios los descarta)
Q permite pasar al ex (:vi retorna)
:e! reedit el archivo actual, descarta los cambios
Comandos de status
:.= imprime línea actual
:= imprime nº de líneas en el archivo
Ctrl-g imprime status del archivo
:l (ele) imprime los caracteres especiales de la línea actual
Insertar
a append
A append después del final de la línea
i insert
I insert antes del cominezo de la línea
o inserta un línea nueva (abajo)
O inserta una línea nueva (arriba)
Ctrl-V char inserta el char (válido para insertar caracteres de control)
:r file lee file e inserta después de la línea actual
:nr file ídem pero inserta después de la línea n
Undoing
u undo último comando
U Restaura la línea al estado original
"np Retrive el n-esimo delete (hasta 9 max)
n repite el último / o ? (búsqueda)
N Ídem anterior pero en orden inverso repite la última (bísqueda)
, ídem anterior pero en orden inverso
. repite el último cambio de texto
Posicionamiento del cursor
{ Marca las secciones cuando está en la primera columna
[[ Hacia atras y principo de sección
]] hacia adelante y principo de sección
Movimientos del cursor
k arriba
j abajo
h izquierda
l (ele) o Space derecha
w o W siguiente palabra (Mayúscula ignora puntuación)
b o B palabra previa
e o E fin palabra
0 o | 1º columna
$ ultimo caracter en la línea
+ o Return 1º caracter de la línea
- 1º caracter no blanco de la línea
G última línea
G$ último caracter
nG linea n
( comienzo de sentencia
) cominezo de sgte sentencia
{ Comienzo de párrafo
} Comienzo de párrafo sgte
Borrar
<- o Ctrl h borra caracter en modo insertar
Ctrl w borra palabra en modo insertar
Crtl x borra texto insertado en modo insertar
nx borra n caracteres incluyendo el de la posición del cursor
nX borra n caracteres previos al cursor incluido
D borra desde posición actual al fin de línea
ndw borra n palabras
Búsqueda
% busca el comienzo de () [] {}
fchar busca hacia adelante char
Fchar busca hacia atrás char
tchar busca hacia delante linea actual
Tchar busca hacia atrás linea actual
/str busca string
?str busca string hacia atrás
:set ic ignore case
:set noic no ignore case
Copiar
nyy o nY copia n líneas en el buffer desde la actual
p print las líneas de buffer en la posición del cursor
P ídem pero antes del cursor