O comando vim's: g é projetado exatamente para esse tipo de tarefa; executando uma única ação em cada linha que corresponda a um padrão específico. Aqui está minha resposta:
:g/.\n\n\@!/norm o
O padrão que eu uso é /.\n\n\@!/
. Quebrando isso em suas partes componentes:
-
.
Corresponde a qualquer caractere na linha. (costumava descartar imediatamente quaisquer linhas vazias existentes de consideração) -
\n
Corresponde a um único \ n no final do caractere acima -
\n\@!
falha na correspondência se houver outra \ n imediatamente após o mais cedo \ n.
(Verifique :h E59
para obter mais informações sobre \@!
e especificadores de correspondência semelhantes em expressões regulares - há outros pares também!)
Portanto, a regex do comando g: agora selecionou todas as linhas não vazias terminadas por uma única nova linha e que não são seguidas por uma linha vazia.
Após o padrão em uma instrução :g
, o comando é executado em linhas correspondentes. Neste caso, eu disse a ele para executar um comando de modo normal (abreviado para norm
), e o comando para executar é simplesmente o
, que insere uma linha vazia abaixo da linha atual.
Então, juntos, o comando encontra todas as linhas que não têm uma linha vazia abaixo e adicionam uma. E isso é tudo que existe para isso! Você pode checar o artigo do Poder do G do vim wiki para mais coisas interessantes que você pode fazer com :g
(e é irmã negativa, :v
) - é um daqueles comandos incrivelmente úteis nos quais você logo se apóia, e depois perde terrivelmente em editores que não o possuem.