Grabar macros en vim significa ahorrarnos tener que teclear acciones repetitivas. Por ejemplo (caso ficticio) estamos en C++, tenemos que coger todos los métodos de un objeto y escribir una secuencia de acciones en otro fichero usando ese nombre de método. Más concretamente, estaba yo escribiendo unos bindings de C->lua cuando decidí que esto de las macros había que grabarlo, no os centréis en el código, lo interesante es cómo funcionan las macros en vim:

Get the Flash Player to see this player.


Si no ves bien el vídeo, puedes bajarlo de aquí.

El truco:
Editamos el fichero «test.cpp», vamos a escribir los wrappers de «osg/Node»… tenemos algo así:

#include <osg/Node>

Movemos el cursor sobre la cabecera y tecleamos control-w f (control == tecla de control, «w» y «f» en minúsculas) con esto vim nos va a dividir la pantalla en dos, como se muestra en el screencast y en la parte de arriba abrirá el fichero «osg/Node». Cómo no tiene extensión pero yo se que es c++, escribiendo :set syntax=c nos pone el resaltado de sintaxis.

Ya estamos listos, ahora lo que queremos es escribir por cada una de los métodos de la clase osg::Node algo como esto.

.set("nombre-de-metodo", &Node::nombre-de-metodo);

¿cómo lo hacemos? a) forma pesada y aburrida, a manilla. b) forma más entretenida, con macros.
Para hacerlo con macros, seguimos estos pasos (para este ejemplo):

  • Como el cursor aun está en la cabecera (arriba) lo situamos en el primer método y con control-w w nos volvemos a cpp donde quiero escribir código. También sitúo el cursor en este buffer.
  • q q   Sí, dos «q», la primera es para decir «voy a grabar una macro» la segunda es para decir «la macro se llama q» si sólo vas a trabajar con una macro esporádicamente es muy práctico escribir «qq» y empezar a grabar. Vim se pone en modo grabando
  • control-w w   nos vamos al buffer de la cabecera (arriba)
  • ^ f ( b y t (   Divertido eh? veamos con detalle qué está pasando aquí:
    • ^   Mueve el cursor al principio de la linea
    • f (   busca el primer «(«, lo que nos lleva justo al final del nombre del método
    • b   Desplaza el cursor hacia atrás una palabra, justo al principio del nombre del método
    • y t (   «copia(y) hasta(t) (»
    • ahora ya tenemos copiado el nombre del método
  • control-w w   nos vamos al buffer de codigo (abajo)
  • o .set(«Esc p i «, &Node::Esc p i ) Esc
  •   esto es literalmente lo teclado, o inserta una linea y se pone en modo inserción, Esc vuelve al modo comando, p pega lo copiado, i se pone en modo inserción.

  • control-w w   nos vamos al buffer de cabecera (arriba)
  • 2j q   Desplazamos 2 lineas hacia abajo y con q paramos de grabar.

Una vez tenemos grabada la macro la reproducimos con @q la @ es para reproducir la macro y «q» es el nombre de nuestra macro. Ya se que bien mirado, parece rebuscado, pero al vídeo me remito es más cómodo y rápido de lo que parece cuando uno se acostumbra a usarlo.