Chronosbox

Automatic reindent your files with VIM

by Felipe 'chronos' Prenholato on Monday, 06 April/2009, under Planet GentooBR, Tips, VIM - Vi IMproveded

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:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
# usage: script <basedir to indent> <files to indent>
# 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 &#038;&#038;
        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 <F8> to reindent file
noremap <F8> mzgg=G`z
inoremap <F8> <ESC>mzgg=G`z<Insert>
:, ,

5 Comments for this entry

  • Sérgio Luiz Araújo Silva

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

  • Felipe 'chronos' Prenholato

    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 :)

  • Felipe 'chronos' Prenholato

    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 :)

  • Eduardo

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

  • Sérgio Luiz Araújo silva

    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!

Leave a Reply

StatPress

Visits today: 28 Visits since 6 de April de 2009: 16055 Visitors now: %visitoronline%