Indentando seus arquivos automaticamente e em massa com o VIM.

8 Set

Heya pessoal.

Depois de longo tempo sem postar, mas sempre coletando idéias, a dica de hoje abrange uma área delicada, indentação de código. Por todo o mundo existem códigos mal indentados (exceto em python :]), e no meu trabalho, este é um caso extremamente comum com as ferramentas que dou manutenção, e literalmente é um pé no saco. No dia 06 de Setembro deste mês, de tão saco cheio que estava dos códigos mal indentados e sempre usando uma mapping (1) do VIM para indentar uma página, com o problema sério que quando ia dar um svn diff ou coisa do genêro quase toda a página vinha no diff, senão toda ela, resolvi verificar se o VIM não tinha um “BATCH mode”, assim com o top, para usar em um loop para passar nos arquivos.

Pois bem, depois de uma meia hora batendo papo no #vim da irc.freenode.net, o pessoal me fala de uma opção ‘-c’ do VIM, que eu jurava não ter visto no manual do VIM. É dai que surge a dica de hoje :).

Para indentar os arquivos, podes usar os seguintes comandos (segue abaixo a explicação dos comandos para ninguém ficar boiando):

cd diretorio/com/arquivos/a/serem/indentados
find -type f | egrep ".html$|.php$|.inc$|.tpl$" > lista_arquivos
for arquivo in $( < lista_arquivos );
do
    echo "$(date +'%d/%m/%Y %H:%M:%S') - iniciando indentação  de '$arquivo'" >> log_indentacao
    vim -c ":normal gg=G" -c :w! -c :q! ---- $arquivo &&
        echo "$(date +'%d/%m/%Y %H:%M:%S') - finalizando indentação  de '$arquivo'" >> log_indentacao ||
        echo "$(date +'%d/%m/%Y %H:%M:%S') - falhou indentação  de '$arquivo'" >> log_indentacao
done

Explicando as linhas:

  • Linha 2: Procurando por arquivos a serem indentados, este comando
    pega todos os arquivos .html, .php, .inc e .tpl do diretório e
    subdiretórios. Se houver problemas com espaços, você pode usar da
    seguinte forma:

    find -type f -name '*.php' -or -name '*.html' -or -name '*.inc' -or -name '*.tpl' -exec vim -c ':normal gg=G' -c :w! -c :q! -- "{}" ;

    Com isto, ele irá fazer a mesma coisa que o for faz.

  • Linhas 3 e 4: Inicia o for. $(<lista_arquivos) faz o bash fazer um ‘eval’ do arquivo lista_arquivos, mandando seu conteúdo como paramêtros para o for.
  • Linhas 5, 7 e 8: Logando para melhor acompanhamento.
  • Linha 6: O comando propriamente dito, a opção -c envia comandos ao VIM. Uma explicação melhor sobre o comando de indentação pode ser achada digitando ‘:help =’ no próprio VIM, existem dezenas de configurações que podem ser setadas e existem também dezenas de arquivos de identação prontos, da uma olhadinha em /usr/share/vim/vim71/indent :].
  • Linha 9: Finaliza o for.

Com esta dica, se salve dos arquivos não indentados! Os comandos passados ao vim também pode ser para tirar quebras de linha DOS, outra dor de cabeça absurda que costumo ter, e qualquer outra coisa do VIM.

(1) Sobre o mapping do vim, para indentar seus arquivos abertos, podes usar os seguintes comandos no seu .vimrc:

" map  to reindent file
noremap  mzgg=G`z
inoremap  mzgg=G`z

Apertar a tecla = com um bloco de texto selecionado também faz o mesmo trabalho 🙂

Realmente espero que aproveitem!

Abraços!

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)

5 Responses to “Indentando seus arquivos automaticamente e em massa com o VIM.”

  1. Sérgio Luiz Araújo silva janeiro 6, 2009 at %H:%M 11Tue, 06 Jan 2009 11:32:44 +000044. #

    Iniciei um projeto para a criação de um livro sobre o vim em português:
    No meu blog há uma postagem sobre e um previw em um frame do site scribd:http://vivaotux.blogspot.com/2009/01/nosso-livro-sobre-o-vim.html

    Há um grupo de discussão
    http://groups.google.com/group/vimbook

    e a página oficial do projeto
    http://code.google.com/p/vimbook/

    A idéia é que as pessoas que dominam melhor o vim e o Latex adicionem suas melhores idéias a este projeto!

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
  2. Eduardo janeiro 5, 2009 at %H:%M 07Mon, 05 Jan 2009 07:49:58 +000058. #

    Muito bom … aproveitei bem, só mudei a expressão regular para arquivos em C++ 😀
    Quem sabe isso vira um shell script né 😛

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
  3. Felipe 'chronos' Prenholato março 22, 2008 at %H:%M 12Sat, 22 Mar 2008 00:45:32 +000032. #

    Opa Sérgio, pesquisei sobre isto com o pessoal do #vim.

    A idéia do bufdo é legal, dependendo do número de arquivos que você teria.

    A questão em você abrir de um em um é que você poupa memória, com você abrindo vários arquivos você iria lotar a memória. Digamos que temos 10k arquivos em um site, abrindo todos ao mesmo tempo e com cada um aberto na memória, poderia ser um problema sério, principalmente se feito em servidores.

    Outra coisa, testei aqui nos meus arquivos *.php dentro do /var/www, são pouco mais de 75k, mandei os nomes para uma lista e fiz isto:

    cat lista | xargs vim

    na primeira ele abriu ~2300, qdo fechei, abriu mais ~1800, e foi variando por ai o número de arquivos.

    Acredito que colocando vim -c bufdo blabla em vez de somente vim poderia agilizar o processo, mas ainda assim é mais sensível a falhas. Imagine se da problema em um dos processos ‘vim’ abertos, vc perde a identação de centenas de arquivos.

    Sérgio, obrigado pela participação 🙂

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
  4. Felipe 'chronos' Prenholato março 22, 2008 at %H:%M 12Sat, 22 Mar 2008 00:45:32 +000032. #

    Opa Sérgio, pesquisei sobre isto com o pessoal do #vim.

    A idéia do bufdo é legal, dependendo do número de arquivos que você teria.

    A questão em você abrir de um em um é que você poupa memória, com você abrindo vários arquivos você iria lotar a memória. Digamos que temos 10k arquivos em um site, abrindo todos ao mesmo tempo e com cada um aberto na memória, poderia ser um problema sério, principalmente se feito em servidores.

    Outra coisa, testei aqui nos meus arquivos *.php dentro do /var/www, são pouco mais de 75k, mandei os nomes para uma lista e fiz isto:

    cat lista | xargs vim

    na primeira ele abriu ~2300, qdo fechei, abriu mais ~1800, e foi variando por ai o número de arquivos.

    Acredito que colocando vim -c bufdo blabla em vez de somente vim poderia agilizar o processo, mas ainda assim é mais sensível a falhas. Imagine se da problema em um dos processos ‘vim’ abertos, vc perde a identação de centenas de arquivos.

    Sérgio, obrigado pela participação 🙂

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
  5. Sérgio Luiz Araújo Silva março 21, 2008 at %H:%M 12Fri, 21 Mar 2008 12:55:01 +000001. #

    Usando a opção “bufdo” não resolveria também?

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)

Leave a Reply