Eu acho que o seguinte comando deve funcionar:
:%s/^\(.*\)\(\n\1\)\+$/\1/
Explicação:
Usamos o comando de substituição em todo o arquivo para mudar patternpara string:
:%s/pattern/string/
Aqui patternestá ^\(.*\)\(\n\1\)\+$e stringé \1.
pattern pode ser dividido assim:
^\(subpattern1\)\(subpattern2\)\+$
^e $correspondem, respectivamente, ao início da linha e ao final da linha.
\(e \)são usados para incluir, subpattern1para que possamos nos referir a ele mais tarde pelo número especial \1.
Eles também são usados para delimitar, subpattern2para que possamos repeti-lo 1 ou mais vezes com o quantificador \+.
subpattern1is .*
.é um metacaractere que corresponde a qualquer caractere, exceto a nova linha, e *é um quantificador que corresponde ao último caractere 0, 1 ou mais vezes.
Portanto, .*corresponde a qualquer texto que não contenha nova linha.
subpattern2é \n\1
\ncorresponde a uma nova linha e \1corresponde ao mesmo texto que foi correspondido dentro da primeira \(, \)que aqui é subpattern1.
Então, patternpode ser lida assim:
um início de linha ( ^) seguido por qualquer texto contendo nenhuma linha nova ( .*) seguido por uma nova linha ( \n), em seguida, o mesmo texto ( \1), os dois últimos sendo repetido uma ou mais vezes ( \+), e finalmente um fim de linha ( $) .
Onde quer que patternseja correspondido (um bloco de linhas idênticas), o comando de substituição o substitui pelo stringqual está aqui \1(a primeira linha do bloco).
Se você deseja ver quais blocos de linhas serão afetados sem alterar nada no seu arquivo, é possível ativar a hlsearchopção e adicionar o nsinalizador de substituição no final do comando:
:%s/^\(.*\)\(\n\1\)\+$/\1/n
Para um controle mais granular, você também pode solicitar uma confirmação antes de alterar cada bloco de linhas adicionando o csinalizador de substituição:
:%s/^\(.*\)\(\n\1\)\+$/\1/c
Para obter mais informações sobre o comando de substituição :help :s, leia ,
para os sinalizadores de substituição :help s_flags,
para os vários metacaracteres e quantificadores :help pattern-atoms,
e para expressões regulares no vim, leia isso .
Editar: o curinga corrigiu um problema no comando adicionando um $no final de pattern.
Também o BloodGain possui uma versão mais curta e legível do mesmo comando.
$disso, no entanto. Caso contrário, ele fará coisas inesperadas com uma linha que começa com texto idêntico à linha anterior, mas possui outros caracteres à direita. Observe também que o comando básico que você deu é funcionalmente equivalente à minha resposta:%!uniq, mas os sinalizadores de destaque e confirmação são bons.