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 zc
VIM 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 =ap
formatar a
p
um 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.