Como quebrar linhas longas no vim?

11

Eu tenho um arquivo de texto bastante grande formado por blocos como

Short line.
Really long line.
Short line.

separados por linhas vazias, e eu gostaria de usar o vim (no Linux) para quebrar as linhas longas e obter blocos como

Short line.
This was
part of
a long line.
Short line.

Meu problema com gq (e gw ) é que ele reflui cada bloco como um parágrafo inteiro, ou seja, não preserva as duas quebras de linha em cada bloco e de acordo com :help fo-table nenhum de% co_de as opções de formato do% permitiriam que eu fizesse o que eu quisesse. Também achei que poderia atingir meu objetivo se eu pudesse definir caracteres de nova linha como delimitadores de parágrafo, mas de acordo com gq esses são codificados.

Editar: sei que posso usar :help paragraph ou gq para formatar cada linha longa, uma a uma, mas como meu arquivo é executado em alguns milhares de linhas, estou procurando uma maneira para conseguir isso automaticamente.

    
por A.P. 30.03.2015 / 15:08

3 respostas

14
:%norm! gww

Isso aplica o normal command gww (que formata a linha atual como gw ) em todo o buffer, sem considerar mapeamentos personalizados (para evitar problemas se, por exemplo, gw tiver sido mapeado para algo mais).

Veja

  • :help :%
  • :help :norm
  • :help gww

Essa alternativa é conforme a sugestão de Ben nos comentários e é mais direta do que a solução original, que é salva a seguir, pois pode se ajustar melhor em outras circunstâncias semelhantes, devido à capacidade de correspondência de expressão regular. No caso "combinar todas as linhas", é desnecessariamente bruto.

Aplicando gww em cada linha individual no buffer programaticamente:

:g/^/norm gww

Veja :help :g e :help norm . ^ corresponde ao início de uma linha, o que, na prática, faz com que essa linha seja igual a todas .

Também é possível optar por selecionar apenas linhas maiores que, por exemplo, 60 caracteres com

:g/\%>60v/norm gww

(veja :help \%< ), mas na prática, gww só irá reformatar linhas maiores que textwidth , então pode não importar muito em nenhuma velocidade nem resultado.

(Estou usando v para "coluna virtual" em vez de c para "coluna", pois o último realmente calcula um certo número de bytes na linha. Isso pode levar a resultados inesperados ao usar codificações multibyte, o que geralmente é um motivo para ser cauteloso. Na prática, não é um problema real pelo mesmo motivo acima, considerando que gww não irá reformatar linhas menores que textwidth de qualquer maneira.)

    
por 30.03.2015 / 18:06
4

Como você já leu o manual dos comandos gq e gw , imagino que você queira algo mais conveniente do que mover manualmente para as linhas longas e usar gw0 , gw$ ou outro% Comandogw para formatar apenas a linha atual.

Eu não conheço uma maneira fácil de quebrar linhas longas no Vim em um bloco de texto. No entanto, como você mencionou que está usando o Vim em um sistema GNU / Linux, sugiro filtrar seu texto por meio do comando GNU fmt .

Para o arquivo inteiro:

:%!fmt --width=75 --split-only

Para o parágrafo atual (usando opções curtas):

:'{,'}!fmt -75 -s

Explicação das opções relevantes de fmt :

  • -w, --width=WIDTH - largura máxima da linha (padrão de 75 colunas). A opção -WIDTH é uma forma abreviada de --width=DIGITS (se usar esta versão abreviada, esta deve ser a primeira opção).

  • -s, --split-only - divide linhas longas, mas não reabastece; essa é a opção que preserva suas quebras de linha rígidas pré-existentes.

por 30.03.2015 / 17:43
1

De:

Short line.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Short line.

Colocando o marcador na linha "lorem ipsum" e pressionando gww yields (com textwidth=40 para clareza):

Short line.
Lorem ipsum dolor sit amet, consectetur
adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat.
Short line.

que para mim parece o que você está pedindo. Caso contrário, sinta-se à vontade para esclarecer.

    
por 30.03.2015 / 17:20