
%***********************************************************************
%               CHAPTER VI
%
%       Spanish Translation by:  Pedro Soria-Rodriguez, 
%                                sorrodp@ece.wpi.edu   
%                                February 9, 1997
%
%       Revisado (cballard)      Jun 19, 1997
%
%***********************************************************************
\chapter{Introducción a vi}\label{vi-chapter}

\bttindex{vi}

\cmdnm{vi} (pronunciado ``vi ai'' en inglés, o ``uve i'') es en
realidad el único editor que se puede encontrar en prácticamente
cualquier instalación de \unix.  Este editor fue escrito originalmente
en la Universidad de California en Berkeley\index{Universidad de
  California, Berkeley} y se puede encontrar versiones en casi
cualquier edición de \unix, incluído \linux.  Al principio cuesta un
poco acostumbrarse a él, pero tiene muchas características muy
potentes.  En general, recomendamos que un nuevo usuario aprenda
Emacs\ttindex{emacs}, que generalmente es más fácil de usar.  Sin
embargo, la gente que usa más de una plataforma o que encuentra que no
le gusta Emacs, puede estar interesada en aprender \cmdnm{vi}.

%Este capítulo esta diseñado para desenterrar los misterios de
%\cmdnm{vi}.  Hay quien tiembla con la simple mención de \cmdnm{vi}, y
%declaran que los usuarios no deberían tener que estar sujetos al
%"Vicio".  Otros se deshacen en admiraciones por la velocidad,
%flexibilidad y potencia que \cmdnm{vi} ofrece a sus leales usuarios.  En
%realidad el gusto personal dicta qué herramientas son las mejores.
%Hay quien le gusta los coches deportivos, a otros les gusta los coches
%de lujo, y lo mismo sucede a ordenadores, sistemas operativos, y en
%este caso, editores.  El objeto de este capítulo y los tutoriales
%es que usted pueda evaluar mejor si \cmdnm{vi} es apropiado para usted o
%no.

Es necesaria una breve reseña histórica de \cmdnm{vi} para comprender
cómo la tecla \key{k}\ puede significar mover el cursor arriba una
línea y porqué hay tres diferentes modos de uso.  Si no le apetece
aprender a usar el editor, los dos tutoriales le llevarán de ser un
crudo principiante hasta tener el suficiente conocimiento del grupo de
comandos que usted puede llegar a usar.  El capítulo también incluye
una guía de comandos, que sirve de útil referencia para tenerla cerca
del terminal.

Incluso si \cmdnm{vi} no se convierte en su editor de texto normal, el
conocimiento de su uso no será desperdiciado.  Es casi seguro que el
sistema de \unix\ que use tendrá alguna variante del editor
\cmdnm{vi}.  Puede ser necesario usar \cmdnm{vi} mientras instala otro
editor, como Emacs.  Muchas herramientas de Unix, aplicaciones y
juegos usan un subconjunto del grupo de comandos de \cmdnm{vi}.

\section{Una rápida historia de Vi}

Los editores de texto en la antigüedad funcionaban en modo de una
línea y se usaban típicamente desde terminales no inteligentes de
impresión.  Un editor típico que operaba en este modo es {\bf
  Ed}\ttindex{ed}.  El editor es potente y eficiente, y usa una
cantidad muy pequeña de recursos del sistema, y funcionaba con las
pantallas de aquel entonces.  \cmdnm{vi} ofrece al usuario una
alternativa visual con un grupo de comandos notablemente amplio
comparado con \cmdnm{ed}.

\cmdnm{vi} como lo conocemos hoy comenzó como el editor de línea
\cmdnm{ex}\ttindex{ex}.  De hecho, \cmdnm{ex} se ve como un modo
especial de edición en \cmdnm{vi}, aunque ahora lo contrario es
verdad.  El componente visual de \cmdnm{ex} puede ser iniciado desde
la línea de comando usando el comando \cmdnm{vi}, o desde dentro de
\cmdnm{ex}.


El editor \cmdnm{ex}/\cmdnm{vi} fue desarrollado en la universidad de
California en Berkeley\index{Universidad de California, Berkeley} por
William Joy\index{Joy, William}.  Originalmente se suministraba como
una utilidad no soportada hasta su inclusión oficial en la
distribución del Unix AT\&T System~V.  Se ha ido haciendo cada vez más
popular, incluso con la competencia de los modernos editores de
pantalla completa.

Debido a la popularidad de \cmdnm{vi} existen muchas variantes
clónicas y se pueden encontrar varias versiones para la mayoría de los
sistemas operativos.  No es el propósito de este capítulo el incluir
todos los comandos disponibles bajo \cmdnm{vi} o sus variantes.
Muchos clones han aumentado y modificado el comportamiento original de
\cmdnm{vi}.  La mayoría de los clones no soportan todos los comandos
originales de \cmdnm{vi}.

Si tiene un buen conocimiento de trabajo con \cmdnm{ed} entonces
\cmdnm{vi} presenta una curva de aprendizaje más suave.  Aunque usted
no tenga ninguna intención de usar \cmdnm{vi} como su editor regular,
el conocimiento básico de \cmdnm{vi} solamente puede serle una
ventaja.

%***********************************************************************
\section{Rápido tutorial de Ed}
\bttindex{ed}

El propósito de esta guía es que usted empiece a usar \cmdnm{ed}.
\cmdnm{ed} está diseñado para ser fácil de usar, y requiere poco
entrenamiento para comenzar.  La mejor manera de aprender es
practicando, así que siga las instrucciones y pruebe el editor antes
de descontar sus ventajas prácticas.

\subsection{Crear un fichero}
\cmdnm{ed} sólo puede editar un fichero a la vez.  Siga el siguiente
ejemplo para crear su primer fichero de texto usando \cmdnm{ed}.

\begin{verbatim}
/home/larry$ ed
a
Este es mi primer fichero de texto usando Ed.
Esto es divertido de verdad.
.
w primero.txt
q
/home/larry$
\end{verbatim}

Ahora puede verificar el contenido del fichero usando la utilidad de
concatenación de Unix.

\begin{verbatim}
/home/larry$ cat primero.txt
\end{verbatim}% $

El ejemplo anterior ha mostrado un número de puntos importantes.
Cuando invoca \cmdnm{ed} como en el ejemplo tendrá un fichero vacío.
La tecla \key{a}\ se usa para añadir texto al fichero.  Para finalizar
la sesión de entrada de texto, se usa un punto \key{.}\ en la primera
columna del texto.  Para salvar el texto a un fichero, la tecla
\key{w}\ se usa en combinación con el nombre del fichero y finalmente
la tecla \key{q}\ se usa para salir del editor.

La observación más importante es que hay dos modos de operación.  Al
principio el editor está en modo de comandos.  Un comando se define
por caracteres, para asegurarse de cuales son las intenciones del
usuario, \cmdnm{ed} usa un {\bf modo de texto}, y un {\bf modo de
  comando}.


\subsection{Editar un fichero existente}
Para añadir una línea de texto a un fichero existente siga el
siguiente ejemplo:
\begin{verbatim}
/home/larry$ ed primero.txt
a
Esta es una nueva linea de texto.
.
w
q
\end{verbatim}% $
        
Si comprueba el fichero con \cmdnm{cat} verá que hay una nueva línea
insertada entre las dos líneas originales.  ¿Cómo supo \cmdnm{ed}
dónde poner la nueva línea de texto?.

Cuando \cmdnm{ed} lee el fichero, se acuerda de cual es la línea
actual.  El comando \key{a}\ añadirá el texto después de la línea
actual.  \cmdnm{ed} también puede poner el texto antes de la línea
actual con la tecla \key{i}\ .  El efecto será la inserción del texto
antes de la línea actual.

Ahora es fácil ver que \cmdnm{ed} opera en el texto línea por línea.
Todos los comandos se pueden aplicar a una línea elegida.

Para añadir una línea de texto al final de un fichero.
\begin{verbatim}
/home/larry$ ed primero.txt
        $a
        La ultima linea de texto.
        .
        w
        q
\end{verbatim}

El modificador de comandos \key{\$}\ le dice a \cmdnm{ed} que añada la
línea después de la última línea.  Para añadir la línea despues de la
primera línea el modificador sería \key{1}.  Ahora tenemos la
posibilidad de seleccionar la línea para añadir una línea de texto
después del número de línea o insertar una línea antes del número de
línea.

¿Cómo sabemos lo que hay en la línea actual?  El comando \key{p}\ 
muestra el contenido de la línea actual.  Si quiere hacer que la línea
actual sea la línea 2, y a la vez quiere ver el contenido de esa línea
entonces haga lo siguiente.
\begin{verbatim}
/home/larry$ ed primero.txt
        2p
        q
\end{verbatim}% $

\subsection{Números de línea en detalle}
Ha visto cómo mostrar el contenido de la línea actual, usando el
comando \key{p}.  También sabemos que hay modificadores del número de
línea para los comandos.  Para ver el texto de la segunda línea,
\begin{verbatim}
        2p
\end{verbatim}

Hay algunos modificadores especiales que se refieren a posiciones que
pueden cambiar durante el tiempo que edita un fichero.  El {\key \$}
es la última línea del texto.  Para ver la última línea,
\begin{verbatim}
        $p
\end{verbatim}% $

El número de línea actual usa un simbolo de modificador especial {\key
  .}\ .  Para mostrar la línea actual usando un modificador,
\begin{verbatim}
        .p
\end{verbatim}

Esto puede parecer innecesario, aunque es muy útil en el contexto de
los grupos de números de línea.

Para mostrar el contenido del texto desde la línea 1 a la línea 2, se
le debe pasar el alcance.
\begin{verbatim}
        1,2p
\end{verbatim}

El primer número se refiere a la línea de comienzo y el segundo se
refiere a la última línea.  La línea actual será por consiguiente el
segundo número del grupo de líneas.

Si quiere mostrar el contenido del fichero desde el comienzo hasta la
línea actual,
\begin{verbatim}
        1,.p
\end{verbatim}

Para mostrar el contenido desde la línea actual hasta el final del
fichero,
\begin{verbatim}
        .,$p
\end{verbatim}% $

Todo lo que queda es mostrar el contenido de todo el fichero, y esto
queda como un ejercicio para usted.

¿Cómo puede borrar las dos primeras líneas del fichero?
\begin{verbatim}
        1,2d
\end{verbatim}

El comando {\key d} borra el texto línea por línea.  Si usted quisiera
borrar el contenido completo, lo haría con:
\begin{verbatim}
        1,$d
\end{verbatim}% $

Si usted ha hecho muchos cambios y no quiere salvar los contenidos del
fichero, lo mejor es salir del editor sin escribir el fichero antes.

La mayoría de los usuarios no usan \cmdnm{ed} como el principal
editor.  Los editores más modernos ofrecen una pantalla completa de
edición y grupos de comandos más flexibles.  \cmdnm{ed} ofrece una
buena introducción a \cmdnm{vi} y ayuda a explicar cómo se originaron
los comandos de \cmdnm{vi}.

\ettindex{ed}

%***********************************************************************
\section{Rápido tutorial de Vi}
El propósito de este tutorial es que comience a usar el editor
\cmdnm{vi}.  Este tutorial asume que no tiene ninguna experiencia con
\cmdnm{vi}, así que le mostraremos los diez comandos más basicos de
\cmdnm{vi}.  Estos comandos fundamentales son suficientes para
realizar la mayoría de sus necesidades de edición, y puede expandir su
vocabulario de \cmdnm{vi} cuanto necesite.  Se recomienda que tenga un
ordenador para practicar, según avanza con el tutorial.

\subsection{Ejecutar vi}
Para ejecutar \cmdnm{vi}, simplemente tiene que teclear las letras
\cmdnm{vi} seguidas del nombre de fichero que desea crear.  Verá una
pantalla con una columna de tildes (\verb"~") en el lado izquierdo.
\cmdnm{vi} está ahora en modo de comando.  Cualquier cosa que teclee
será interpretado como un comando, no como texto que usted desea
escribir.  Para introducir texto, tiene que teclear un comando.  Los
dos comandos de entrada básicos son los siguientes:

\begin{tabular}{cl}
     {\tt i}   &  insertar texto a la izquierda del cursor.\\
     {\tt a}   &  añadir texto a la derecha del cursor.
\end{tabular}

Dado que está al comienzo de un fichero vacío, no importa cual de
estos usar.  Escriba uno de ellos, y después teclee el siguiente texto
(un poema de Augustus DeMorgan encontrado en {\em The Unix Programming
  Environment} por B.W. Kernighan y R. Pike):

\begin{verbatim}
     Las pulgas grandes tienen peque~nas pulgas<Intro>
       sobre sus espaldas para que les muerdan.<Intro>
     Y las pulgas peque~nas tienen pulgas mas peque~nas<Intro>
       y as'i hasta el infinito.<Intro>
     Y las pulgas grandes, a su vez,<Intro>
       tienen pulgas mas grandes sobre las que estar;<Intro>
     Mientras que estas de nuevo tienen otras mas grandes aun,<Intro>
       y mas grandes aun, y asi.<Intro>
     <Esc>
\end{verbatim}

Fíjese que tiene que pulsar la tecla \key{Esc} para finalizar la
inserción y volver al modo de comando.

\subsection{Comandos de movimiento del cursor}

\begin{tabular}{cl}
{\tt h}   &  mueve el cursor un espacio a la izquierda.\\
{\tt j}   &  mueve el cursor un espacio abajo.\\
{\tt k}   &  mueve el cursor un espacio arriba.\\
{\tt l}   &  mueve el cursor un espacio a la derecha.
\end{tabular}

Estos comandos se pueden repetir manteniendo la tecla pulsada.
Intente mover el cursor por el texto ahora.  Si intenta un movimiento
imposible, por ejemplo, pulsar la tecla \key{k} cuando el cursor está
en la línea superior, la pantalla parpadeará momentaneamente o el
terminal sonará.  No se preocupe, no muerde, y su fichero no saldrá
dañado.

\subsection{Borrar texto}
\begin{tabular}{cl}
{\tt x}  &    borra el carácter que hay en el cursor.\\
{\tt dd} &    borra la línea donde está el cursor.
\end{tabular}

Mueva el cursor a la primera línea y póngalo de modo que esté bajo la
{\bf n}.  Pulse la letra \key{x}, y la {\bf n} desaparecerá.  Ahora
pulse la letra \key{i} para cambiarse al modo de inserción y vuelva a
teclear la {\bf n}.  Pulse \key{Esc} cuando haya terminado.

\subsection{Salvar un fichero}
\begin{tabular}{cl}
{\tt :w} &    salvar (escribir al disco).\\
{\tt :q} &    salir.
\end{tabular}

Asegúrese de que está en modo de comando pulsando la tecla \key{Esc}.
Ahora pulse {\bf :w}.  Esto salvará su trabajo escribiéndolo a un
fichero de disco.

El comando para salir de \cmdnm{vi} es \key{q}.  Si quiere combinar el
salvar y salir, escriba {\bf :wq}.  También hay una abreviación para
{\bf :wq} --- {\bf ZZ}.  Dado que gran parte del trabajo de
programación consiste en ejecutar un programa, encontrar algún
problema y llamar el programa en el editor para hacer algún pequeño
cambio, y luego volver a salir del editor para ejecutar el programa
otra vez, {\bf ZZ} será un comando que usará a menudo.  (En realidad,
{\bf ZZ} no es un sinónimo exacto de {\bf :wq} --- si no ha hecho
ningún cambio al fichero que está editando desde la ultima vez que lo
salvo, {\bf ZZ} simplemente saldrá del editor mientras que {\bf :wq}
salvará (redundantemente) el fichero antes de salir.)

Si usted se lo ha cargado todo sin esperanzas y simplemente quiere
volver a empezarlo todo, puede teclear {\bf :q!} (recuerde pulsar la
tecla \key{Esc} primero).  Si omite el {\bf !}, \cmdnm{vi} no le
permitirá salir sin salvar.

\subsection{¿Qué viene a continuación?}

Los diez comandos que acaba de aprender deberían ser suficientes para
su trabajo.  Sin embargo, solamente ha rozado la superficie del editor
\cmdnm{vi}.  Hay comandos para copiar material de un lugar del fichero
a otro, para mover material de un lugar a otro, para mover material de
un fichero a otro, para ajustar el editor a sus gustos personales,
etc.  Con todo, hay unos 150 comandos.

\section{Tutorial avanzado de Vi}
La ventaja y la potencia de \cmdnm{vi} está en la habilidad de usarlo
con éxito con sólo saber unos pocos comandos.  La mayoría de los
usuarios de \cmdnm{vi} se sienten un poco incómodos al principio, sin
embargo después de algún tiempo se encuentran ávidos de mayor
conocimiento de los comandos disponibles.

El siguiente tutorial asume que el usuario ha completado el tutorial
rápido (arriba) y por lo tanto se siente a gusto con \cmdnm{vi}.  Este
tutorial expone algunas de las características más poderosas de
\cmdnm{ex}/\cmdnm{vi} desde copiar texto hasta la definición de
macros.  Hay una sección sobre \cmdnm{ex} y los parámetros para
ajustar el editor a su gusto.  Este tutorial describe los comandos, en
vez de llevarle grupo por grupo.  Se recomienda que usted disponga de
algún tiempo para probar los comandos en algún texto de ejemplo, que
se pueda permitir destruir.

Este tutorial no expone todos los comandos de \cmdnm{vi}, aunque se
cubren los más comúnmente usados y aún otros adicionales.  Aunque
usted elija usar otro editor de texto, se espera que apreciará
\cmdnm{vi} y lo que ofrece a quienes deciden usarlo.

\subsection{Movimiento}
La funcionalidad más básica de un editor es el mover el cursor por el
texto.  Aquí están los comandos de movimiento.

\begin{tabular}{cl}
{\tt h} &         mueve el cursor un espacio a la izquierda.\\
{\tt j} &         mueve el cursor una línea hacia abajo.\\
{\tt k} &         mueve el cursor una línea hacia arriba.\\
{\tt l} &         mueve el cursor un espacio a la derecha.
\end{tabular}

\noindent Algunas implementaciones también permiten el uso de las
teclas de cursor para mover el cursor.

\begin{tabular}{cl}
{\tt w} &  mueve al principio de la siguiente palabra.\\
{\tt e} &  mueve al final de la siguiente palabra.\\
{\tt E} &  mueve al final de la siguiente palabra antes de un espacio.\\
{\tt b} &  mueve al principio de la palabra anterior.\\
{\tt 0} &  mueve al principio de la línea actual.\\
{\tt \^{}} & mueve a la primera palabra de la línea actual.\\
{\tt \$} & mueve al final de la línea.\\
{\tt <CR>} & mueve al principio de la siguiente línea.\\
{\tt -} &  mueve al principio de la línea anterior.\\
{\tt G} &    mueve al final del fichero.\\
{\tt 1G} &   mueve al principio del fichero.\\
{\tt nG} &   mueve a la línea {\tt n}.\\
{\tt <Cntl> G} &   muestra el número de línea actual.\\
{\tt \%} &   va al paréntesis correspondiente.\\
{\tt H} &    mueve a la línea superior en pantalla.\\
{\tt M} &    mueve a la línea de en medio de la pantalla.\\
{\tt L} &    mueve al final de la pantalla.\\
{\tt n|} &   mueve el cursor a la columna {\tt n}.
\end{tabular}

El texto se desplaza automáticamente cuando el cursor alcanza la parte
superior o inferior de la pantalla.  También hay comandos que permiten
controlar el desplazamiento del texto.

\begin{tabular}{cl}
{\tt <Cntl> f} &   desplaza una pantalla hacia delante.\\
{\tt <Cntl> b} &   desplaza una pantalla hacia atrás.\\
{\tt <Cntl> d} &   desplaza media pantalla hacia abajo.\\
{\tt <Cntl> u} &   desplaza media pantalla hacia arriba
\end{tabular}

Los comandos anteriores controlan el movimiento del cursor.  Algunos
de los comandos usan un modificador de comandos en la forma de un
número que precede al comando.  Esta característica normalmente repite
el comando ese número de veces.

Para mover el cursor ocho posiciones a la izquierda.

\begin{tabular}{cl}
{\tt 8l} &         mueve el cursor 8 posiciones a la izquierda.
\end{tabular}

Si desea introducir un número de espacios delante de un texto, podría
usar el modificador de comandos con el comando insertar.  Introduzca
el número de repeticiones (n) y después \key{i} seguido por el espacio
y luego pulse la tecla \key{Esc}.

\begin{tabular}{cl}
  {\tt ni} & inserta algún texto y lo repite {\tt n} veces.
\end{tabular}

Los comandos que tratan con líneas usan el modificador para referirse
al número de línea.  El \key{G} es un buen ejemplo.

\begin{tabular}{cl}
  {\tt 1G} & mueve el cursor a la primera línea.
\end{tabular}

\cmdnm{vi} tiene un voluminoso grupo de comandos que se puede usar
para mover el cursor por el texto.  \cmdnm{vi} también puede
posicionar el cursor en una línea desde la línea de comandos.

\begin{verbatim}
        vi +10 mi_fichero.tex
\end{verbatim}

Este comando abre el fichero llamado {\em mi\_fichero.tex} y pone el
cursor 10 líneas más abajo del comienzo del fichero.

Pruebe los comandos de esta sección.  Muy poca gente los recuerda
todos en una sola sesión.  La mayor parte de los usuarios solamente
utiliza una parte de estos comandos.

Ahora se puede mover, pero ¿cómo modificar el texto?

\subsection{Modificación del texto}

El propósito es cambiar el contenido del fichero y \cmdnm{vi} ofrece
un amplio conjunto de comandos para ayudarnos en este proceso.

Esta sección se concentra en añadir texto, cambiar el texto existente
y borrar texto.  Al final de esta sección usted tendrá el conocimiento
para crear cualquier fichero de texto que desee.  Las secciones
restantes se concentran en comandos más especializados y convenientes.

Cuando usted teclea nuevo texto puede introducir varias líneas usando
la tecla \ret.  Si hay que corregir un error tipográfico mientras
introduce texto, puede usar la tecla \key{Retroceso} para mover el
cursor sobre el texto.  Las varias implementaciones de {\tt vi} se
comportan de manera diferente.  Algunas simplemenente mueven el cursor
hacia atrás y el texto sigue viéndose y es aceptado.  Otras borran el
texto cuando pulsa la tecla de borrado.  Otras versiones incluso
permiten usar las teclas de cursores para mover el cursor mientras se
está en modo de entrada de texto.  Este modo de funcionamiento no es
el normal de {\tt vi}.  Si el texto es visible y usa la tecla
\key{Esc} mientras está en la línea en la que pulsó \key{Retroceso},
entonces el texto que hay después del cursor se borrará.  Use el
editor para acostumbrarse a este comportamiento.

\begin{tabular}{cl}
{\tt a} &   Añadir texto a partir de la posición actual del cursor.\\
{\tt A} &   Añadir al final de la línea.\\
{\tt i} &   Insertar texto a la izquierda del cursor.\\
{\tt I} &   Insertar texto a la izquierda del primer caracter que no sea
            espacio en la línea actual.\\
{\tt o} &   Abrir una nueva línea y añade texto debajo de la
            línea actual.\\
{\tt O} &   Abrir una nueva línea y añade texto encima de la
            línea actual.
\end{tabular}

\cmdnm{vi} tiene un pequeño grupo de comandos para borrar texto que se
pueden mejorar con el uso de modificadores.

\begin{tabular}{cl}
{\tt x} &  Borrar el caracter que está debajo del cursor.\\
{\tt dw} & Borrar desde la posición actual al final de la palabra.\\
{\tt dd} & Borrar la línea actual.\\
{\tt D} &  Borrar desde la posición actual al final de la línea.
\end{tabular}

Los modificadores se pueden usar para aumentar la potencia de los
comandos.  Los siguientes ejemplos son un subgrupo de las
posibilidades.

\begin{tabular}{cl}
{\tt nx} &  Borrar {\tt n} caracteres desde el que está bajo el cursor.\\
{\tt ndd} & Borrar {\tt n} líneas.\\
{\tt dnw} & Borrar {\tt n} palabras (igual que ndw).\\
{\tt dG} &  Borrar desde la posición actual hasta el final del fichero.\\
{\tt d1G} & Borrar desde la posición actual hasta el principio del fichero.\\
{\tt d\$} & Borrar desde la posición actual al final de la
            línea.  (Esto es igual que D).\\
{\tt dn\$} & Borrar desde la línea actual al final de la
             enésima línea.
\end{tabular}


La lista de comandos anterior muestra que la operación de borrado
puede ser muy útil.  Esto se hace patente cuando se aplica en
combinación con los comandos de movimiento de cursor.  Hay que hacer
notar que el comando \key{D} ignora los modificadores que se le
apliquen.

En ocasiones usted puede necesitar deshacer los cambios al texto.  Los
siguientes comandos recuperan el texto que había antes de hacer
cambios.

\begin{tabular}{cl}
{\tt u} &  Deshacer el último comando.\\
{\tt U} &  Deshacer todos los cambios ocurridos en la línea actual.\\
{\tt :e!} & Editar otra vez.  Recupera el estado del fichero desde la
            última vez que se salvó.
\end{tabular}

\cmdnm{vi} no sólo le permite deshacer cambios, también puede dar la
vuelta al comando ``deshacer''.  Por ejemplo, si usamos el comando
\key{5dd} para borrar 5 líneas, se pueden recuperar usando el comando
\key{u}.  Si usted usa \key{u} una vez más, las 5 líneas desaparecerán
de nuevo.

\cmdnm{vi} ofrece comandos que permiten que se hagan cambios al texto
sin tener que borrar y volver a escribir:

\begin{tabular}{cl}
  {\tt rc} & \parbox{12cm}{Reemplaza el caracter bajo el cursor con la
    letra ``c''.  Mueve el cursor a la derecha si se usa el
    modificador de repetición, por ejemplo: {\tt 2rc}.}\\
  {\tt R} &  Sobreescribe el texto con el nuevo texto..\\
  {\tt cw} & Cambia el texto de la palabra actual.\\
  {\tt c\$} & Cambia el texto desde la posición actual al final de la
  línea.\\
  {\tt cnw} & Cambia las siguientes {\tt n} palabras. (Igual que {\tt
    ncw}).\\
  {\tt cn\$} & Hacer cambios hasta el final de la enésima línea.\\
  {\tt C} & Hacer cambios hasta el final de la línea actual.\\
  {\tt cc} & Hacer cambios en la línea actual.\\
  {\tt s} &  Sustituye el texto que escriba por el caracter actual.\\
  {\tt ns} & Sustituye el texto que escriba por los siguientes {\tt n}
  caracteres.
\end{tabular}

Las series de comandos de cambio que permiten que se introduzca un
grupo de carácteres se terminan con la tecla \key{Esc}.

El comando \key{cw} empieza en la posición actual en la palabra y
termina al final de la palabra.  Cuando use un comando de cambio que
especifica la distancia sobre la que se aplicará el cambio, \cmdnm{vi}
pondrá un {\bf \$} en la última posición de carácter.  El nuevo texto
puede sobrepasar o no llegar a la longitud original de texto.

\subsection{Copiar y mover bloques de texto}

El movimiento de texto supone la combinación de un número de comandos
para conseguir el propósito final.  Esta sección introduce los
buffers\footnote{N. del T.: "buffer" es una palabra inglesa que se
  refiere a un espacio reservado en memoria para guardar alguna
  información temporalmente.  En este caso se usan buffers para
  almacenar una copia temporal del texto que usted desea copiar o
  mover.}  con y sin nombre junto a los comandos que cortan y pegan el
texto.

La copia de texto se realiza en tres pasos principales:
\begin{enumerate}
\item {\bf Copia} del texto a un buffer.
\item {\bf Movimiento} del cursor al lugar de destino.
\item {\bf Pegar} (poner) el texto en el buffer de edición.
\end{enumerate}

El buffer de edición no es sino el propio fichero en el que usted está
trabajando.

Para {\bf Copiar} texto al buffer sin nombre use el comando \key{y}.

\begin{tabular}{cl}
{\tt yy} & Mueve una copia de la línea actual al buffer sin
           nombre.\\
{\tt Y} & Mueve una copia de la línea actual al buffer sin
          nombre.\\
{\tt nyy} & Mueve las siguientes {\tt n} lineas al buffer sin
            nombre.\\
{\tt nY} & Mueve las siguientes {\tt n} líneas al buffer sin
           nombre.\\
{\tt yw} &  Mueve una palabra al buffer sin nombre.\\
{\tt ynw} & Mueve n palabras al buffer sin nombre.\\
{\tt nyw} & Mueve n palabras al buffer sin nombre.\\
{\tt y\$} & Mueve el texto desde la posición actual al final de la
            línea al buffer sin nombre.
\end{tabular}

El buffer sin nombre es un buffer temporal que puede ser fácilmente
afectado por otros comandos comunes.  Hay ocasiones en las cuales
necesitamos mantener el contenido de un buffer durante un período más
extenso de tiempo.  En este caso se usaría un buffer con nombre.
\cmdnm{vi} tiene 26 buffers con nombre.  Los buffers usan las letras
del alfabeto como el nombre de identificación.  Para distinguir un
comando de un buffer con nombre, \cmdnm{vi} usa el caracter \key{\dq}.
Cuando use un buffer con nombre de letra minúscula los contenidos se
sobre escriben, mientras que el uso del nombre en letra mayúscula
añade el nuevo texto al contenido actual.

\begin{tabular}{cl}
{\tt \dq ayy} &  Mueve la línea actual al buffer con nombre {\tt
                 a}.\\
{\tt \dq aY} &   Mueve la línea actual al buffer con nombre {\tt
                 a}.\\
{\tt \dq byw} &  Mueve la palabra actual al buffer con nombre {\tt
                 b}.\\
{\tt \dq Byw} &  Añade la palabra actual al contenido del buffer {\tt
                 b}.\\
{\tt \dq by3w} & Mueve las siguientes 3 palabras al buffer {\tt b}.
\end{tabular}

Use el comando \key{p} para pegar el contenido del buffer al buffer de
edición.

\begin{tabular}{cl}
  {\tt p} & Pegar del buffer sin nombre a la DERECHA del cursor.\\
  {\tt P} & Pegar del buffer sin nombre a la IZQUIERDA del cursor.\\
  {\tt nP} & Pegar n copias del buffer sin nombre a la IZQUIERDA del cursor.\\
  {\tt \dq aP} & Pegar del buffer con nombre ``a'' a la DERECHA del cursor.\\
  {\tt \dq b3P} & Pegar 3 copias del buffer con nombre ``b'' a la
  IZQUIERDA del cursor.
\end{tabular}

Cuando use \cmdnm{vi} dentro de un \cmdnm{xterm} tiene otra opción
para copiar texto.  Marque el bloque de texto que desea copiar
arrastrando el cursor del ratón sobre el texto.  Si mantiene pulsado
el botón izquierdo del ratón y arrastra el ratón desde el comienzo al
final, invertirá el vídeo del texto.  Esta operación automáticamente
coloca el texto en un buffer reservado para el servidor de X~Window.
Para pegar el texto, pulse el botón de enmedio.  Acuérdese de poner
\cmdnm{vi} en modo de inserción dado que la entrada de texto se podría
interpretar como comandos y el resultado sería cuando menos
desagradable.  Usando la misma técnica se puede copiar una sola
palabra haciendo doble click con el botón izquierdo del ratón sobre la
palabra.  Solamente se copiará esa única palabra.  Para pegarla se usa
el mismo procedimiento que ateriormente.  Los contenidos del buffer
sólo cambian cuando se marca otro bloque de texto.

Para mover un bloque de texto son necesarios tres pasos.
\begin{enumerate}
\item {\bf Borrar} el texto para ponerlo en un buffer con o sin nombre.
\item {\bf Mover} el cursor a la posición de destino.
\item {\bf Pegar} el buffer.
\end{enumerate}

El proceso es el mismo que el de copia con un solo cambio en el primer
paso para borrar.  Cuando se usa el comando \key{dd}, la línea se
borra y se coloca en el buffer sin nombre.  Luego puede poner el
contenido del mismo modo que lo hizo cuando copió el texto en la
posición deseada.

\begin{tabular}{cl}
{\tt \dq add} & Borrar la línea y ponerla en el buffer con nombre
                a.\\
{\tt \dq a4dd} & Borrar cuatro líneas y ponerlas en el buffer con
                 nombre a.\\
{\tt dw} & Borrar una palabra y ponerla en el buffer sin nombre.
\end{tabular}

Vea la sección sobre el modificado de texto para ver más ejemplos de
borrado de texto.

En el caso de que el sistema falle, el contenido de todos los buffers
se pierde excepto el contenido de los buffers de edición, que se puede
recuperar (ver comandos Útiles).

\subsection{Búsqueda y cambio de texto}

\cmdnm{vi} dispone de varios comandos para búsqueda.  Usted puede
buscar desde un solo carácter hasta una expressión completa.

Los dos comandos principales de búsqueda basados en caracteres son
\key{f} y \key{t}.

\begin{tabular}{cl}
{\tt fc} & Encuentra el siguiente caracter c.  Se mueve a la derecha
           del siguiente.\\
{\tt Fc} & Encuentra el siguiente caracter c.  Se mueve a la izquierda
           del anterior.\\
{\tt tc} & Se mueve a la DERECHA al caracter anterior al siguiente
           c.\\
{\tt Tc} & \parbox{12cm}{Se mueve a la IZQUIERDA al caracter que sigue
           al c anterior.  (En algunas versiones de vi esto es lo
           mismo que Fc).}\\
{\tt  ;} & Repite el último comando f,F,t,T.\\
{\tt ,} & Igual que ({\tt ;}) pero cambiando la dirección del
           comando original.
\end{tabular}

Si el caracter que usted buscaba no se encuentra, \cmdnm{vi} emitirá
un pitido o le dará otro tipo de señal (tal vez un parpadeo de toda la
pantalla).

\cmdnm{vi} le permite buscar una cadena de texto en el buffer de
edición.

\begin{tabular}{cl}
{\tt  /tira} & Busca hacia la derecha y abajo la siguiente instancia
               de ``tira''.\\
{\tt ?tira} &  Busca hacia la izquierda y arriba la siguiente
               instancia de ``tira''.\\
{\tt n} &      Repite el último comando {\tt /} o {\tt ?}.\\
{\tt N} &      Repite el último comando {\tt /} o {\tt ?} en la
               dirección opuesta.
\end{tabular}

Cuando use los comandos \key{/} or \key{?}, la última línea en la
parte baja de la pantalla se vaciará.  Introduzca en esa línea la tira
de caracteres que desea buscar y pulse \ret.

La tira en el comando \key{/} or \key{?} puede ser una expresión
regular.  Una expresión regular puede ser una descripción de un
conjunto de tiras.  La descripción se construye usando texto
entremezclado con caracteres especiales.  Los caracteres especiales de
una expresión regular son {\bf . * [ \ ] \ \^ \ \$}.

\begin{tabular}{cl}
{\tt .} &  Vale por cualquier carácter excepto el carácter de nueva
           línea.\\
{\tt \verb+\+ } &  Tecla de ``escape'' para cualquier caracter especial.\\
{\tt *} &  Vale por 0 o más instancias del caracter anterior.\\
{\tt [\,]} & Busca exactamente uno de los caracteres incluídos entre
             los corchetes.\\
{\tt \^{}} & El caracter que sigue a {\tt \^{}} debe estar al
             principio de la línea.\\
{\tt \$} & El caracter que precede a {\tt \$} se busca al final de la
             línea.\\
{\tt [\^{}]} & Busca cualquier cosa que no se encuentre despues de
               {\tt \^{}} dentro de los corchetes.\\
{\tt [-]} & Busca un rango de caracteres.
\end{tabular}

El único modo de acostumbrarse a usar las expresiones regulares es
usándolas.  A continuación mostramos varios ejemplos de uso:

\begin{tabular}{cl}
{\tt c.ch} & Coincide con coche, cacho, cochera, etc.\\
{\tt c\verb+\+.pe} & Coincide con c.pe, c.per, etc.\\
{\tt sto*p} & Coincide con stp, stop, stoop, etc.\\
{\tt car.*n} & Coincide con cartón, carrillón, carmen, etc.\\
{\tt xyz.*} & Coincide con xyz al final de la línea.\\
{\tt \^{}Los} &  Encuentra cualquier línea que empiece con Los.\\
{\tt abcdef\$} & Encuentra cualquier línea que termine con
                 abcdef.\\
{\tt \^{}Solo\$} & Coincide con cualquier línea que sólo tenga la
                   palabra ``Solo''.\\
{\tt p[aiue]so} &  Coincide con paso, piso, puso, peso.\\
{\tt Ver[D-F]} &   Coincide con VerD, VerE, VerF.\\
{\tt Ver[\^{}1-9]} & Coincide con Ver siempre que a continuación NO
                     haya un número.\\
{\tt the[ir][re]} &  Coincide con their, therr, there, theie.\\
{\tt [A-Za-z][A-Za-z]*} & Coincide con cualquier palabra.
\end{tabular}

\cmdnm{vi} usa el modo de comandos de \cmdnm{ex} para llevar a cabo
búsquedas y sustituciones.  Todos los comandos que empiezan con dos
puntos son comandos en modo \cmdnm{ex}.

Los comandos de búsqueda y sustitución permiten que se usen
expresiones regulares sobre un rango de líneas y sustituir la tira de
caracteres que se busca.  El usuario puede pedir confirmación antes de
que se realice la sustitución.  Merece la pena hacer una revisión de
la representación de los números de línea en el tutorial de
\cmdnm{ed}.

\begin{tabular}{ll}
{\tt :<prim>,<ult>s/<busca>/<sust>/g} &   Comando general.\\
{\tt :1,\$s/los/Los/g} & Buscar el fichero entero y sustituir los por Los.\\
{\tt :\%s/the/The/g} & {\tt \%} siginifica el fichero entero (igual
                       que arriba).\\
{\tt :.,5s/\^{}.*//g} & Borra el contenido de la línea actual
                        hasta la quinta.\\
{\tt :\%s/los/Los/gc} & Sustituye ``los'' con ``Los'' preguntando
                        antes de\\
                      & hacer la operación.\\
{\tt :\%s/\^{}....//g} & Borra los primeros cuatro carácteres de
                            cada línea.\\
\end{tabular}

El comando de búsqueda es muy potente cuando se combina con las
expresiones regulares.  Si no se incluye la directiva \key{g} entonces
el cambio sólo se aplica a la primera instancia que se encuentre en
cada línea.

En ocasiones usted quiere usar los caracteres de búsqueda en los
caracteres de sustitución.  Se puede reescribir todo el comando en la
línea pero \cmdnm{vi} permite que los caracteres de sustitución
incluyan algunos caracteres especiales.

\begin{tabular}{cl}
{\tt :1,5s/ayuda/\&ndo/g} & Sustituye ayuda por ayudando en las cinco
                            primeras líneas.\\
{\tt :\%s/ */\&\&/g} & Duplica el número de espacios entre palabras.
\end{tabular}

El uso de la tira de caracteres completa para búsqueda tiene sus
límites y por lo tanto \cmdnm{vi} usa los paréntesis en secuencia de
escape \key{\\(} y \key{\\)} para seleccionar el rango de la
sustitución.  El uso de un dígito en secuencia de escape \key{\\1}
identifica el rango en el orden de la definición y la sustitución se
puede hacer.

\begin{tabular}{cl}
{\tt \verb+:s/\^\(.*\):.*/\1/g+} & Borra todo despues de e incluyendo
                                 los dos puntos.\\
{\tt \verb+:s/\(.*\):\(.*\)/\2:\1/g+} & Da la vuelta a las palabras a
                                       los dos lados de los dos
                                       puntos.
\end{tabular}

\cmdnm{vi} ofrece comandos muy potentes que muchos editores de texto
modernos no tienen o no pueden ofrecer.  El coste de esta potencia
suele ser también el principal argumento en contra de {\tt vi}.  Los
comandos pueden ser difíciles de aprender y leer.  Sin embargo, la
mayoría de las cosas buenas suelen ser un poco extrañas al principio.
Con un poco de práctica y tiempo, los comandos de {\tt vi} se
convertirán en una segunda naturaleza para Ud..

\ettindex{vi}
% Local Variables: 
% mode: latex
% TeX-master: "guide"
% End:
