Editor Vim?
Nota preliminar:
encuentran entre comitas superiores (') cuando hay texto
explicativo aledaño. No tienen nada cuando los he puesto en
lineas aparte. Obviamente las comitas no se deben tipear.
*no* la secuencia: <, E, N, T, E, R, >
Sugerencia:
consola por ejemplo) el funcionamiento de lo explicado será,
cuando menos, aburrido e inútil. (la sugerencia es que sigan
los pasos a medida que leen :)
===
Soy un poco fanático de vi/vim, sin embargo no soy lo que se
dice un gurú. Pero ayer, editando un archivo, descubrí este
tip que tal vez a más de uno le genere una sonrisa.
Me ocurre cada tanto, cuando trabajo con vim, que apreto sin
querer la letra 'q' y me aparece un cartelito en la barra de
estado que dice --recording. Cada vez que me aparecía me
decía: «esto debe ser para grabar macros, algún día veré
como es la onda». Pero no pasaba de allí la cosa.
Ayer generé un archivo con lineas parecidas a las que
muestro: (eran varias, más de las que muestro)
lynx -source http://bigempire.com/filthy=20
lynx -source http://everything2.com=20
lynx -source http://www.oldmanmurray.com=20
y deseaba llegar a algo así:
lynx -source http://bigempire.com/filthy > bigempire &
lynx -source http://everything2.com > everything2.html &
lynx -source http://www.oldmanmurray.com > oldmanmurray.html &
En cuanto hice la primera linea, me di cuenta que iba a ser
un trabajo pesado (recuerden que estoy mostrando sólo un
fragmento de la tarea, tenía varias lineas más por delante),
y no quería que fuese así, entonces recordé los de las
macros y me dije: es el momento de aprender a usarlas.
La onda es la siguiente: cuando apretamos 'q' seguido de una
letra [a-zA-Z], se guardan en el registro que indica la
letra todo lo que tipeamos. Para terminar de grabar
apretamos 'q' nuevamente. Y luego para ejecutar la macro
apretamos '@' seguido de la letra que contiene nuestra
macro.
Ejemplo:=20
'qa' para iniciar la grabación y guardarla en el registro a
alguna secuencia de ediciones con cualquier grado de
complejidad
'q' para terminar la grabación
'@a' para ejecutar la macro grabada en el registro a
Ahora veamos que tendría que hacer para componer cada linea
del texto de ejemplo del principio:
para llevar
lynx -source http://bigempire.com/filthy=20
a
lynx -source http://bigempire.com/filthy > bigempire &
debería:
– posicionarme en la 'b' de bigempire
– hacer 'yw' para copiar la palabra al bufer
– hacer 'A' para ponerme en modo inserción al final de la
linea
– tipear ' >'
– apretar <ESC> para ir a modo comando (aún no me aprendo
– hacer 'p' para copiar desde el bufer
– hacer 'A' para finalizar tipeando '&' en modo inserción
Esto explicado con palabras parece lento, pero es bastante
rápido. Sin embargo cuando se trata de hacerlo muchas veces,
dan ganas de hacerlo más rápido!
Debido a que la cadena que usaré para la redirección, que saco
del URL es distinta cada vez es que decido dejar los dos
primeros pasos fuera de la macro, ya que eso es distinto
para cada linea. Si fuese posible automatizar esto, por
ejemplo, que la palabra a usar se encontrase siempre en una
misma posición relativa, entonces haríamos que todo fuese
macro (más de esto enseguida). Pero sigamos con esto.
– me aseguro de estar en modo comando con <ESC>
– me posiciono en la palabra que quiero copiar al bufer
– hago 'yw'
– hago 'qa' aquí comienza el grabado en el registro a de
– realizo la secuencia de edición antes descripta
– finalizo con 'q'
De aquí en más, para realizar lo mismo en las restantes
lineas tan sólo debo copiar la palabra (la parte que varía
de linea a linea), pero luego tan sólo debo hacer '@a' y
vualá! se ejecuta toda la secuencia de edición solita.
«Tanto lío por un par de teclazos! Dejame con el edit de
DOS»
Imaginemos entonces una secuencia un poco más larga:
para llevar
lynx -source http://bigempire.com/filthy=20
a (está cortado pero es todo una sola linea)
lynx -source http://bigempire.com/filthy | mail -s
'HTMLSOURCE-bigempire' fcanizo@unsl.edu.ar
Ahora se pone un poquitín más interesante, verdad?
Imaginemos que la cosa es más automatizable:
Tenemos URLs con un mismo patrón, y queremos usar una parte
de él. Por ejemplo, tenemos 100 lineas de este tipo:
http://www.somewhere.org/archivo_copado.html
Y queremos generar un script que nos baje los documentos y
nos los envíe por mail (donde nuestro procmail se encargará
de ubicarlos como archivos html en el lugar apropiado para
mirarlos más tarde con un simple 'lynx localhost')
Entonces la idea es que estamos en alguna posición de la
linea, no importa cual. Primero seteo la variable textwidth=20
a cero para que no interfiera con mi edición el wrapeado
automático:
:set textwidth=0
Ya podemos comenzar con nuestra macro:
'qa' en modo comando para comenzar a grabar en el registro
a, luego la siguiente cadena de teclazos y texto:=20
$?/<ENTER>ly$A | mail -s 'HTMLSOURCE-<ESC>pA'
fcanizo@unsl.edu.ar<ESC>
(no olvidar sacar el 'Bloquear Mayúculas' al terminar de
tipear HTMLSOURCE)
(el wrap me lo dejó en dos lineas aquí en el mail, pero es
una sola)
finalmente 'q' para terminar la grabación. Y ya estamos
listos para hacer maravillas.
Como la primera linea quedó lista al grabar la macro, sólo
nos quedan 99 lineas aún por editar, no posicionamos en la
primera de ellas y hacemos:
99@a
Boom! (que me hablen de word después de esto!)
Exactamente 5 teclazos para resolver 99 lineas de edición.
Cool.
Habría que terminar la edición con algo así (para que el
script funcione!)
:%s/^/lynx -source/
Bueno, espero que les haya gustado y sobre todo que se
entienda. El mecanismo de las macros es bien fácil. Tal vez
los ejemplos no son de lo mejor, pero quería dar una idea de
como usar las macros.
A propósito, para usar el comando '@' no es necesario grabar
algo con 'q', pueden hacer lo siguiente:
Ejemplo simple pero ilustrativo: borrar las tres primeras
palabras de una linea.
Escriben en modo inserción:
03dw
Luego hacen:
«cyy
y ya tienen lo necesario grabado en el registro c, ahora
sólo tienen que ir a las lineas que quieran y hacen:
@c
Y una última cosa, a veces me falla el tema de las comillas
cuando quiero copiar algo en un registro, para evitar malas
interpretaciones, las copias las hago en modo comando con:
:ya <registro>
Eso es todo.