Unir linhas dentro de parágrafos no vim

13

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

Os parágrafos são demarcados no seu documento por linhas em branco.

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

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

Eu fiz esse hack rápido e idiota, 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
dggoldst
fonte
Ei, não bata se sua solução funcionar, e sua solução funcionar.
Pdwalker 19/07/19

Respostas:

12

Eu acho que isso faz o que você deseja: verifique se há uma linha vazia no final do arquivo e, em seguida, junte todos os parágrafos (terminados por uma linha vazia).

G:a

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

Explicação: primeiro vá para o final do arquivo e acrescente uma linha vazia em branco :a(talvez haja uma maneira mais elegante de fazer isso; interativamente, você pode substituir as três primeiras linhas por o<ESC>). Em seguida, para cada linha que não estiver em branco que ainda não foi considerada ( :g/^./), aplique o joincomando ao intervalo que começa na linha selecionada ( .) e termina uma linha antes da próxima linha vazia ( /^$/-1).

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

Gilles 'SO- parar de ser mau'
fonte
Obrigado. Isso está ficando muito próximo para mim, no entanto, está excluindo as linhas em branco entre parágrafos. (Eu tentei fileformat unix e dos para ver se era uma coisa do Windows). Além disso, você poderia traduzir um pouco os comandos? G vai para a última linha. : a de acordo com a ajuda é "acrescentar", mas não tenho certeza do que isso faz. Também o g / pattern / cmd que você tem lá me perdeu. Qual é o comando?
dggoldst
@dggoldst: mudei o comando para manter as linhas vazias. As três primeiras linhas são apenas para adicionar uma linha vazia no final do arquivo (caso contrário, o último parágrafo não será correspondido). O último comando é :g, que aplica um comando a todas as linhas correspondentes; veja :help :ge talvez este tópico sobre como :gse comporta ao excluir quebras de linha .
Gilles 'SO- stop be evil'
:$pu _ no final, coloque o registro do buraco negro, o que resulta em uma linha em branco no final.
SergioAraujo 14/09
12

Isso deve servir:

:set tw=99999
gggqG

twé definido como um valor pelo menos tão grande quanto o número de caracteres no parágrafo mais longo. ggmove o cursor para a primeira linha; gqé o comando para reformatar; Gmove o cursor para a última linha, dizendo gqpara reformatar do local atual do cursor para a última linha.

garyjohn
fonte
5
  1. Coloque o cursor dentro do parágrafo desejado

  2. Tipo: vipJ

( vipdestaca o parágrafo atual, Jjunta todas as linhas)

Juan
fonte
2

Pode não ser a maneira mais limpa de fazer isso, mas eis 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 exatamente de como os parágrafos foram divididos quando foram originalmente formatados, convém substituir o gJcomando (junção sem espaços) pelo Jcomando (junção com espaços).

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

:%s/^$//gn     # returns "999 matches on 999 lines"
goldPseudo
fonte
Isso funciona para mim. Seria bom adicionar um "gg" no início para colocar o cursor na parte superior do arquivo. Além disso, o uso de J em vez de gJ não faz com que palavras separadas se misturem em uma. Esse pode ser o caso apenas dos meus valores de "formações", que atualmente estão me intrigando.
dggoldst