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 reflecte cada bloco como um parágrafo inteiro, ou seja, não preserva as duas quebras de linha dentro de cada bloco e, de acordo com :help fo-table
nenhuma das gq
opções de formato, me permite fazer o que quero. Também pensei que poderia alcançar meu objetivo se pudesse definir caracteres de nova linha como delimitadores de parágrafos, mas, de acordo com :help paragraph
eles, são codificados.
Editar: eu sei que poderia usar gq
ou gw
formatar cada linha longa, uma a uma, mas como meu arquivo é executado em alguns milhares de linhas, estou procurando uma maneira de conseguir isso automaticamente.
gq
egw
. Também estou feliz por não ter parado por aí, caso contrário não teria aprendido sobre o:g
comando. :)Respostas:
Isso aplica o
normal
comandogww
(que formata a linha atual como emgw
) em todo o buffer, sem levar em consideração os mapeamentos personalizados (para evitar problemas se, por exemplo,gw
tiver sido mapeado para outra coisa).Vejo
:help :%
:help :norm
:help gww
Essa alternativa é conforme a sugestão de Ben nos comentários e é mais direta que a solução original, que é salva abaixo, pois pode se encaixar melhor em outras circunstâncias semelhantes devido à capacidade de correspondência de expressões regulares. No caso "combinar todas as linhas", porém, é desnecessariamente bruto.
Aplicando
gww
em cada linha individual no buffer programaticamente:Veja
:help :g
e:help norm
.^
coincide com o início de uma linha, o que, na prática, faz essa correspondência com todas as linhas.Pode-se também optar por selecionar apenas linhas maiores que, por exemplo, 60 caracteres com
(veja
:help \%<
), mas, na práticagww
, reformatará apenas as linhas por mais tempo do quetextwidth
qualquer outra forma; portanto, isso pode não importar muito em velocidade ou resultado.(Estou usando
v
a "coluna virtual" em vez dec
a "coluna", pois a última calcula realmente 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, poisgww
isso não reformatará as linhas mais curtas do que nuncatextwidth
.)fonte
:g
falha sem um padrão, então:g//norm gww
não funciona, mas:g/.*/norm gww
funciona.:g//
reutiliza o último padrão de pesquisa; se não houver, falhará. Use:g/^/
para aplicar a todas as linhas.:help last-pattern
pesquisa normal também se aplicam ao:global
comando.Desde que você já leu o manual para os
gq
egw
comandos, eu acho que você provavelmente vai querer algo mais conveniente do que mudar manualmente para as longas filas e, em seguida, usandogw0
,gw$
ou de outrogw
comando para formatar apenas a linha atual.Não conheço uma maneira fácil de quebrar linhas longas no Vim em um bloco de texto. No entanto, desde que você mencionou que está usando o Vim em um sistema GNU / Linux, sugiro filtrar seu texto através do
fmt
comando GNU .Para o arquivo inteiro:
Para o parágrafo atual (usando opções curtas):
As explicações das
fmt
opções relevantes são:-w, --width=WIDTH
- largura máxima da linha (padrão de 75 colunas). A opção-WIDTH
é uma forma abreviada de--width=DIGITS
(se estiver usando esta versão abreviada, deve ser a primeira opção).-s, --split-only
- dividir palangres, mas não reabastecer; esta é a opção que preserva as quebras de linha rígida pré-existentes.fonte
fmt
. Eu preferi aceitar a outra resposta, no entanto, porque ela requer apenas o vim.A partir de:
Colocando o marcador na linha "lorem ipsum" e pressionando os
gww
rendimentos (comtextwidth=40
clareza):o que para mim parece o que você está pedindo. Caso contrário, fique à vontade para esclarecer.
fonte