3.0 Cómo se hace... ?



3.0 - Como se hace "buscar y sustituir"?

Hay varias formas, pero la más simple es:

:[rango]s/buscar/sustituir/[cgi]

Donde [rango] especifica el rango de líneas donde queremos realizar la búsqueda, incluyendo números y los símbolos $, que indica el final del fichero, . que indica la situación actual del cursor , % que indica el fichero actual o bien dos números separados por comas. También podemos especificar un desplazamiento respecto a la situación actual con +n, donde n especifica el número de líneas que queremos desplazarnos. Ejemplos de rangos válidos serían:

:1,5s/viejo/nuevo/ que especifica realizar la sustitución desde las líneas 1 a la 5.
:.,$s/viejo/nuevo/ que especifica realizarla desde la posición actual hasta el final del fichero.
:.,+5s/viejo/nuevo/ que la realiza desde la posición actual hasta 5 líneas más adelante.
La opción [cgi] nos permitirá especificar el comportamiento que tendrá esta búsqueda, donde:
c hace que el vi pida una confirmación de la sustitución
g le indica al vi que la búsqueda se realizará para todas las ocurrencias dentro de una misma línea
i hace que la búsqueda sea insensible a mayúsculas.
Como era de esperar, podemos utilizar expresiones regulares [regexp(5)] en las búsquedas, de tal forma que utilizando \( y \) para utilizar secuencias podremos realizar cosas realmente complicadas.

Por ejemplo,

:g/\(Bar\)\(celona\)/s/\2/\1na/g cambiará en todo el fichero Barcelona por Barna (porque \1 indica el primer elemento y \2 indica el segundo).
Los caracteres especiales que se permiten son los siguientes:
& Cualquier cadena que cumpla el criterio de búsqueda.
\[1-9] El contenido del token 1 al 9 (donde cada token viene marcado por un par \(token\)
\u Pasará a mayúsculas el próximo carácter.
\U Todos los caracteres hasta \e o \E se pasarán a mayúsculas.
\l El próximo carácter se pasará a minúsculas.
\L Todos los caracteres hasta \e o \E se pasarán a minúsculas.
\[eE] Indica el fin de la selección para el paso a mayúsculas o minúsculas.

3.1 - Cómo se ejecuta un programa desde dentro del vi?

El comando :!cmd ejecutarña el comando externo cmd. También podremos utilizar :sh para ejecutar una shell. Desde dentro de esta shell podremos volver a correr el vi si es necesario, pero entraremos en otra sesión de vi. Esto es particularmente útil si estamos editando un Makefile y diferentes ficheros de configuración cuando intentamos compilar un programa. La ventaja con respecto a :e es que no es necesario grabar lo que estamos haciendo, y ademas el fichero estará allí donde lo dejamos al salir de la shell que hemos abierto. De todas formas, no deja de ser altamente recomendable grabar antes de abrir la nueva shell... nunca se sabe!

3.2 - Socorro! Estaba escribiendo un documento y el ordenador "se'scoñó!

Deberías recibir un mail acerca del problema. Es decir, el vi tendría que enviarte un mail comunicándote el problema y diciendo cómo solucionarlo. De todas formas, podrás recuperar una copia de lo que estabas haciendo ejecutando vi -r <fichero>, donde <fichero> es el fichero que estabas editando cuando el ordenador se fué al garete. La orden vi -r te dará una lista de todos los ficheros que se pueden recuperar (si estabas editando más de uno en el momento del fallo).

3.3 - Algún truco para hacerle la vida más fácil a los programadores?

:set ai activa la indentación automática.
:set sw=# donde # es un número especifica el ancho del tabulador (el número de espacios que se indenta).

Puedes usar << y >> para desplazar una línea a la izquierda o a la derecha. Además podrñas utilizar <% para desplazar una {, ( o [ hacia la izquierda o a la derecha (con >%). Para poder hacer esto, debes estar situado sobre el símbolo en cuestión.

:set sm te mostrará el {, [ o ( correspondiente cuando lo cierres (su pareja correspondiente).
:set lisp realizará algunos cambios que son útiles para la programación en lisp.

3.4 - Cómo escribir macros?

:map <lhs> <rhs> donde <lhs> tendrá como máximo 10 caracteres y <rhs> tendrá como máximo hasta 100. Con esto conseguiremos que cada vez que escribamos <lhs> a se remplazará con <rhs>. Todas las macros han de comenzar en modo comando, pero pueden terminar en cualquier modo que deseemos. Ah! y no olvides utilizar el control ^V antes de utilizar cualquier código de control.

:unmap <lhs> borra la macro..

:map! <lhs> <rhs> hará que al escribir <lhs> dentro del documento (en modo inserción), se traduzca por <rhs>

3.5 - Cómo asigno una macro a una tecla de función?

If <lhs> is #n where n is 0-9, it will be mapped to the appropriate function key.

3.6 - Se puede abreviar texto?

Por Supuesto!. Esto es vi, chaval! puede hacer cualquier cosa.
:ab email avalle@abast.es hará que cada vez que se escriba la palabra email el vi la traduzca por avalle@abast.es :una email elimina esta conversión.

3.7 - Cómo puedo realizar una corrección ortográfica del documento?

Aquí tienes una macro para poder hacerlo. Si realmente la vas a utilizar, deberías ponerla en el fichero .exrc. Es bastante simple: ejecuta el comando ispell sobre el fichero actual, pero por supuesto, debes tener el ispell instalado en tu sistema. (Lo puedes encontrar aquí). Para utilizarlo, sólo hay utilizar la V en modo comando.(El vi no utiliza la V, así que es correcto realizar este mapeo).

map V :w^M:!ispell % ^M:e!^M^M

El segundo código ^M hace que no sea necesario pulsar retorno después de que se haya ejecutado el ispell para volver al vi.

3.8 - He conseguido un "hardcopy terminal", lo puedo usar con el vi?

En fin... No era de esperar que en las puertas del 2000 alguien preguntara esto (incluso el traductor no tiene ni idea de como traducir el nombre de este cacharro. Si alguien lo sabe, por favor, que avise!). De todas formas, la cuestión tiene solución, y además resuelve otras dudas, así que allá vamos:

El vi arrancará en un modo específico llamado "open mode". En general, todo funcionará más o menos igual, pero será bastante incómodo de trabajar. Los caracteres borrados aparecerán como "back slash" (\). El vi actuará como si el tamaño de la ventana fuese de sólo una línea. Con ^r volveremos a escribir la línea en curso y z refresca la ventana alrededor de la línea actual.

3.9 - Ah, bueno...Así que eso es el open mode? Yo no tengo un "hardcopy terminal", y aún me arranca en "open mode"

:-) Lo que ocurre es que el editor no sabe con qué tipo de terminal se las tiene que ver, así que decide que en esta situación lo mejor que puede hacer es suponer que tienes la peor terminal posible. Podría parecer bastante inútil, pero hay que tener en cuenta que en este modo, el vi casi no necesita saber nada acerca de tu terminal para poder trabajar.

Ahora vamos a ver cómo arreglárnoslas con esto. Sería posible cambiar la configuración para la sesión en curso, pero sería bastante poco práctico, ya que tendríamos que volver a realizar todos los cambios al iniciar otra sesión. Si sabes qué tipo de terminal tienes, puedes configurarlo desde el prompt del sistema, actualizando el valor de la variable TERM (con setenv TERM <termtype> si utilizas la C-shell o sus derivados o con TERM=<termtype> ; export TERM si utilizas Bourne-Shell o derivados)

Lo mejor que podrías hacer sería editar tu fichero .profile o .chsrc para que la variable TERM se configura automáticamente al iniciar una sesión. (Por supuesto, necesitarás conocer el ed o configurar la variable *antes* de editar el fichero para que el vi te funcione correctamente!).

Si no sabes qué tipo de terminal tienes, prueba con vt100. La mayoría de los terminales y emuladores actuales pueden emular correctamente el terminal vt100. Si no te funciona, busca alguien que te pueda ayudar a determinar el valor correcto de la variable. ( En HP-UX existe un comando /usr/bin/ttytype que te puede ayudar a identificar el tipo de terminal).


[Indice][Siguiente][Anterior]
Esta versión de las Faq de vi ha sido recopilada por:Baruch Promislow de Macom Networking LTD.
La versión en castellano ha sido realizada por: Antonio Valle, de Abast Systems, S.A.

(C)opyright, E. Larry Lidz, 1994, 1995. All Rights Reserved.
(C)opyright, Antonio Valle, 1996. Todos los Derechos Reservados.