No VIM, como faço para dividir uma linha muito longa em várias linhas?

170

Digamos que eu tenha uma linha super longa no editor do VIM (digamos, mais de 300 caracteres). Como eu dividiria isso em várias linhas para que os limites das palavras se dividissem em 80 caracteres?

Exemplo:

This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line

para

This is a really long line 
This is a really long line
This is a really long line
This is a really long line
This is a really long line
This is a ...
Jordan Parmer
fonte

Respostas:

254

O Vim faz isso com muita facilidade (quebra de linhas nos limites das palavras).

gq{motion} % format the line that {motion} moves over
{Visual}gq % format the visually selected area
gqq        % format the current line
...

Eu sugiro que você verifique :help gqe :help gw.

A configuração da largura de texto ( tw) fornecerá a quebra automática de linha quando excedida durante a digitação. Também é usado gq, embora se desativado gqquebre o tamanho da janela ou 79, dependendo do que ocorrer primeiro.

:set tw=80

Ao definir as opções de formato para incluir a largura do texto, o vim será interrompido automaticamente na configuração tw.

:set fo+=t
he_the_great
fonte
5
Assim, para o seu caso, o gqcomando seria <ESC>(sair Inserir / Substituir / mode etc), entãogq80l
MidnightLightning
6
É o oposto de Ctrl + j (combina várias linhas em uma).
Yzmir Ramirez 31/03/11
9
Vim nunca deixa de me surpreender. Isto é ouro puro.
Jondlm
10
apenas para a próxima pessoa que acha isso, GQ única não vai dividir uma linha de texto sólida, ele precisa de espaço em branco para fazer a sua coisa
stringy05
2
[corre gqq] aaaahhh, é lindo
underscore_d
85

Primeiro, configure seu vim para que ele compreenda 80 caracteres:

:set tw=80

então, hilight a linha:

V

e faça com que o vim reformate:

gq

fonte
17

Isso não está realmente relacionado ao VIM, mas você pode usar o programa fmt como em

$ fmt myfile
Wernsey
fonte
38
:%! fmt% "Pode torná-lo relacionado ao vim :)"
Maxim Sloyko 13/08/09
2
Útil para vi, embora eu prefira gqq no vim.
precisa saber é o seguinte
13

Para linhas de texto sólidas, realce a área usando v no modo normal e pressione

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

Isso adicionará uma nova linha no final de cada oitavo caractere.

:s/       replaces within the current select
\v        uses regular expressions
(.{80})   selects 80 characters & placed them into group one
\1\r      replaces group one with group one and a newline
fumado
fonte
Esta é a única solução que funcionou para uma longa cadeia base64.
jviotti
6

Se você estiver no * nix, provavelmente terá folddisponível.

Selecione a região que você deseja usar v, para poder dividir os espaços na largura 80 usando:

!fold --spaces --width=80

É basicamente o mesmo que usar gq.

No entanto, se você quiser apenas quebrar o caractere 80 e não se restringir aos espaços em branco, poderá usar:

!fold --width=80

Se você quiser com apenas um toque de tecla, defina um mapeamento - usei

vmap <f1> !fold --width=80<CR>

Michael Anderson
fonte
Essa é a resposta que funciona para cadeias longas não separadas por espaços em branco. No macOS, você pode precisar usar gfold em vez de fold.
Aaron D
no Mac OS, eu tinha que fazer dobrar -w 80!
user674669
5

Para dividir linhas longas no documento completo sem remover quebras de linha já presentes, use:

:set formatoptions+=w
:set tw=80
gggqG
Olivier Faucheux
fonte
4

Eu precisava reformatar um arquivo inteiro em vez de uma linha. Como Wernsey aponta, eu poderia ter usado 'fmt', mas a seguinte sequência no vim também fez o truque (tomando emprestado as várias respostas aqui):

<ESC>
:setl tw=80 fo=t
1GVGgq
John Rix
fonte
3

Como rápido e desagradável, talvez tente o seguinte mapa:

map q 080lwbels<CR><ESC>

que diz:

  • inicie a 0ª posição da linha,
  • mova para o 80º caractere para a direita,
  • vá para o início da próxima palavra,
  • volte para a palavra anterior,
  • vá para o final da palavra atual,
  • vai um char certo, e
  • substitua um CR por esse caractere.

Ao pressionar q e CR, a linha será dividida em pedaços no limite da palavra.

Rob Wells
fonte
-1

Inseri manualmente '\' (e depois CR / tab para formatar) em cada LONGLINE após o último espaço em branco, mas antes da coluna 80. Ou seja:

1 this is a long, long, line

agora parece

1 this is a long, \
        long line

e compila normalmente.

808
fonte