Editando con el vim, macros.
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
- control-w w nos vamos al buffer de cabecera (arriba)
- 2j q Desplazamos 2 lineas hacia abajo y con q paramos de grabar.
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.
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.
Mola mucho, aunque no se si me llegaré a acostumbrar a las ordenes para desplazarse sin usar los cursores (eso si, no he perdido la esperanza XD)
qué bueno 🙂