Indentando seus arquivos automaticamente e em massa com o VIM.

8 Sep

Hey people

After a long time without post on blog, but always colecting ideas, the tip of today touch in a delicated area, code indent. Around all word we found ugly and mall indented codes (except in python :]), and, when working with PHP, this is a case extremely normal and really sucks.

So, one day, I start to search for a batch mode for vim, because for me, reident of PHP files with vim is awesome!. My idea is a single script that launchy vim in batch mode for each file, reindent and save.

Very well, after about 30 minutes of talk in #vim da irc.freenode.net, some people talk about ‘-c’ option, that, for some reason, I not see on vim man pages :. Now let’s tip!

Basically we use -c option (today I know that we can use +<cmd here> too, that is same as :<cmd here>) and I put it in a single script:

#!/bin/bash
# usage: script  
# ex: script /www/project ".html$|.php$|.inc$|.tpl$"
find $1 -type f | egrep "$2" > file_list
for file in $( < file_list );
do
    echo "$(date +'%d/%m/%Y %H:%M:%S') - start indent of $file'" >> log_indentacao
    vim -c ":normal gg=G" -c :w! -c :q! ---- $file &&
        echo "$(date +'%d/%m/%Y %H:%M:%S') - end indent of '$file'" >> log_indentacao ||
        echo "$(date +'%d/%m/%Y %H:%M:%S') - fail on indent of '$file'" >> log_indentacao
done

Explaining:

  • Line 4: find for files to indent.
  • Line 7 to 10: execute vim to indent inside a for … in loop with some info for you.

This tip is very useful but not works 100% for misc files (PHP+HTML as example). Using vim in this way you can work to convert files from dos to unix, etc, and a lot of posibilities.

About vim mapping, to indent opened files, you can use follow mappings in your .vimrc:

" map  to reindent file
noremap  mzgg=G`z
inoremap  mzgg=G`z
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 January 6, 2009 at %I:%M %p #

    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 January 5, 2009 at %I:%M %p #

    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 March 22, 2008 at %I:%M %p #

    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 March 22, 2008 at %I:%M %p #

    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 March 21, 2008 at %I:%M %p #

    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