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 ...

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

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


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

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>


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

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

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.


-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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.