% Linux Installation and Getting Started    -*- TeX -*-
% vi.tex
% Copyright (c) 1992, 1993 by Matt Welsh <mdw@sunsite.unc.edu>
%
% This file is freely redistributable, but you must preserve this copyright 
% notice on all copies, and it must be distributed only as part of "Linux 
% Installation and Getting Started". This file's use is covered by
% the copyright for the entire document, in the file "copyright.tex".
%
% Traducci\'on al espa\~nol por Eduardo Lluna Gil <elluna@aii.upv.es>
% $Log: vi.tex,v $
% Revision 0.5.0.1  1996/02/10 23:45:15  rcamus
% Primera beta publica
%
%

\section{Usando el editor {\tt vi}}\label{sec-vi}

\index{vi@{\tt vi}|(}
\index{editor de texto!defined}
\index{editor!defined}

Un {\bf editor de texto} es simplemente un programa usado para la edici\'on 
de ficheros que contienen texto, como una carta, un programa en C, o un
fichero de configuraci\'on del sistema. Mientras que hay muchos editores de
texto disponibles en Linux, el \'unico editor que est\'a garantizado encontrar
en cualquier sistema UNIX es {\tt vi}---el ``visual editor''. {\tt vi} no es
el editor m\'as f\'acil de usar, ni es muy autoexplicativo. De cualquier forma,
como es tan com\'un en el mundo UNIX y es posible que alguna vez necesite
usarlo, aqu\'{\i} encontrar\'a algo de documentaci\'on.

\index{editor de texto!comparando}
\index{Emacs}
La elecci\'on de un editor es principalmente una cuesti\'on de gusto personal y
estilo. Muchos usuarios prefieren el barroco, autoexplicativo y potente 
{\bf Emacs}---un editor con m\'as caracter\'{\i}sticas que cualquier otro programa
\'unico en el mundo UNIX. Por ejemplo, Emacs tiene integrado su propio dialecto
del lenguaje de programaci\'on LISP y tiene muchas extensiones (una de ellas
es el programa ``Eliza''- como programa de IA). Pero como Emacs y todos sus
ficheros de soporte es relativamente grande, puede que no tenga acceso a \'el
en muchos sistemas. {\tt vi}, por otra parte, es peque\~no y potente, pero m\'as
dif\'{\i}cil de usar. De cualquier modo, una vez que conozca la forma de
funcionamiento de {\tt vi}, es muy f\'acil usarlo. Simplemente la curva de
aprendizaje es bastante pronunciada al comienzo.

Esta secci\'on es una introducci\'on coherente a {\tt vi}---no discutiremos
todas sus caracter\'{\i}sticas, solo aquellas necesarias para que sepa como
comenzar. Puede dirigirse a la p\'agina de manual de {\tt vi} si est\'a
interesado en aprender m\'as acerca de las caracter\'{\i}sticas de este 
editor, o puede leer el libro {\em Learning the {\tt vi} Editor} de 
O'Reilly and Associates. Vea el Ap\'endice~\ref{app-info} para informaci\'on.

\subsection{Conceptos}

Mientras se usa {\tt vi}, en cualquier momento estar\'a en uno de tres
posibles modos de operaci\'on. Estos modos son conocidos como 
{\em modo \'ordenes}, {\em modo inserci\'on} y {\em modo \'ultima 
l\'{\i}nea}.

\index{vi@{\tt vi}!modo \'ordenes}
Cuando inicia {\tt vi}, est\'a en el {\em modo \'ordenes}. Este modo le permite
usar ciertas \'ordenes para editar ficheros o cambiar a otros modos. Por
ejemplo, tecleando ``{\tt x}'' mientras est\'a en el modo \'ordenes, borra el
car\'acter que hay debajo del cursor. Las teclas del cursor mueven este por
el fichero que estamos editando. Generalmente, las \'ordenes usadas en este
modo son solo de uno o dos car\'acteres de longitud.

\index{vi@{\tt vi}!modo inserci\'on}
Habitualmente insertar\'a o editar\'a texto desde el {\em modo inserci\'on}.
Usando {\tt vi}, probablemente dedicar\'a la mayor parte del tiempo en este
modo. Inicia el modo de inserci\'on al usar una orden como ``{\tt i}'' (para
``insertar'') desde el modo de \'ordenes. Una vez en el modo de 
inserci\'on, ir\'a insertando texto en el documento desde la posici\'on 
actual del cursor. Para salir del modo de inserci\'on y volver al de 
\'ordenes, pulse \key{esc}.

\index{vi@{\tt vi}!modo \'ultima l\'{\i}nea}
{\em Modo \'ultima l\'{\i}nea\/} es un modo especial usado para proporcionar
ciertas \'ordenes extendidas a {\tt vi}. Al usar esos comandos, aparecen 
en la \'ultima l\'{\i}nea de la pantalla (de ah\'{\i} el nombre). Por 
ejemplo, cuando teclea ``{\tt :}'' desde el modo de \'ordenes, entrar\'a 
en el modo \'ultima l\'{\i}nea, y podr\'a usar \'ordenes como ``{\tt 
wq}'' (para escribir el fichero a disco y salir de {\tt vi}), o ``{\tt 
q!}'' (para salir de {\tt vi} sin guardar los cambios). El modo de 
\'ultima l\'{\i}nea es habitualmente usado por \'ordenes {\tt vi} mayores 
de un car\'acter. En el modo de \'ultima l\'{\i}nea, introduce una orden 
de una sola l\'{\i}nea y pulsa \key{enter} para ejecutarla.

\subsection{Comenzando con {\tt vi}}
\index{vi@{\tt vi}!comenzando}

La mejor forma de entender estos conceptos es arrancar {\tt vi} y editar un
fichero. En el ejemplo ``screens'' que veremos, vamos a mostrar solo unas
pocas l\'{\i}neas de texto, como si la pantalla tuviese solo seis 
l\'{\i}neas de altura (en lugar de veinticuatro).

La sintaxis de {\tt vi} es
\begin{tscreen}
vi \cparam{filename}
\end{tscreen}
donde \cparam{filename} es el nombre del fichero que desea editar.

Arranque {\tt vi} tecleando
\begin{tscreen}
/home/larry\# {\em vi test}
\end{tscreen}
lo que editar\'a el fichero {\tt test}.
Deber\'{\i}a ver algo como
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
\underline{\~{}} \\
\~{} \\
\~{} \\
\~{} \\
\~{} \\
\~{} \\
"test" [New file]
\end{minipage}}\end{tscreen}

La columna de car\'acteres ``{\tt \~{}}'' indica que est\'a al final del
fichero.

\subsection{Insertando texto}

\index{vi@{\tt vi}!insertando texto|(}

Est\'a ahora en modo \'ordenes; para poder insertar texto en el fichero, pulse
\key{i} (lo que le har\'a entrar en modo inserci\'on), y comience a escribir.
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
Now is the time for all good men to come to the aid of the party\underline{.} \\
\~{} \\
\~{} \\
\~{} \\
\~{} \\
\~{} 
\end{minipage}}\end{tscreen}

Mientras inserta texto, puede escribir tantas l\'{\i}neas como desee 
(pulsando \key{return} despu\'es de cada una, por supuesto), y puede 
corregir los errores con la tecla de borrado de car\'acter.

Para salir del modo de inserci\'on y volver al modo de \'ordenes, pulse
\key{esc}.

Mientras est\'e en modo \'ordenes, puede usar las teclas del cursor para moverse
por el fichero. En nuestro ejemplo, como solo tenemos una l\'{\i}nea, el 
tratar de usar las teclas de l\'{\i}nea arriba o abajo, probablemente 
har\'a que {\tt vi} emita un pitido.

Hay muchas formas de insertar texto a parte de la orden {\tt i}. Por
ejemplo, la orden {\tt a} inserta texto comenzando {\em detr\'as\/} de la
posici\'on actual del cursor, en lugar de la posici\'on actual del cursor. Por
ejemplo, use la tecla de cursor a la izquierda para desplazar el cursor
entre las palabras ``good'' y ``men''.
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
Now is the time for all good\underline{\ }men to come to the aid of the 
party. \\ 
\~{} \\
\~{} \\
\~{} \\
\~{} \\
\~{} 
\end{minipage}}\end{tscreen}

Pulse \key{a} para iniciar el modo inserci\'on, teclee ``{\tt wo}'' y pulse
\key{esc} para volver al modo de \'ordenes.
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
Now is the time for all good wo\underline{m}en to come to the aid of the party. \\
\~{} \\
\~{} \\
\~{} \\
\~{} \\
\~{} 
\end{minipage}}\end{tscreen}

Para comenzar a insertar texto en la l\'{\i}nea de debajo de la actual, 
use la orden ``{\tt o}''. Por ejemplo, pulse \key{o} y teclee otra 
l\'{\i}nea o dos: 
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
Now is the time for all good women to come to the aid of the party. \\
Afterwards, we'll go out for pizza and beer\underline{.} \\
\~{} \\
\~{} \\
\~{} \\
\~{}
\end{minipage}}\end{tscreen}

Solo recuerde que en cualquier momento est\'a en modo de \'ordenes (donde
\'ordenes como {\tt i}, {\tt a} o {\tt o} son v\'alidas}, o en modo de 
inserci\'on (cuando est\'e insertando texto, pulse \key{esc} para volver 
al modo de \'ordenes), o en modo de \'ultima l\'{\i}nea (donde puede 
introducir comandos extendidos, como veremos m\'as adelante).
\index{vi@{\tt vi}!insertando texto|)}

\subsection{Borrando texto}
\index{vi@{\tt vi}!borrando texto|(}

Desde el modo de \'ordenes, la orden {\tt x} borra el car\'acter debajo del
cursor. Si pulsa \key{x} cinco veces, terminar\'a con:
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
Now is the time for all good women to come to the aid of the party. \\
Afterwards, we'll go out for pizza and\underline{\ } \\
\~{} \\
\~{} \\
\~{} \\
\~{} 
\end{minipage}}\end{tscreen}

Ahora pulse \key{a}, inserte alg\'un texto, seguido de \key{esc}:
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
Now is the time for all good women to come to the aid of the party. \\
Afterwards, we'll go out for pizza and Diet Coke\underline{.} \\
\~{} \\
\~{} \\
\~{} \\
\~{} 
\end{minipage}}\end{tscreen}

Puede borrar l\'{\i}neas enteras usando la orden {\tt dd} (es decir, pulse
\key{d} dos veces en una fila). Si el cursor est\'a en la segunda 
l\'{\i}nea y teclea {\tt dd},
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
\underline{N}ow is the time for all good women to come to the aid of the party. \\
\~{} \\
\~{} \\
\~{} \\
\~{} \\
\~{} 
\end{minipage}}\end{tscreen}

Para borrar la palabra sobre la que se encuentra el cursor, use la orden
{\tt dw}. Situe el cursor sobre la palabra ``good'' y pulse {\tt dw}.
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
Now is the time for all \underline{w}omen to come to the aid of the party. \\
\~{} \\
\~{} \\
\~{} \\
\~{} \\
\~{}
\end{minipage}}\end{tscreen}
\index{vi@{\tt vi}!borrando texto|)}

\subsection{Modificando texto}
\index{vi@{\tt vi}!modificando texto|(}

Puede sustituir secciones de texto usando la orden {\tt R}. Situe el cursor
en la primera letra de ``party'' y pulse \key{R}, y escriba la palabra
``hungry''.
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
Now is the time for all women to come to the aid of the hungry\underline{.} \\
\~{} \\
\~{} \\
\~{} \\
\~{} \\
\~{} 
\end{minipage}}\end{tscreen}

El uso de {\tt R} para editar texto es bastante parecido al uso de las
\'ordenes {\tt i} y {\tt a}, pero {\tt R} sobreescribe texto en lugar de
insertarlo.

La orden {\tt r} sustituye un \'unico car\'acter situado debajo del cursor.
Por ejemplo, situe el cursor al comienzo de la palabra ``Now'' y escriba
{\tt r} seguido de {\tt C}. Obtendr\'a:
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
\underline{C}ow is the time for all women to come to the aid of the hungry. \\
\~{} \\
\~{} \\
\~{} \\
\~{} \\
\~{} 
\end{minipage}}\end{tscreen}

La orden ``{\tt \~{}}'' cambia de may\'usculas a min\'usculas o viceversa 
la letra sobre la que se encuentra el cursor. Por ejemplo, si situa el 
cursor sobre la ``o'' de ``Cow'', y repetidamente pulsa \key{\~{}}, 
obtendr\'a: 
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
COW IS THE TIME FOR ALL WOMEN TO COME TO THE AID OF THE HUNGRY\underline{.} \\
\~{} \\
\~{} \\
\~{} \\
\~{} \\
\~{} 
\end{minipage}}\end{tscreen}
\index{vi@{\tt vi}!modificando texto|)}


\subsection{Ordenes de movimiento}
\index{vi@{\tt vi}!moviendo el cursor}

Ya conoce como usar las teclas del cursor para moverse por el documento.
Adem\'as, puede usar las \'ordenes {\tt h}, {\tt j}, {\tt k} y {\tt l} 
para mover el cursor a la izquierda, abajo, arriba y derecha 
respectivamente. Esto es muy c\'omodo cuando (por alguna raz\'on) sus 
teclas de cursor no funcionen correctamente.

La orden {\tt w} mueve el cursor al comienzo de la siguente palabra;
{\tt b} lo lleva al comienzo de la palabra anterior.

La orden {\tt 0} (cero) mueve el cursor al comienzo de la l\'{\i}nea actual, 
y la orden {\tt \$} lo lleva al final de la l\'{\i}nea.

Al editar ficheros grandes, querr\'a moverse hacia adelante y atr\'as a lo largo
del fichero mostrando una pantalla cada vez. Pulsando \key{ctrl-F} avanza el
cursor una pantalla hacia adelante y \key{ctrl-B} lo lleva una pantalla
atr\'as.

Para llevar el cursor al final del fichero, pulse {\tt G}. Puede tambi\'en
desplazarse a una l\'{\i}nea arbitraria; por ejemplo, pulsando la orden {\tt 
10G} llevar\'a el cursor a la l\'{\i}nea 10 del fichero. Para desplazarse al 
comienzo, use {\tt 1G}.

Puede asociar \'ordenes de desplazamiento con otras \'ordenes como es el
borrado. Por ejemplo, la orden {\tt d\$} borrar\'a todo desde la posici\'on del
cursor al final de la l\'{\i}nea; {\tt dG} borrar\'a todo desde la 
posici\'on del cursor al final del fichero.

\subsection{Guardando ficheros y saliendo de {\tt vi}}
\index{vi@{\tt vi}!guardando cambios}
\index{vi@{\tt vi}!escribiendo cambios}
\index{vi@{\tt vi}!saliendo}

Para salir de {\tt vi} sin modificar el fichero use la orden {\tt :q!}. Al
pulsar ``{\tt :}'', el cursor se desplazar\'a a la \'ultima l\'{\i}nea de la
pantalla; est\'a en modo \'ultima l\'{\i}nea.
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
COW IS THE TIME FOR ALL WOMEN TO COME TO THE AID OF THE HUNGRY. \\
\~{} \\
\~{} \\
\~{} \\
\~{} \\
\~{} \\
:\underline{\ }
\end{minipage}}\end{tscreen}

En el modo de \'ultima l\'{\i}nea hay disponibles una serie de \'ordenes 
extendidas. Una de ellas es {\tt q!}, la cual permite salir de {\tt vi} 
sin guardar los cambios. La orden {\tt :wq} salva el fichero y sale de 
{\tt vi}. La orden {\tt ZZ} (desde el modo de \'ordenes, sin ``{\tt :}'') 
es equivalente a {\tt :wq}. Recuerde que debe pulsar \key{enter} 
despu\'es de introducir la orden para que esta se ejecute en el modo 
\'ultima l\'{\i}nea.

Para salvar el fichero sin salir de vi, simplemente use {\tt :w}.

\subsection{Editando otro fichero}
\index{vi@{\tt vi}!conmutando entre ficheros}

Para editar otro fichero use la orden {\tt :e}. Por ejemplo, para dejar de
editar el fichero {\tt test} y en su lugar editar el fichero {\tt foo}, use 
la orden
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
COW IS THE TIME FOR ALL WOMEN TO COME TO THE AID OF THE HUNGRY. \\
\~{} \\
\~{} \\
\~{} \\
\~{} \\
\~{} \\
:e foo\underline{\ }
\end{minipage}}\end{tscreen}

Si usa {\tt :e} sin salvar primero el fichero, obtendr\'a el mensaje de error
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
No write since last change (":edit!" ~overrides)
\end{minipage}}\end{tscreen}
lo cual significa que {\tt vi} no quiere editar otro fichero hasta que salve
el primero. En este punto, puede usar {\tt :w} para guardar el fichero
original, y entonces usar {\tt :e}, o puede usar la orden
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
COW IS THE TIME FOR ALL WOMEN TO COME TO THE AID OF THE HUNGRY. \\
\~{} \\
\~{} \\
\~{} \\
\~{} \\
\~{} \\
:e! foo\underline{\ }
\end{minipage}}\end{tscreen}

El signo ``{\tt !}'' le dice a {\tt vi} lo que realmente desea
usted---editar el nuevo fichero sin salvar los cambios del primero.

\subsection{Incluyendo otros ficheros}
\index{vi@{\tt vi}!incluyendo ficheros}

Si usas la orden {\tt :r} Puede incluir el contenido de otro fichero en el
fichero que est\'a editando. Por ejemplo
\begin{tscreen}
:r foo.txt
\end{tscreen}
insertar\'{\i}a el contenido del fichero {\tt foo.txt} en el texto en la 
posici\'on actual de cursor.

\subsection{Ejecutando comandos del int\'erprete}
\index{vi@{\tt vi}!comandos del int\'erprete desde}

Puede tambi\'en ejecutar comandos del int\'erprete desde el interior de {\tt 
vi}. La orden {\tt :r!} funciona como {\tt :r}, pero en lugar de leer un 
fichero, inserta la salida de un comando dado en el fichero en la 
posici\'on actual del cursor.
Por ejemplo, si usa la orden
\begin{tscreen}
:r! ls -F
\end{tscreen}
obtendr\'a
\begin{tscreen}\fbox{\begin{minipage}{0.8\textwidth}
COW IS THE TIME FOR ALL WOMEN TO COME TO THE AID OF THE HUNGRY. \\
letters/ \\
misc/ \\
papers\underline{/} \\
\~{} \\
\~{} 
\end{minipage}}\end{tscreen}

Tambi\'en puede salir a un int\'erprete de comandos desde {\tt vi}, es decir,
ejecutar una orden desde dentro de {\tt vi} y volver al editor una vez esta
finalize. Por ejemplo, si usa la orden
\begin{tscreen}
:! ls -F
\end{tscreen}
la orden {\tt ls -F} ser\'a ejecutada, y los resultados mostrados en la
pantalla, pero no insertados en el fichero en edici\'on.
Si usa la orden
\begin{tscreen}
:shell
\end{tscreen}
{\tt vi} iniciar\'a una instancia del int\'erprete de comandos, permitiendole
temporalmente dejar a vi ``parado'' mientras ejecuta otras \'ordenes.
Simplemente salga del int\'erprete de comandos (usando la orden {\tt exit})
para regresar a {\tt vi} 


\subsection{Obteniendo ayuda}

{\tt vi} no proporciona demasiada ayuda de forma interactiva (la 
mayor\'{\i}a de los programas UNIX no lo hacen), pero siempre puede leer 
la p\'agina de manual para {\tt vi}. {\tt vi} es un ``front-end'' visual 
para el editor {\tt ex}: es decir, es {\tt ex} quien maneja la 
mayor\'{\i}a de las \'ordenes en el modo \'ultima l\'{\i}nea. Luego 
adem\'as de leer la p\'agina de {\tt vi}, consulte la de {\tt ex} tambi\'en.
\index{vi@{\tt vi}|)}
