Comando vim para reestruturar / forçar o texto para 80 colunas


240

Eu sei que existem maneiras de definir automaticamente a largura do texto no vim usando set textwidth(como preocupações de layout de colunas do Vim 80 ). O que estou procurando é algo parecido com =(o comando indent line), mas com quebra para 80. O caso de uso é que algumas vezes você edita texto com largura de texto e após unir linhas ou excluir / adicionar texto, ele sai mal embalado.

Idealmente, esse comando reorganizaria completamente as linhas que seleciono e cortaria as linhas longas enquanto adicionava as linhas curtas. Um exemplo:

long line is long!  
short

Após executar o comando (assumindo que o envoltório tenha 13 cols):

long line is  
long! short

Se isso não for possível com um comando vim verdadeiro, talvez haja um programa de linha de comando no qual eu possa canalizar a entrada?

Depois de pesquisar, encontrei esta referência que tem mais algumas opções: http://www.cs.swarthmore.edu/help/vim/reformatting.html


9
Você também pode estar interessado em saber que o Vim pode delegar a formatação de texto para um programa externo, como o par . Eu fiz um screencast que demonstra como formatar o texto com o par .
Nelstrom

@nelstrom obrigado, até cerca par. É fantástico!
9189 Steven St

2
Quando você quiser que o texto fique esbelto e aparado (bem cortado?), Pense sempre em gq- Gentleman's Quarterly . (Desculpas para antropomorfizar masculino, mas as obras mnemônicas.)
Ruffin

Respostas:


372

Defina textwidthcomo 80 ( :set textwidth=80), vá para o início do arquivo (pode ser feito com Ctrl- Homeou gg) e digite gqG.

gqGformata o texto a partir da posição atual e até o final do arquivo. Juntará automaticamente linhas consecutivas quando possível. Você pode colocar uma linha em branco entre duas linhas se não desejar que essas duas sejam unidas.


14
E também funciona com seleções visuais. Ou seja, algo como: V}gq. Dessa forma, você vê o que irá formatar antes de realmente formatá-lo.
Plouff

6
A propósito, o que exatamente faz qpor si só?
Richard-Degenne

1
Existe uma maneira de fazer isso com linhas que são apenas uma longa sequência de caracteres, sem espaços? Edição: Eu descobri o utilitário "fold". Ainda estou pensando em fazer isso no vi.
Donald Smith

7
use em set tw=80vez de set textwidth=80economizar tempo
Yibo Yang

4
@dmranck Depois que set textwidth=76suas linhas serão automaticamente quebradas durante a digitação. Minha reclamação é que ela não faz nada nas linhas existentes sendo editadas. Mas V}gqé extremamente útil nesse sentido. Ventra no modo de seleção visual, }seleciona até a próxima quebra de parágrafo e gqexecuta o formatador atual nele (ou use gwpara chamar explicitamente o formatador vi). Além disso, {irá selecionar para cima. Você pode selecionar todo o documento e formato com, ggVGgqembora talvez haja uma maneira mais fácil. Salve isso como uma macro usando @para facilitar. Use vipgqpara atualizar o parágrafo atual.
Ktbiz

94

A solução de Michael é a chave, mas na maioria das vezes acho que quero reformatar o restante do parágrafo atual; para esse comportamento, use gq}.


17
expandindo isso - você pode usar o gq <motion> para formatar o que quiser.
Dan Schnau

1
Além disso, a opção 'nojoinspaces' que impede que dois espaços apareçam após os períodos em que as linhas são unidas em um limite de sentença. Bom quando o seu estilo tipográfico é um espaço único entre as frases em inglês.
Alex Hirzel

36

Você pode usar gqcom qualquer operador de movimento. Por exemplo, se você deseja reformatar apenas para o final da linha atual (ou seja, para quebrar a linha em que o cursor está), você pode usargq$

Você também pode reformatar selecionando texto no modo visual (usando `ve movendo) e digitando gq.

Existem outras opções para forçar linhas a serem quebradas também.

Se você quiser que o vim agrupe suas linhas enquanto estiver inserindo texto nelas, em vez de esperar até o final para reestruturar o texto, você encontrará essas opções úteis:

:set textwidth=80
:set wrapmargin=2

(Não seja desviado por wrape linebreak, que apenas reformata o texto exibido na tela e não altera o texto no buffer)


9
Da wrapmarginajuda: Quando 'largura do texto' é diferente de zero, esta opção não é usada.
mmoya

21

Graças a um comentário do DonaldSmith, achei isso, pois a textwidthopção não reformatava minha longa linha de texto (eu estava convertendo a reprodução com conversões de hex para bytes):

:%!fold -w 60

Isso reformatou o arquivo inteiro (que era uma linha para mim) em linhas de comprimento 60.


1
Isso é muito legal. Todas as respostas se concentram em limitar a largura de uma linha quando uma linha é dividida em espaços em palavras. Esta solução funciona para palavras muito longas (sequências de DNA).
pedrosaurio

1
Para urls longos, essa é a única coisa que descobri que funciona. Já de novo sobre textwidth mas não vai quebrar cadeias ininterrupta (que geralmente é uma coisa boa)
SkyLeach

13

Se você está procurando uma maneira que não seja o Vim , sempre há os comandos UNIX fmt e par .

Notas:

  • Não posso comentar sobre o Unicode, ele pode ou não se comportar de maneira diferente.
  • O @nelstrom já mencionou o uso parem seu webcast.

Veja como usaríamos os dois no seu exemplo.

$ echo -e 'long line is long!\nshort' > 3033423.txt
$ cat 3033423.txt
long line is long!
short
$ fmt -w 13 3033423.txt
long line is
long!  short
$ par 13gr 3033423.txt
long line is
long! short

Para usar de dentro do Vim:

:%! fmt -w 13
:%! par 13gr

Você também pode definir :formatprgpara par ou fmt e substituir gq. Para mais informações, ligue :help formatprgpara o Vim.


9

Quase sempre eu uso gqno modo visual. Digo aos meus alunos que significa "Gentlemens 'Quarterly", uma revista para pessoas exigentes.

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.