Posso justificar texto no Vim?

38

A única razão pela qual eu editaria um arquivo de texto no Pico ou Nano, e não no Vim, era o comando "Justificar" ^J. Ele reformatava um parágrafo do texto, criando quebras de linha em quebras de palavras para que o texto flutuasse bem na tela de largura fixa - formate o texto para caber em 80 colunas predefinidas, criando quebras de linha apenas entre as palavras. Por mais limitada que fosse a função, era muito útil formatar blocos de comentários longos, arquivos de documentação ou apenas substituir uma linha interminável de parâmetros por algo mais legível.

Posso fazer algo assim no Vim?

SF.
fonte

Respostas:

37

Você pode usar os operadores gqou gwcombinados com um comando de movimento. Por padrão, ele usa o fmtprograma (no Linux) para formatar o texto fornecido. No entanto, até onde eu sei, isso não justifica as linhas, portanto você terá margens corretas irregulares.

O jeito que eu uso é para gwip(modo normal) com o cursor em um parágrafo. Isso formatará o parágrafo atual, mantendo o cursor na mesma posição. Eu o uso dessa maneira para garantir que apenas o parágrafo atual esteja formatado. Ao editar um arquivo de texto, a emissão gwG(modo normal) no início do arquivo formatará o texto inteiro. Como prática recomendada, deixe pelo menos uma linha em branco entre os parágrafos.

Há muita configuração que pode ser feita. Para começar, aqui estão algumas de ajuda relevante: :h gq, :h gw, :h fo(opções de formato), :h fp(programa de formato), :h fo-table(uma explicação das opções possíveis).

guillem
fonte
1
gq / gw é definitivamente o caminho a percorrer. para adicionar a esta mensagem, você pode alterar o formato do programa para o par para ter mais opções. Check-out vimcasts.org/episodes/formatting-text-with-par
Bambu
3
Por padrão, o Vim não usa nenhum programa externo, embora você possa optar por usá-lo definindo a 'formatprg'opção.
jamessan
15

Há um ótimo VimCast neste tópico.

http://vimcasts.org/episodes/formatting-text-with-par/

Basicamente, você precisa instalar par:

$ brew install par
# or
$ sudo apt-get install par

E então, como você deseja que as colunas sejam agrupadas em 80 colunas:

:set formatprg=par\ -w80

Agora você pode usar o gqoperador, como em outras respostas (por exemplo gqip), e ele usará o Par em vez do formatador interno do Vim.

O Par é bastante avançado e formatará comentários como este:

/* This is a long */
/* multiline comment */
janko-m
fonte
11

De :help usr_25:

JUSTIFYING TEXT                                                                 

Vim has no built-in way of justifying text.  However, there is a neat macro     
package that does the job.  To use this package, execute the following          
command:                                                                        

        :runtime macros/justify.vim                                             

This Vim script file defines a new visual command "_j".  To justify a block of  
text, highlight the text in Visual mode and then execute "_j".

Então, tudo que você precisa fazer é executar

:ru macros/justify.vim

e então digite

_j

para justificar o texto no arquivo inteiro.

(Obviamente, você também pode adicionar ru macros/justify.vimao seu .vimrc para não precisar digitá-lo toda vez.)

Nota : isso não adiciona quebras de linha para você. Você precisa adicioná-los manualmente com gq. Para isso, você também deve definir textwidth(o padrão é 0) para o valor desejado via

set textwidth=80

e - se desejar - quebra automática de texto, definindo t-flag via

set formatoptions+=t

Se desejar, você pode definir um mapeamento no seu .vimrc para fazer a coisa toda por você:

nnoremap <C-j> gggqG_j

Isso move para o início do arquivo ( gg), quebra todas as linhas ( gqaté G) e, em seguida, _jusa o texto.

Maçaneta
fonte
Para um olhar mais atento sobre a formatação, consulte: MANUAL DO USUÁRIO VIM - Edição de texto formatado
Suuuehgi
Acabei de encontrar a :set fo+=aopção muito útil para reformatação automática de todo o parágrafo. Dê uma olhada em :help fo-tableoutras opções. Há também um bom tutorial em vídeo aqui .
Suuuehgi
+1 para uma solução completamente integrada. O _jmapeamento adicionado pela macro parece justificar o arquivo inteiro para mim ou pode ser limitado com uma seleção visual linha a linha.
Ches
5

Enquanto a ajuda do nano chama o ^Jcomando "Justify", na verdade, não justifica o texto, mas reformata o texto quebrando as linhas antes da margem direita da tela (ou em alguma coluna configurável, eu acho).

Você pode fazer o mesmo no VIM configurando a variável textwidth, de :help 'textwidth':

Largura máxima do texto que está sendo inserido. Uma linha mais longa será quebrada após o espaço em branco para obter essa largura. Um valor zero desativa isso.

Ou seja: enquanto você digita, se uma linha for maior que textwidthcaracteres, o VIM quebra a linha no primeiro espaço para manter o comprimento da linha menor ou igual a textwidth.

Para que isso funcione, a opção formatoptionsdeve conter a letra t. Veja :help 'formatoptions'e :help fo-tablepara as opções disponíveis, por exemplo, você pode estar interessado na copção de fazer a formatação funcionar com comentários.

Editar : você pode realizar a mesma operação, sem a necessidade de colocar tem formatoptions, usando o comando gw{motion}, ele formata o texto entre a posição atual do cursor e a posição do cursor depois {motion}. O gwcomando também está disponível no modo visual, formata o texto selecionado.

toro2k
fonte
1
Isso é bom para digitar. Posso aplicar isso para texto pré-existente?
SF.
3

Aqui estão duas opções fáceis:

  1. com um bloco de texto selecionado, digite !fmt
  2. com o cursor no início de um bloco, digite !}fmt

Ambos enviam um bloco de texto para o unix fmt, veja man fmtopções. Você pode passar argumentos de opção do vim. Por exemplo, para formatar um bloco com 50 caracteres, digite !}fmt -w 50.

Kaan
fonte
desculpe por isso, corrigido agora
kaan
Você também pode formatar seu arquivo inteiro digitando :%!fmte desfazendo um único, use não gostar do resultado.
Curinga
-1

Marque o texto usando o comando visual e use:

:!par 40j 

onde 40 é a largura da coluna e jsignifica justificar.

user16937
fonte
2
Bem vindo ao nosso site! Atualmente, sua pergunta é de baixa qualidade porque não possui explicações sobre a ferramenta que você está usando ( par) e por que sua solução funciona. Você pode adicionar mais detalhes para melhorar a qualidade de sua resposta e torná-la mais útil para futuros leitores.
Statox