como dizer ao VIM para formatar colchetes de funções, condicionais e loops em uma nova linha?

como dizer ao VIM para formatar colchetes de funções, condicionais e loops em uma nova linha?

Existe uma maneira de dizer ao vim para formatar colchetes em uma nova linha?

Por exemplo:

public class Foo {
    private Foo(int a) {
        if (a > 30) {
            // do stuff
        }
        for (int i = 0; i < a; i++) {
            // more stuff
        }
    }
}

Deve se tornar:

public class Foo
{
    private Foo(int a)
    {
        if (a > 30)
        {
            // do stuff
        }
        for (int i = 0; i < a; i++)
        {
            // more stuff
        }
    }
}

Porque isso? Porque pressionando zcVIM dobra os blocos de código muito bem se eles forem formatados como o segundo exemplo. Nesse caso, o VIM irá dobrar apenas o conteúdo entre colchetes. Se o código for formatado como no primeiro exemplo, o VIM dobrará não apenas o conteúdo entre colchetes, mas também dobrará if (...), for (....), function f(), class Foo()e assim por diante. Então, eu gostaria de saber se existe uma maneira de dizer ao VIM para formatar o arquivo como no segundo exemplo.

Outra alternativa seria dizer ao VIM para não dobrar o conteúdo antes dos colchetes.

Responder1

Sim, você pode fazer isso facilmente: para substituir os caracteres '{' existentes no final das linhas ( $) por um retorno de carro ( \r) e um novo '{', e então formatar bem as coisas, você pode executar os dois comandos a seguir (embora veja a edição no final da resposta para um caso extremo):

:%s/{$/\r{

:%norm ==

O primeiro comando chegará a isto:

public class Foo 
{
    private Foo(int a) 
{
        if (a > 30) 
{
            // do stuff
        }
        for (int i = 0; i < a; i++) 
{
            // more stuff
        }
    }
}

O segundo comando chegará a isto:

public class Foo 
{
    private Foo(int a) 
    {
        if (a > 30) 
        {
            // do stuff
        }
        for (int i = 0; i < a; i++) 
        {
            // more stuff
        }
    }
}

(O %sinal nos comandos acima significa aplicar a todas as linhas do arquivo. Em vez disso, você pode fornecer um intervalo como :5,10s/{$/\r{, ou usar números de linha relativos, como -2,+3s/{$/\r{, ou selecionar as linhas no modo visual e clicar : e o comando de substituição será aplicado a esses linhas).

(Você também pode aplicar a formatação para =apformatar a pum arágrafo, veja :help =para detalhes)

Editar

Do comentário de @blackyellow: É uma boa solução, mas um problema é que também substitui as linhas por '}' que já estão formatadas corretamente. Um padrão melhor é :%s/[^( |\t)]}$/\r{, que não substituirá as linhas por '}' no final se o '}' for precedido por dois espaços ou uma tabulação, o que indica que provavelmente está recuado corretamente.

informação relacionada