Como posso autoformatar / recuar o código C no vim?


250

Quando copio o código de outro arquivo, a formatação fica desarrumada, assim:

fun()
{
for(...)
{
for(...)
{
if(...)
{
}
}
}
}

Como posso formatar automaticamente esse código no vim?


3
Para quem quer formatar e não apenas recuar o código, a segunda resposta (minha) trata disso. Se você apenas deseja corrigir o recuo, a resposta aceita é a maneira mais simples.
Derek

Respostas:


566

Tente as seguintes teclas:

gg=G

Explicação: ggvai para a parte superior do arquivo, =é um comando para corrigir o recuo e Gsolicita que ele execute a operação até o final do arquivo.


28
isso apenas recua o código. algo não pode ser feito para AUTOFORMAT a coisa toda?
1.1

7
Qual é a diferença?
Ton van den Heuvel

3
@ Ton van: Veja minha resposta para a diferença (não poderia ter explicado aqui nos comentários).
Lazer 21/11

2
-1 Isso corrige apenas o recuo, não a formatação (que era o que estava sendo solicitado).
Oligofren #

3
@oligofren O exemplo do OP incluiu apenas erros de indentação e ele aceita a resposta, então acho que foi isso que ele quis dizer.
Amir Rachum

78

Eu gosto de usar o programa Artistic Style. De acordo com o site :

Artistic Style é um indentador, formatador e embelezador de código-fonte para as linguagens de programação C, C ++, C # e Java.

É executado no Windows, Linux e Mac. Ele fará coisas como recuar, substituir guias por espaços ou vice-versa, colocando espaços em torno das operações da maneira que você desejar (convertendo if(x<2)para se ( x<2 )é assim que você gosta), colocando chaves na mesma linha das definições de função ou movendo-as para o linha abaixo, etc. Todas as opções são controladas por parâmetros de linha de comando.

Para usá-lo no vim, basta definir a opção formatprg e, em seguida, use o comando gq. Então, por exemplo, eu tenho no meu .vimrc:

autocmd BufNewFile,BufRead *.cpp set formatprg=astyle\ -T4pb

para que, sempre que abrir um arquivo .cpp, o formatprg seja definido com as opções que eu desejar. Em seguida, posso digitar gg para ir para o topo do arquivo e gqGformatar o arquivo inteiro de acordo com meus padrões. Se eu precisar reformatar apenas uma única função, posso ir para o topo da função, digite gq][e ela reformatará exatamente essa função.

As opções que tenho para o estilo -T4pbsão apenas minhas preferências. Você pode consultar os documentos deles e alterar as opções para que ele formate o código da maneira que desejar.

Aqui está uma demonstração. Antes do estilo:

int main(){if(x<2){x=3;}}

float test()
{
if(x<2)
x=3;
}

Após o estilo (gggqG):

int main()
{
    if (x < 2)
    {
        x = 3;
    }
}

float test()
{
    if (x < 2)
        x = 3;
}

Espero que ajude.


3
Existe algo assim para outros formatos; ruby, xml, json, etc.?
derGral

1
@ Ryan check vim-autoformat, veja a resposta abaixo. O BTW vim-autoformat também usa o estilo entre outros.
Chiel ten Brinke

1
Obrigado! Eu estava começando a pensar que era a única pessoa na palavra que não queria seus colchetes de abertura na mesma linha da declaração de função!
user3640967

27

O comando interno para recuar corretamente o código já foi mencionado ( gg=G). Se você deseja embelezar o código, precisará usar um aplicativo externo como recuo . Como %denota o arquivo atual no modo ex, você pode usá-lo assim:

:!indent %


11

Acho que clang-formatfunciona bem.

Existem alguns exemplos de combinações de teclas na documentação do clang

Eu prefiro usar a equalprgligação no vim. Isso permite que você chame clang-formatcom G=ggou outras =opções de recuo.

Basta colocar o seguinte no seu arquivo .vimrc:

autocmd FileType c,cpp setlocal equalprg=clang-format

3
Necessidade de instalá-lo em primeiro lugar, por exemplo, para ubuntu 16.04+:sudo apt install clang-format
Eric Wang

3

Talvez você possa tentar o seguinte $ indent -kr -i8 * .c

Espero que seja útil para você!


3

Gosto como indentmencionado acima, mas na maioria das vezes quero formatar apenas uma pequena seção do arquivo em que estou trabalhando. Como indentpode pegar o código do stdin, é realmente simples:

  1. Selecione o bloco de código com o qual deseja formatar Vou algo semelhante.
  2. Formate digitando :!indent.

astyle leva stdin também, então você pode usar o mesmo truque lá.


2

Eu gostaria de acrescentar que, para evitar que seja confuso, você pode digitar :set pasteantes de colar. Após colar, você pode digitar :set nopastecoisas como js-beautify e recuo para trabalhar novamente.


1
Eu uso :set paste!para isso, que alterna o valor da pasta em vez de defini-lo. Isso facilita a desativação, pois você pode simplesmente voltar alguns comandos e pressionar enter.
são

0

A ferramenta deles é chamada indent. Você pode baixá-lo e apt-get install indent, em seguida, executar indent my_program.c.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.