Como posso quebrar o texto em algum comprimento no Vim?

102

Vamos falar de medidas relativas. Meu Vim se parece com:

aaaaaaaaaaaaa 
bbbbbbbbbbbbb 
ccccccccccccc 
etc

Eu gostaria que fosse menor:

aaaaa
aaaaa
bbbbb
bbbbb
ccccc
ccccc
etc

Como posso conseguir? E como posso definir o comprimento de tal bloco?

Léo Léopold Hertz 준영
fonte
Você quer dizer quebrar o texto e não recuar o texto?
lc.
lc: Não sei a diferença. Eu ia escrever o wrap como me foi recomendado, mas nunca consegui fazer funcionar.
Léo Léopold Hertz 준영

Respostas:

177

Na verdade, você pode fazer duas coisas:

  1. Deixe o vim formatar (iechange) seu texto para linhas mais curtas, inserindo quebras de linha
  2. Deixe as linhas como estão, mas exiba -as quebradas

Qual você quer?

A opção 1 seria alcançada definindo textwidth(por exemplo :set textwidth=30(da resposta de Swaarop)). Em seguida, você pode reformatar seu texto destacando-o (no modo visual) e digitando gq. ( textwidthpode ser abreviado como tw, portanto :set tw=30.)

A opção 2 pode ser alternada executando :set wrap/ :set nowrap. Isso quebrará as linhas que são muito longas para a janela.

Ambos são independentes.

Sleske
fonte
33
+1 para o comando de tecla gq do modo visual, isso é incrivelmente útil
Fire Crow
3
Para sua informação, isso quebra em espaços e gqgq não faz nada em uma linha como mostrado na pergunta, mesmo se tw = 5.
dlamblin
2
@Dlamblin: Correto. Se você deseja dobrar exatamente na largura dada, sem respeitar os espaços em branco, use o foldcomando como na resposta de fgm.
sleske
Sua opção não funciona, tanto quanto eu vejo. wrapirá quebrar no limite da janela, não em textwidth.
DerWeh
@DerWeh: Sim, a quebra irá envolver no limite da janela. Eu editei para esclarecer.
sleske
60

Depois de definir a 'largura do texto', você pode selecionar o texto com modo visual e pressionar gq para envolvê-lo bem (você também pode usar Q em algumas configurações mais antigas / legadas).

Algumas dicas úteis:

gqq (wrap the current line)
gq} (wrap this 'paragraph', i.e. until the next blank line)
:h gq
Vlad Dogaru
fonte
3
+1, acidentalmente acertei gq enquanto estava no vim, passei a última meia hora tentando ver o que acertei. Isso é muito útil.
user176121
gqqtambém envolve a linha atual (em vez de gqgqou gq$).
Ash
21

Usar o fold (1) é uma possibilidade:

:%!fold -w5 

Resultado:

aaaaa
aaaaa
aaa 
bbbbb
bbbbb
bbb 
ccccc
ccccc
ccc
Fritz G. Mehner
fonte
1
Isso também não respeita os espaços para dobrar
Lionel
7
@Lionel: Sim. Para respeitar os espaços, adicione a opção "-s" ao comando de dobra.
sleske
14
:set textwidth=30
Swaroop CH
fonte
Como a largura do texto lida com isso quando não há espaços, como no exemplo do pôster original? Eu joguei e ele só parece formatar com base na largura do texto se houver espaços (ou, presumivelmente, se a variável breakat estiver definida para outra coisa).
Andy
3
@Andy textwidthnão vai lidar com uma situação sem espaços. Você pode escrever sua própria formatexprfunção para fazer isso.
Swaroop CH
8

Se você tiver texto sem espaços que deseja quebrar em um determinado comprimento, não é necessário usar externo foldnem escrever seu próprio formatexpr.

:%s/\(.\{80\}\)/\1\r/g

quebrará todas as linhas em 80 caracteres.

kthy
fonte
2
Isso salvou meu dia enquanto ressuscitava um certificado OpenSSL. Obrigado
Cengiz Can