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?

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


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 */

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.


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.


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.


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.


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