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

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

Michael Madsen
fonte
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}.

Alex Hirzel
fonte
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)

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

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

Ehtesh Choudhury
fonte
9

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

ncmathsadist
fonte