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) -
\nCorresponde 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.