Una linhas dentro de parágrafos no vim

11

Suponha que você tenha digitado um documento longo no vim com quebra automática de linha, então todas as linhas foram quebradas em, digamos, 79 caracteres. Você pode até ter aplicado a formatação em todo o documento para quebrar todas as linhas nesse comprimento.

Parágrafos são demarcados em seu documento por linhas em branco.

Agora você decide que não deseja quebras de linha nos parágrafos.

Como você pode remover todas as quebras de linha nos parágrafos sem eliminar os limites de parágrafo?

Eu fiz este rápido e idiota hack, mas estou procurando o caminho certo.

:%s/^\s*$/@@@@@ - replace blank lines with @@@@@
ggVGgJ           - join all lines in the file
:%s/@@@@@/\r\r/g   - replace @@@@@ with line breaks
    
por dggoldst 17.10.2010 / 19:36

4 respostas

11

Acho que isso é o que você quer: verifique se há uma linha vazia no final do arquivo e junte todos os parágrafos (terminados por uma linha vazia).

G:a

.
:g/^./ .,/^$/-1 join

Explicação: primeiro, vá até o final do arquivo e anexe uma linha extra vazia com :a (talvez haja uma maneira mais elegante de fazer isso; interativamente, você pode substituir as três primeiras linhas por o<ESC> ). Então, para cada linha não vazia que ainda não foi considerada ( :g/^./ ), aplique o comando join ao intervalo começando na linha selecionada ( . ) e terminando uma linha antes da próxima linha vazia ( /^$/-1 ).

Opcionalmente, :g/^$/d se você não quiser que nenhuma linha em branco permaneça (então você pode retirar o -1 ).

    
por 17.10.2010 / 22:14
10

Isso deve ser feito:

:set tw=99999
gggqG

tw é definido com algum valor pelo menos tão grande quanto o número de caracteres no parágrafo mais longo. gg move o cursor para a primeira linha; gq é o comando para reformatar; G move o cursor para a última linha, informando gq para reformatar da posição atual do cursor para a última linha.

    
por 18.10.2010 / 16:26
3

1) Coloque o cursor dentro do parágrafo desejado

2) Tipo: "vipJ"

("vip" destaca o parágrafo atual, "J" une todas as linhas)

    
por 17.02.2016 / 21:01
2

Pode não ser a maneira mais clara de fazer isso, mas aqui está o que eu usaria:

ggqav}bgJ}wq999@a   # go to the top of the file (gg)
                    # start recording macro "a" (qa)
                    # select the entire paragraph (v})
                    # go back one word so as not to join the blank line (b)
                    # join the selected lines without spaces (gJ)
                    # go to first word of the next paragraph (}w)
                    # finish recording the macro (q)
                    # 999 times (arbitrary number of paragraphs to join)
                    # run macro "a" (@a)

( Funciona no VIM 7.2. )

Dependendo de como os parágrafos foram divididos quando foram formatados, você pode querer substituir o comando gJ (junção sem espaços) pelo comando J (junte-se a espaços).

A contagem arbitrária de 999 precisa ser pelo menos o número de parágrafos no arquivo - você pode selecionar um número maior se desejar e não perder nada além de ciclos de processador. Assumindo uma e apenas uma linha em branco entre os parágrafos, você pode obter uma contagem de parágrafos mais precisa usando:

:%s/^$//gn     # returns "999 matches on 999 lines"
    
por 17.10.2010 / 22:34