| Esta p�gina puede ser redistribuida libremente bajo los t�rminos de la licencia GPL. Vease ( GPL texto original ) o si lo prefiere (Traducci�n espa�ola no oficial de la GPL) Al margen de las obligaciones legales que se derivan del uso de esta licencia rogamos sea respetada la referencia a su lugar de publicaci�n original www.ciberdroide.com. y a su autor original Antonio Castro Snurmacher (Madrid 01/01/2000). |
|
Esta ausencia de garant�a se hace extensa a cualquier tipo de uso de este material y muy especialmente a las pr�cticas, ejercicios, y de ejemplos que encuentre en estas p�ginas. Deber� trabajar siempre salvo indicaci�n contraria con un SO Linux y con un usario distinto de 'root' sin privilegios especiales. Como directorio de trabajo se procurar� usar el directorio '/tmp' o alg�n otro que no contenga informaci�n valiosa. Tampoco se considera buena idea practicar en una m�quina que contenga informaci�n valiosa. Todo esto son recomendaciones de prudencia. En cualquier caso si algo sale mal toda la responsabilidad ser� �nicamente suya. En ning�n caso podr� reclamar a nadie por da�os y perjuicios derivados del uso de este material. Para m�s informaci�n lea el contenido de la licencia GPL y abstengase de hacer pr�cticas si no est� dispuesto a asumir toda la responsabilidad.
|
Objetivos de esta lecci�n
Poco a poco vamos a ir asumiendo un mayor dominio
del alumno. Ya no vamos a detallar tan a menudo paso por paso cosas
que ya se han explicado y practicado m�s de una vez. Eso le obligar� a poner
un poco m�s de iniciativa por su parte.
Los ejemplos de las lecciones anteriores eran pr�cticas totalmente
guiadas, comando a comando, pero a partir de ahora tendr� que probar cosas
no necesariamente id�nticas a los ejemplos que nosotros utilicemos.
No se preocupe. Seguro que lo har� muy bien.
Si ha llegado hasta aqu� es se�al de haber conseguido un avance
significativo en sus conocimientos, y como Linuxero se encuentra quiz�s
a medio camino entre el novato bruto y
extremadamente torpe y el repugnante listillo inform�tico. :-)
Confiamos plenamente en su capacidad pero recuerde que nosotros no
somos responsables de lo que pueda pasarle a su ordenador. Contin�e
practicando con un usuario distinto de root y un directorio que no
contenga informaci�n valiosa.
Seguramente en esta lecci�n aprenda cosas que algunas personas que llevan
usando 'vi' durante varios a�os a�n no conocen, pero tambi�n contiene
cosas que pueden ser muy importantes para usted. No todos usamos las mismas
cosas. La mayor�a de los documentos que explican el uso de 'vi' lo hacen de
forma muy incompleta. Nosotros no vamos a hacer un tratado completo de
este editor porque necesitar�amos muchas lecciones y nos saldr�amos de los
objetivos del curso pero si procuraremos mostrarle un amplio abanico de
posibilidades para que tenga donde elegir. En la primera lecci�n sobre 'vi'
le mostramos un juego reducido de comandos pero suficiente para defenderse.
En esta lecci�n le damos la posibilidad de convertirse en un virtuoso de
este editor.
B�squedas
Es decir que algunos caracteres no los podemos usar tal cual para
buscarlos sino que hay que es caparlos. En el caso anterior hemos escapado '/'.
Tenga en cuenta esto cuando intente por ejemplo buscar un car�cter '$' en
un texto.
Con 'n' buscar� la ocurrencia siguiente de la
cadena en el fichero. Con 'N' buscar� la ocurrencia anterior.
Una vez llegado al final comienza de nuevo la b�squeda por el principio.
Tambi�n se puede empezar la b�squeda desde el primer momento en sentido
ascendente usando '?' en lugar de '/'. En este caso los comandos 'n' y
'N' tambi�n funcionaran en sentido contrario que con el comando '/'.
Si usamos '/' o '?' sin nada m�s a continuaci�n, se repetir� la �ltima
b�squeda.
Las expresiones regulares ofrecen grandes posibilidades como ya hemos visto
pero particularmente interesantes para 'vi' pueden ser
las b�squedas a principio o a final de una l�nea.
En el ejemplo buscaremo 'El' a principio de una l�nea y luego 'as' al
fineal de l�nea.
Sustituciones
Vamos a poner tres formas distintas de sustituir 'encarnado' por 'colorado'
en las tres primeras l�neas de un texto, y solo deseamos que ocurra la
sustituci�n en la primera ocurrencia de cada l�nea caso. Es decir si una
l�nea contiene varias veces la palabra 'encarnado' solo deseamos sustituir
la primera.
Ahora de dos formas distintas vamos a sustituir en todo el texto 'encarnado'
por 'colorado'. Es decir si una linea contiene varias veces la palabra
'encarnado' deseamos que la sutituci�n se realice en todas ellas. Para
eso utilizaremos un comando similar al anterior pero finalizado en '/g'.
Los ejememplos solo var�an en la forma de indicar con '1,$' o con '%'
la b�squeda en todo el texto.
Ahora si sutituimos en todo el texto 'encarnado' por 'colorado' pero
confirmando cada cambio manualmente. Para eso utilizaremos un comando
similar al anterior pero finalizado en '/gc'. La 'g' tiene el mismo
significado que en el caso anterior y la 'c' significa 'confirmaci�n'.
Vamos a usar ahora las sustituciones con expresiones regulares.
1) Poner a doble l�nea todo un texto.
2) Eliminar blancos y tabuladores a final de linea.
3) Eliminar blancos y tabuladores al principio de l�nea.
4) Sustituir cualquier secuencia de blancos y tabuladores por
un �nico blanco.
5) Poner entre par�ntesis todos los n�meros enteros de un texto.
En este �ltimo hemos usado el operador '&' en la misma forma que
vimos con 'sed' unas lecciones atr�s.
Se pueden hacer en poco tiempo cosas bastante complejas.
Por ejemplo vamos a hacer un shell-script que genere
otro shell-script. Para ello primero lo que haremos es
escribir el programa que deseamos generar.
Para generarlo bastar� tratar cada l�nea poniendo un
"echo '" al comienzo de cada l�nea y una comilla simple al
final "'" de cada l�nea, pero antes escaparemos cualquier
posible comilla simple que pudiera existir. Para ello editamos el
texto anterior y hacemos lo siguiente:
Deber� quedarnos de esta forma.
Bueno lo hemos realizado con 'vi' y a pesar de lo complicado
del resultado solo hemos realizado tres operaciones sencillas.
Ahora ejecute este fichero y ver� como obtiene el primero.
Bueno si no conoce C no le entusiasmar� este otro ejemplo pero
eso de hacer programas que generan programas nos sirve para
practicar las sustituciones usando 'vi'.
Podemos escribir el programa en C que deseamos generar y luego
tratarlo sustituyendo todas las '\' por '\\' y todas las '"'
por '\"'. Es decir escapamos esos dos caracteres que dar�an
problemas m�s tarde. Luego a�adimos a principio de cada l�nea
'printf("' y finalizamos cada l�nea con '\n");'
Las sustituciones que acabamos de mencionar ser�an de esta forma.
Edici�n de varios ficheros secuencialmente
Bueno esto puede ser m�s �til de lo que parece a simple vista. Vamos a
suponer que tenemos que modificar una gran cantidad de ficheros
para sustituir en muchos de ellos la cadena 'acastro' por la cadena
'A.Castro' pero tampoco lo podemos hacer de forma autom�tica porque
nos conviene ver caso a caso. Por eso pasamos a 'vi' el resultado de
una b�squeda con 'grep'.
Una vez dentro del editor hacemos lo siguiente.
El comando ':args' nos informar� del nombre de los ficheros que vamos
a editar secuencialmente. Intente probar esto creando sus propios
ficheros de prueba. Ya sabe como hacerlo. Conviene que todos ellos
tengan una cadena id�ntica para ser localizada con grep.
Una vez que el editor 'vi' este preparado para editar secuencialmente
varios ficheros busque la cadena con el operador '/'
y aunque pasemos a editar el siguiente fichero se conservar� almacenada
la cadena de b�squeda.
Esta forma de trabajar facilita mucho la modificaci�n de varios ficheros.
Para editar ficheros secuencialmente le conviene tener en cuenta los
siguientes comandos. Algunos no los hab�amos comentado todav�a.
Edici�n simultanea de ficheros
Visualizaci�n de caracteres de control
Introduciendo caracteres de control en el texto
Tambi�n se pueden buscar caracteres de control. Para ello tamb�en
hay que introducirlos usando <CTRL+V>.
Edite un fichero de prueba y proceda a poner varios saltos de p�gina
en distintos lugares. Luego busque con '/' y con '?' los saltos de p�gina.
Pruebe a insertar los c�digos de las teclas <ENTER> y <ESC>, mediante
<CTRL+V><ENTER> y <CTRL+V><ESC> respectivamente. Deber�n
aparecer como '^M' y como '^['.
El comando tilde
Operaciones con bloques
Tambi�n podemos posicionarnos en el lugar de una marca pulsando
comilla-simple y <letra-min�scula> desde el modo comandos. Un detalle
interesante es que siempre podemos volver a la l�nea donde nos
encontr�bamos, la �ltima vez que dimos un salto de posici�n en el
texto. Para ello pulsamos '' (comilla-simple dos veces).
Repetici�n del �ltimo comando
Tabulaci�n
Abreviaturas
Use sus propias abreviaturas en un texto y observe como la abreviatura
no ser� interpretada si la secuencia de caracteres forma parte de una
palabra.
Macros
Con esta macro ocurrir� algo. En primer lugar si teclea las tres
'x' seguidas se ejecutar�n los comando '4dd' (borrar cuatro lineas),
':$<ENTER>' (ir a la �ltima l�nea) y 'p' (recuperar el contenido del
buffer)
Si pulsamos una sola 'x' notaremos que no pasa nada inmediatamente
pero luego se eliminar� un car�cter tal y como ocurre normalmente.
Es decir la macro tiene un tiempo para ser tecleada completamente
en caso contrario no act�a. Para ver todas las macros definidas usaremos ':map'
Podemos eliminar la macro que acabamos de crear con 'unmap'
Muchas veces se usan las macros para definir comandos asociados
a teclas especiales. Para ello hay que conocer la secuencia de caracteres
que env�an esas teclas. Si en modo inserci�n usamos <CTRL+V><F2> obtendremos
'^[[[B'. Pero tambi�n podemos usar '<F2>' para definir macros.
Vamos a poner algunos ejemplos pr�cticos.
F2 (Filtro PGP) Firmar.
Ser�a lo mismo si usaramos '<F2>' en lugar de '^[[[B'.
F3 (Filtro PGP) Encriptar
F4 (Filtro PGP) Desencriptar y comprobar firma
F5 (Filtro ispell) Corrector ortogr�fico.
Opciones de vi
Configuraci�n del editor
Esta lecci�n menciona algunas posibilidades avanzadas del editor 'vi'.
Se supone que el alumno ha estudiado las lecciones precedentes y
en particular el cap�tulo anterior dedicado al editor 'vi'. Eso significa
que ya sabe editar. Vamos a suponer que incluso ha practicado un
poco por su cuenta. Por ello lo que vamos a explicar en este cap�tulo
ser� de escasa utilidad si no ha asimilado la lecci�n anterior.
Desde el modo comandos se puede usar '/' para buscar. Admite expresiones
regulares. Por ejemplo si introduce '/debian.com' podr�a localizar una
cadena 'debian-com' o 'debian:com' y no solo 'debian.com'. Recuerde que
algunos caracteres como el punto el asterisco, etc tienen un significado
especial y para usarlas en 'vi' hay que precederlas de '\' que actuar�
como car�cter de escape. Tambi�n hay que escapar los caracteres como
por ejemplo '/' y '&' porque sin tener significado como operador de
expresi�n regular si tiene un significado especial para 'vi' que veremos
cuando expliquemos las sustituciones.
No vamos a volver a explicar las expresiones regulares porque ya dedicamos
una lecci�n. Practique lo que va aprendiendo y recuerde que las expresiones
regulares no funcionan igual en todas las aplicaciones. Vamos a poner varios
ejemplos para su uso en b�squedas desde 'vi'.
Para buscar '</TABLE>' habr�a que usar '/<\/TABLE>'.
'/^El'
'/as$'
Ya dispone de un resumen de todos los comandos de 'vi' que proporcionamos
en el cap�tulo anterior as� que lo mejor es presentar una serie de
ejemplos explicando para que sirven.
:1,3 s/encarnado/colorado/
:1,3 s:encarnado:colorado:
:1,3 s�encarnado�colorado�
:1,$ s/encarnado/colorado/g
:% s/encarnado/colorado/g
:1,$ s/encarnado/colorado/gc
:%s/$/\
/g
:%s/[space tab]*$//
:%s/^[space tab]*//
:%s/[space tab][space tab]*/ /
:%s/[0-9][0-9]*/\(&\)/g
echo 'kkkk'
echo 'kkkk'\''hhhh'
:% s/\'/\'\\\'\'/g
:% s/^/echo \'/
:% s/$/\'/
echo 'echo '\''kkkk'\'''
echo 'echo '\''kkkk'\''\'\'''\''hhhh'\'''
:% s/\\/\\\\/g
:% s/"/\\"/g
:% s/^/printf("/
:% s/$/\\n");/
Al editor 'vi' se le puede pasar como argumento no solo un fichero sino
varios para ser editados en secuencia. Por ejemplo:
$ vi fich1 fich2 fich2
$ vi `grep -il acastro *.txt`
:args
:args Obtiene la lista de los ficheros
:next Pasa al fichero siguiente
:prev Vuelve al fichero anterior
:rewind Vuelve al primero
:rewind! Vuelve al primero abandonando los cambios en el fichero actual
:w Salva los cambios del fichero anterior
:q Sale del editor. (Solo si ya se han editados todos)
:q! Sale del editor incondicionalmente.
Podemos pasar de la edici�n de un fichero a la edici�n de otro
usando ':e fichero'
pero antes deberemos salvar el contenido de la edici�n actual.
Tambi�n podemos forzar el paso a editar otro fichero con ':e! fichero'
pero en ese caso se perder�n las modificaciones realizadas.
Usando ':e#' volvemos a retomar la edici�n del fichero anterior situados
en la misma l�nea donde lo dejamos. Intente practicar lo siguiente
editando unos ficheritos de prueba.
:e fich1
:w
:e fich2
:e! fich3
:e#
En 'vi' los caracteres de control se visualizan como un acento circunflejo
y una letra. Por ejemplo <CTRL+K> se visualizar� como '^K' y la manera de
distinguir un car�cter circunflejo real seguido de una 'K' es moviendo
el cursor para ver si de desplaza uno o dos caracteres cuando pasamos
por el car�cter circunflejo. Tambi�n se usa con similar significado
el car�cter tilde '~' pero para caracteres de 8 bits.
Imaginemos que deseamos introducir un car�cter de control para provocar
un salto de p�gina en la impresora. Para ello deberemos introducir un
<CTRL+L> que ser� visualizado como '^L'. La forma de hacerlo es pulsar
desde el modo inserci�n el car�cter <CTRL+V> y a continuaci�n el car�cter
<CTRL+L>. Es decir el car�cter <CTRL+V> act�a como car�cter de escape.
Podemos pulsar <CTRL+V> y luego una tecla de funci�n, u otras teclas
especiales.
El comando '~' sustituye el car�cter situado bajo el cursor de may�scula
a min�scula y viceversa avanzando luego el cursor.
Se pueden marcar hasta 26 posiciones ('a'..'z') para un conjunto de uno
o mas ficheros editados simult�neamente. Permite trabajar marcando
principio y fin de bloques para mover, copiar o borrar en varios ficheros.
Se pueden usar las marcas en cualquier comando en sustituci�n de '.', '$',
o los n�meros de l�nea como ya hemos visto. La ventaja es que si estamos
insertando o borrando l�neas tendr�amos que volver a comprobar los n�meros
de l�neas. Por el contrario si hemos colocado una marca en una l�nea
continuar� en esa l�nea mientras no la eliminemos. Para colocar una marca
podemos situarnos con el cursor en la l�nea deseada y luego hacer
':k <letra-min�scula>' ':ma <letra-min�scula>'
':ma <letra-min�scula>'
o directamente sin pasar al modo ex mediante 'm <letra-min�scula>'.
Para practicar con ello edite un fichero de prueba y coloque varias
marcas en distintas l�neas. Luego realice distintas operaciones como
por ejemplo el borrado de bloques. Compruebe como desaparece una marca
cuando se borra la l�nea que la contiene. Las marcas no se ven pero
si intenta usar una marca que no existe obtendr� un error.
Compruebe como reaparece la marca cuando deshace la operaci�n con 'u'
(undo). Algunas formas de utilizaci�n de marcas son las siguientes.
:'a,'b de
:'b,'b+1 de
:'a,. de
:'a,'b co 'c
:'a,'b mo 'c
Cuando hay que hacer varias veces la misma cosa resulta tremendamente
�til poder repetir el �ltimo comando. Imaginemos que desde el modo de
comandos hacemos en una l�nea 'RL�nea <ESC>' para sustituir 6
caracteres por la cadena 'L�nea ' Inmediatamente despu�s de ello y
antes de hacer ninguna otra cosa
podr�amos situarnos en otra l�nea y pulsar '.' (punto) para repetir
ese mismo comando y luego cambiar a otra y otra l�nea y volver a pulsar
'.' punto a cada vez para efectuar el mismo cambio en varios sitios.
Tamb�en mencionamos la posibilidad de ejecutar un comando del sistema
operativo lanzando una sub-shell. Pues bien este tipo de comandos
': <comando>' puede ser repetido usando ':!!'
El car�cter con la tecla <TAB> o con el car�cter <CTRL+I> insertar�
un car�cter de tabulaci�n. El ancho de la tabulaci�n ser� por defecto
igual a 8 espacios. Esto puede ser variado por ejemplo a 5 con
':set tabstop=5'. Si deseamos a�adir un tabulador al principio de l�nea
en las siguientes 7 lineas a la posici�n del cursor podemos hacer.
'7>>'. Tamb�en se podr�a haber hecho lo mismo con ':.,.+7 >>'.
Para insertar un tabulador a principio de cada l�nea del texto ser�a
':% >>'
Cuando se usa el editor para editar fuentes de programas puede resultar
�til usar la indentaci�n autom�tica. 'set ai' para eliminar la indentaci�n
autom�tica usaremos 'set noai'. Si en alguna ocasi�n necesita sustituir
todos los tabuladores por caracteres en blanco use el comando 'expand'.
No es un comando de 'vi' sino del SO. Consulte con el man su sintaxis y
las distintas opciones. Para hacer una prueba edite un fichero insertando
tabuladores y luego conviertalo de la siguiente forma.
expand fichero > ficheroexpandido.
En 'vi' hay muchos detalles pensdos a ahorrar pulsaciones de declas.
Vamos a ver el comando ':ab'
Si est� acostumbrado al uso de abreviaturas le resultar� muy pr�ctico.
Puede definir las abreviaturas que quiera y una vez tecleadas en modo
entrada de dados (insercion o sobrescritura) ser�n sustituidas por
la cadena que desee.
Vamos a usar dos abreviaturas una 'ci' para 'Ciberdroide Inform�tica'
y otra 'INMHO' para 'en mi humilde opini�n'. Tambi�n vamos a listar
las abreviaturas definidas.
:ab ci Ciberdroide Inform�tica
:ab INMHO en mi humilde opini�n
:ab
Es posible programar macros. Por ejemplo vamos a hacer una macro que
mueva 4 l�neas al final del fichero
:map xxx 4dd:$^Mp
:map
:unmap xxx
:map [[B 1G!Gpgp -satf 2>/dev/tty
:map <F2> 1G!Gpgp -satf 2>/dev/tty
:map [[C 1G!Gpgp -eatf 2>/dev/tty
:map [[D 1G!Gpgp 2>/dev/tty; sleep 7
:map [[E :w
:!ispell %
:e!
Ser�a absurdo pretender explicar en una lecci�n todo el editor 'vi'.
Tampoco hay necesidad de ello. Hay montones de opciones y ya hemos visto
algunas. Si el editor
es 'vim' en lugar de 'vi' el n�mero de posibilidades es aun mayor. Puede
ver las opciones disponibles y sus valores actuales usando el comando
':set all' desde el modo de comandos. No se asuste. No ha que conocerlas
todas. Hay opciones que seguramente la persona que las implement� ya
ha olvidado para
que sirven. Una opci�n se puede indicar muchas veces de dos formas. Una en forma completa y otra en forma abreviada. Por ejemplo ':set nu' en lugar de
':set number' y para desactivar la opci�n se
suele usar la misma opci�n precedida de 'no'. Por ejemplo ':set nonu' o
':set nonumber'. Las opciones que deben tomar un valor num�rico se
establecen con el nombre de la opci�n seguida de '=' y el valor. Por ejemplo
':set tabstop=5'
El fichero m�s est�ndar para configurar 'vi' en cualquier SO de
tipo Unix es '~/.exrc'. Como alternativa se puede usar ficheros
m�s espec�ficos para el editor concreto que estemos usando. Por
ejemplo en el caso de 'vim' tenemos '~/.vimrc'. Compruebe si existe
un ejemplo '/etc/vimrc' en su Linux y mire su contenido. Se trata de
un fichero de ejemplo para copiarlo en ' ~/.vimrc'
Contiene algunas configuraciones que pueden resultar �tiles.
El car�cter comilla doble '"' se usa para considerar el resto de la l�nea
como un comentario. Si considera que el editor tiene un comportamiento
que usted considera inc�modo quiz�s se deba a la existencia de algunas
opciones que no se adaptan al uso que usted da a su editor.
Por ejemplo para editar programas C puede resultar c�modo la auto-
indentaci�n pero no le gustar� que parta las l�neas autom�ticamente
cuando excedan un determinado ancho. Tambi�n es buena idea incluir en
su fichero de configuraci�n las abreviaturas y las macros que desee
usar. Ya hemos visto algunas y seguramente ya se ha preguntado como
hacer para no tener que introducirlas cada vez. Es bueno perder un
poco de tiempo en personalizar el editor.