21 de outubro de 2008

Utilizando macros no VIM

Este post não será muita novidade pro pessoal "old school", que está bem acostumado com o VI ou o VIM. Como este não é meu caso (sim, sou da geração "click"), recentemente fui obrigado comecei a utilizar mais o VIM e descobri algumas funcionalidades realmente úteis para nós desenvolvedores, neste caso a gravação de teclas (macros), que facilita muito o processamento de textos formatados, scripts, etc.

Neste exeplo vou mostrar uma manipulação de um script SQL que faz o insert com os valores do id, nome e telefone numa tabela cliente. O irresponsável pela modelagem da tabela não respeitou as n regras formais de normalização, então o DBA resolveu remodelar a tabela, desmembrando em duas: uma para armazenar as informações do cliente e outra para armazenar seus telefones.

Desta forma, precisarei fazer a transformação do script de

insert into cliente (id, nome, telefone) values (1, 'Cliente1', 123456);
insert into cliente (id, nome, telefone) values (2, 'Cliente2', 234567);
.
.
.
insert into cliente (id, nome, telefone) values (10, 'Cliente10', 987654);

para algo parecido com

insert into cliente (id, nome) values (1, 'Cliente1');
insert into cliente_fone values (1, 123456);

insert into cliente (id, nome) values (2, 'Cliente2');
insert into cliente_fone values (2, 234567);
.
.
.

insert into cliente (id, nome) values (10, 'Cliente10');
insert into cliente_fone values (10, 987654);

Como você deve ter percebido, para manipular este script manualmente seria necessário duplicar cada linha, alterar a linha original removendo o número do telefone e alterar a linha copiada adicionando removendo o nome do cliente e mudando o nome da tabela. Para automatizar esta tarefa no VIM ou GVIM, executarei os seguintes comandos:

qq - Inicia a gravação no registrador "q"
yy - Copia a linha atual
p - Cola a linha copiada abaixo da linha atual
k - Posiciona o cursor na linha de cima
/) - Posiciona o cursor no parêntese antes de "values"
d, - Apaga a palavra "telefone" até a vírgula
/); - Posiciona o cursor no último parêntese
d, - Apaga a última palavra até a vírgula (o número do telefone)
j - Move o cursor para a linha de baixo
0 - Posiciona o cursor no início da linha
:s/cliente/cliente_fone - Substitui "cliente" por "cliente_fone", o nome da table
/nome - Posiciona o cursor em "nome"
dW - Apaga a palavra "nome"
/( - Posiciona no próximo parêntese
W -Posiciona na próxima palavar
dW - Apaga a palavra inteira, no caso "'Cliente1',"
j - Finalmente, posiciona o cursor na próxima linha, para completar o looping

Um registrador foi gravado na letra "q". Agora basta posicionar o cursor no início do arquivo e digitar "@q" para executar a sequência gravada. Para rodar várias vezes, digite o número de loopings seguido pelo registrador, por exemplo "10@q".


Referências
http://aurelio.net/curso/material/vim-ref.html
http://www.primeirospassos.org/sessao3_4.html

Até o próximo post!

0 comentários: