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).

Ausencia de Garant�a

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.

EL EDITOR VI (segunda parte)

Objetivos de esta lecci�n
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.

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
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>'.

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.

'/^El'
'/as$'

Sustituciones
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.

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.

:1,3 s/encarnado/colorado/
:1,3 s:encarnado:colorado:
:1,3 s�encarnado�colorado�

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.

:1,$ s/encarnado/colorado/g
:% s/encarnado/colorado/g

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'.

:1,$ s/encarnado/colorado/gc

Vamos a usar ahora las sustituciones con expresiones regulares.

1) Poner a doble l�nea todo un texto.

:%s/$/\
/g

2) Eliminar blancos y tabuladores a final de linea.

:%s/[space tab]*$//

3) Eliminar blancos y tabuladores al principio de l�nea.

:%s/^[space tab]*//

4) Sustituir cualquier secuencia de blancos y tabuladores por un �nico blanco.

:%s/[space tab][space tab]*/ /

5) Poner entre par�ntesis todos los n�meros enteros de un texto.

:%s/[0-9][0-9]*/\(&\)/g

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.

echo 'kkkk'
echo 'kkkk'\''hhhh'

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:

:% s/\'/\'\\\'\'/g
:% s/^/echo \'/
:% s/$/\'/

Deber� quedarnos de esta forma.

echo 'echo '\''kkkk'\'''
echo 'echo '\''kkkk'\''\'\'''\''hhhh'\'''

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.

:% s/\\/\\\\/g
:% s/"/\\"/g
:% s/^/printf("/
:% s/$/\\n");/

Edici�n de varios ficheros secuencialmente
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

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'.

$ vi `grep -il acastro *.txt`

Una vez dentro del editor hacemos lo siguiente.

:args

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.

: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.

Edici�n simultanea de ficheros
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#

Visualizaci�n de caracteres de control
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.

Introduciendo caracteres de control en el texto
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.

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
El comando '~' sustituye el car�cter situado bajo el cursor de may�scula a min�scula y viceversa avanzando luego el cursor.

Operaciones con bloques
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

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
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 ':!!'

Tabulaci�n
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.

Abreviaturas
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

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
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

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'

:unmap xxx 

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.

:map [[B 1G!Gpgp -satf 2>/dev/tty

Ser�a lo mismo si usaramos '<F2>' en lugar de '^[[[B'.

:map <F2> 1G!Gpgp -satf 2>/dev/tty

F3 (Filtro PGP) Encriptar

:map [[C 1G!Gpgp -eatf 2>/dev/tty 

F4 (Filtro PGP) Desencriptar y comprobar firma

:map [[D 1G!Gpgp  2>/dev/tty; sleep 7

F5 (Filtro ispell) Corrector ortogr�fico.

:map [[E :w
:!ispell % 
:e!

Opciones de vi
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'

Configuraci�n del editor
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.

Tag
Para editar fuentes C por ejemplo resulta muy practico. Supongamos que tenemos un fuente llamado pingpong.c. Crearemos en primer lugar un fichero tags ejecutando "ctags pingpong.c" (ver ctags(C)). Se crea un fichero tags que contendr� por ejemplo lo siguiente:

plot	pingpong.c	?^plot(x, y, ch)$?
salir	pingpong.c	?^salir(s)$?

Con ello se referencian las funciones. Para editar el fichero podemos hacer vi -tplot. Aparecera el cursor en la posici�n de esa funci�n. Si introducimos :ta salir desde el modo de comandos nos situaremos en esa funci�n. Se pueden crear tags para varios ficheros simult�neamente mediante ctags */*.[cfg] (ver ctags(C)). De esta forma podr�amos editar c�modamente varios fuentes.

 

 

Volver a Editores

 

Hosted by www.Geocities.ws

1