Em vim
você deve ser capaz de fazer
:%s/ / /g
:set ts=3
:set noet
:%retab!
Dependendo do recuo atual, talvez você precise fazer o acompanhamento com
:%s/\t */\t/g
Usar set list
no início do processo ajuda a tornar visível o que exatamente está acontecendo
Antes
Depois
Semlista
Para uma formatação mais elaborada baseada em sintaxe, geralmente dependo de um IDE (Eclipse etc)