domingo, 1 de marzo de 2009

HAL y vim (VI)

El resultado de nuestros merodeos por los pasadizos y mazmorras de Vim, es esta tabla o mapa del tesoro, que contiene en forma muy sucinta las órdenes tratadas hasta ahora:

Órdenes de movimiento e inserción directa
/=======================================================\
| | | | ∧ | ¦ | | |
| | --> | <-- | ¦ | ∨ | + | = *** |
|==========|======|======|======|======|================|
| Carácter | l | h | | | i, a | s, r |
|----------|------|------|------|------|------|---------|
| Palabra | w, W | | | | | cw,cW |
| | e, E | b, B | | | | cb,cB |
|----------|------|------|------|------|------|---------|
| Patrón* | / | ? | N | n | | |
|----------|------|------|------|------|------|---------|
| Frase | ) | ( | | | | c), c( |
|----------|------|------|------|------|------|---------|
| Párrafo | } | { | | | | c}, c{ |
|----------|------|------|------|------|------|---------|
| Línea | $ | 0 | k | j | I, A | C, c0 |
| | | | | | | cc |
| | | | gg | G | o, O | cgg, cG |
|----------|------|------|------|------|------|---------|
| Pantalla | | | H | L | | cH, cL |
| | | | ^B **| ^F | | |
\=======================================================/

* Las ordenes 'n' y 'N' se teclean después de ejecutar
/pat o ?pat, seguido de 'Enter', donde pat es el
fragmento de texto que se quiere localizar.
** ^B y ^F, es decir, 'Ctrl+B' y 'Ctrl+F'.
*** Nótese la profusión de órdenes compuestas con 'c'.

Con ese preciado bien, retornemos a los límpidos y aburridos menús del procesador de textos, que nos guiarán a lo largo del resto de la exposición. A partir de ahora todo será mucho más fácil.

Nos quedamos en el menú "Edición". Ese menú agrupa las típicas funciones de edición. Si tomamos de nuevo como referencia el de OpenOffice Writer (version 2.4), y nos limitamos a sus opciones básicas, podríamos entresacar las siguientes:

Deshacer/Restaurar
Deshacer la última acción de edición realizada o restaurar la acción realizada al deshacer.

Repetir última orden
Repetir la última acción de edición realizada.

Cortar
Cortar, esto es, eliminar un fragmento de texto y guardarlo en un registro, esto es, en una zona temporal de almacenamiento.

Copiar
Copiar un fragmento de texto en un registro para su uso posterior.

Pegar
Poner en un lugar concreto del documento que se está editando un fragmento de texto previamente cortado o copiado.

Seleccionar texto
Marcar un fragmento de texto para aplicar posteriormente sobre él una determinada función de edición.

Buscar y reemplazar
Buscar un fragmento de texto dentro del documento y, en su caso, sustituirlo por otro diferente.


Deshacer, rehacer y repetir una operación de edición son operaciones fáciles de llevar a cabo con Vim. Las órdenes cortas que proporciona son las siguientes:

u
Deshace (undo) la operación inmediatamente anterior.

Ctrl+R
Rehace (redo) la última operación deshecha.

.
[tecla del punto] Repite la última operación.


Cortar, copiar y pegar, aparte de escribir o insertar texto, son las operaciones más características del proceso de edición. La flexibilidad de Vim en esta materia es admirable, gracias al mapa de orientación de que disponemos.

Las dos órdenes básicas para cortar son:

  • Carácter:

    x
    Corta el carácter sobre el que está el cursor.

  • Texto:

    dobj
    Corta o elimina (delete) el objeto de texto indicado.


Tenemos, pues, que con la orden 'd' vuelve a ocurrir lo mismo que con 'c'. Así, por ejemplo:

  • Palabra:

    dw
    Corta lo que hay desde el cursor hasta el final de la palabra.

  • Línea:

    d$ (o su equivalente D)
    Corta lo que hay desde el cursor hasta el final de la línea.

    dd
    Corta la línea actual.

  • etc.


La orden para copiar, o expresado con otra metáfora, para tirar de (yank) una parte del texto y copiarla en un registro, es 'y'. Funciona de la misma forma que 'c' y 'd'. Podríamos, por tanto, ejecutar órdenes como las siguientes:

  • Palabra:

    yw
    Copia lo que hay desde el cursor hasta el final de la palabra.

  • Línea:

    y$ (aquí no existe el equivalente Y)
    Copia lo que hay desde el cursor hasta el final de la línea.

    yy
    Copia la línea actual.

  • etc.


Finalmente, para pegar o poner (put) lo cortado o copiado, esto es, lo que quedó almacenado en un registro, se pueden usar las órdenes p, P, gp y gP. La diferencia entre ellas tiene que ver con el lugar donde se pega el texto y con el lugar en que queda situado el cursor después de esa operación. El principiante puede limitarse a la primera opción y experimentar con el tiempo con las otras tres. Merece la pena citarlas, al menos, como prueba del grado de sofisticación de Vim en los pequeños detalles:


    p
    Pega el texto después del cursor.

    P
    Pega el texto antes del cursor.

    gp
    Igual que 'p' pero deja el cursor justo después del texto pegado.

    gP
    Igual que 'P' pero deja el cursor justo después del texto pegado.



La selección de texto no parece tener mucho sentido dentro de Vim. De hecho, todas las operaciones de edición o modificación que hemos visto seleccionan texto gracias a las teclas de movimiento. Por ejemplo, la orden y$ realiza en un solo paso una operación que en un procesador de textos requeriría, como mínimo, dos pasos: seleccionar el texto desde donde está el cursor hasta el final de la línea y copiar la selección. No obstante, Vim posee un dispositivo que emula el comportamiento de los procesadores de texto y se emplea en casos donde las operaciones citadas no son suficientes o para realizar ciertas actividades especializadas que no comentaremos aquí. Este dispositivo es un nuevo modo o teclado de operaciones: el modo visual, al que se accede desde el modo de órdenes mediante la orden:

v

Naturalmente, se puede salir del modo visual en cualquier momento y retornar la modo de órdenes pulsando la tecla Esc.

Lo peculiar del modo visual es que permite seleccionar texto a la vez que visualizamos la selección ---aparecerá resaltada---, para después realizar operaciones típicas de edición sobre el texto seleccionado. Las órdenes básicas de movimiento siguen funcionando en modo visual. De hecho, esta característica convierte al modo en un medio muy apropiado para que el principiante observe el efecto de las órdenes de movimiento, antes de atreverse a trabajar "a ciegas" con ellas. Las operaciones básicas de cortar y copiar en modo visual son semejantes a las existentes en el modo de órdenes:

x o d
Corta el texto seleccionado

y
Copia el texto seleccionado


Tras ejecutar las opciones anteriores Vim sale automáticamente (sin necesidad de pulsar Esc) del modo visual y regresa al modo de órdenes, desde el que podremos, en su caso, ejecutar 'p' de la forma habitual.

Veamos unos pocos ejemplos de estas tres operaciones (cortar, copiar y pegar) tanto en modo normal (por lo general, más rápido) como visual [Ver en las indicaciones a los ejemplos del día pasado las convenciones que utilizamos para presentarlos].

# Cortar una palabra y pegarla en la línea inferior
En un molino lugar de la Mancha
->dw
En un lugar de la Mancha
->ohabía un¶
->Esc
->p
En un lugar de la Mancha
había un molino


# Duplicar la línea
En un lugar de la Mancha
->yy
->p
En un lugar de la Mancha
En un lugar de la Mancha


# [Modo visual] Cortar una palabra y pegarla en la línea inferior
En un molino lugar de la Mancha
->v
->e
En un molino¶lugar de la Mancha
->d
En un lugar de la Mancha
->ohabía un¶
->Esc
->p
En un lugar de la Mancha
había un molino


# [Modo visual] Duplicar la línea
En un lugar de la Mancha
->0
->v
->$
En un lugar de la Mancha
->y
->o
->Esc
->p
En un lugar de la Mancha
En un lugar de la Mancha

Del menú "Edición" nos queda por ver únicamente la opción de búsqueda y remplazo. Nada más razonablemente sencillo, y flexible, para el usuario de consola. En Vim esta operación se efectúa de un modo muy semejante a la orden sed, que vimos hace ya un tiempo considerable. La orden de Vim correspondiente es:

:s/patrón_de_búsqueda/remplazo/

Normalmente se ejecuta con dos especificadores, uno inicial, que determina las líneas sobre las que se aplicará la sustitución y uno final, que indica el número de palabras dentro de cada línea que se remplazarán. Este último especificador es, casi siempre, g (de global), que indica que todas las palabras de cada línea coincidentes con el patrón de búsqueda serán remplazadas. Así, por ejemplo:

:s/HAL/Vim/g

remplaza todas las ocurrencias de la palabra "HAL" en la línea actual por la palabra "Vim".

El especificador inicial suele ser '%', que define el documento completo como ámbito de aplicación, pero puede ser también un rango de líneas dentro del texto, por ejemplo '5,$', que aplicaría el remplazo desde la quinta línea hasta la última línea del documento. Por ejemplo:

:% s/HAL/Vim/g

remplaza todas las ocurrencias de la palabra "HAL" en el documento por la palabra "Vim".

Por su parte,

:5,$ s/HAL/Vim/g

realiza el mismo remplazo pero sólo a partir de la quinta línea, inclusive.

Mientras que

:5,6 s/HAL/Vim/g

únicamente opera sobre las líneas quinta y sexta.

Aunque el conjunto de remplazos efectuados por las órdenes anteriores se puede deshacer con un simple 'u', es común, cuando se quiere obrar con cautela, pedir a Vim que solicite nuestra aprobación para cada remplazo. Para ello se añade el especificador 'c' de confirm al final de la orden. Así, por ejemplo:

:% s/HAL/Vim/gc

solicita nuestra aprobación de remplazo para cada caso encontrado, que aparecerá resaltado. La confirmación se realiza tecleando y (Yes) y la denegación de aprobación tecleando n.

Hemos llegado al final de esta revisión elemental de las operaciones básicas de edición tal como aparecen en el menú "Edición" de cualquier procesador de textos. Son cuatro cosas nuevas que aprender y mucho horas menos que perder editando nuestros escritos.


Resumen:

  • Las órdenes de Vim para deshacer, restaurar y repetir son, respectivamente 'u' (undo), 'Ctrl+R' (redo) y el punto '.'

  • La orden de Vim para cortar un carácter es 'x'.

  • Las órdenes de Vim para cortar y copiar cualquier objeto de texto se construyen mediante combinaciones con órdenes de movimiento y son, respectivamente, 'd' (delete) y 'y' (yank). [Ver las listas de órdenes del artículo para ejemplos concretos.]

  • La orden básica de Vim para pegar texto cortado o copiado previamente es 'p' (put).

  • El modo visual es un modo especial de Vim que permite seleccionar texto visualizando a la vez el resultado de la selección y ejecutar sobre dicha selección órdenes como cortar y pegar, entre otras.

  • La orden de Vim para buscar y remplazar es :s/patrón/remplazo/. Un remplazo global, esto es, el que afecta a todas las coincidencias en el documento tiene la forma :% s/patrón/remplazo/g o, en caso de requerir confirmación del usuario la forma :% s/patrón/remplazo/gc

  • Muchas órdenes ex de Vim permiten (o, a veces, requieren) especificar el ámbito de aplicación de la orden, esto es, el sector del documento que se verá afectado por dicha orden. Este ámbito que técnicamente se llama dirección (address) se define al principio de la orden, tras los dos puntos. Por ejemplo, para que la orden que sustituye la palabra "hola" por la palabra "adiós" s/hola/adiós/g afecte a todo el texto contenido entre las líneas 5 y 10, ambas inclusive, el prefijo de dirección 5,10 es obligatorio (:5,10 s/hola/adiós/g).

No hay comentarios:

Publicar un comentario