Como faço para corrigir o recuo de um arquivo inteiro no Vi?

625

No Vim, qual é o comando para corrigir o recuo de todas as linhas?

Muitas vezes, copio e colo o código em um terminal remoto e deixo tudo bagunçado. Eu quero consertar isso de uma só vez.

mmcdole
fonte
Similar: Re-recuando código mal recuado no Vi SE
kenorb 11/11/15
8
Prevenção é melhor que a cura. Nesse espírito vem esse comentário. Faça um ": set paste" antes de entrar no modo de inserção e colar o código do terminal remoto.
Chthonic Project 14/10

Respostas:

1215

=, o comando indent pode receber movimentos. Então, ggpara obter o início do arquivo, =recuar, Gaté o final do arquivo gg=G,.

Logan Capaldo
fonte
39
Nunca poderei desaprender meu precioso 1G =) Um dos meus favoritos é =% em pé em um suporte de abertura. Ele corrige os recuos de todo o bloco.
PEZ
2
: 0 <retorno> não é tão ruim, mas gg é bom. (yeah, eu aprendi ed primeiro)
Erik Olson
8
Posso recuar o arquivo inteiro sem sair da linha atual?
Fábio Perez
86
@ Fábio: ''(duas aspas simples) leva você de volta para onde você estava, então gg=G''deve recuar e depois retornar.
Nemo157
@ArchimedesTrajano O estoque de ações do Mac OS é muito antigo, eu recomendo a versão do HomeBrew; é muito mais novo. Eu tive alguns problemas irritantes com o vim do Mac. Além disso, ouvi dizer que você não deve mexer com o interno, portanto, não tente atualizá-lo a menos que tenha muito cuidado.
AlexMA14
126

Antes de colar no terminal, tente :set pastee :set nopastedepois de terminar. Isso desativará o recuo automático, quebra automática de linha e outros recursos que estão atrapalhando sua pasta.

edit: Além disso, devo salientar que um resultado muito melhor do que o =recuo geralmente pode ser obtido usando um programa externo. Por exemplo, eu corro :%!perltidyo tempo todo. astyle, cindentetc. também podem ser usados. E, é claro, você pode mapear esses itens para um pressionamento de tecla e mapear diferentes para o mesmo pressionamento de tecla, dependendo do tipo de arquivo.

derobert
fonte
5
Você pode definir a equalprgopção em um plug-in ftft para usar um filtro externo para =recuar, em vez de uma combinação de teclas personalizada.
Josh Lee
Há também uma opção de ligação de teclas com pastetoggle, por exemplo. : conjunto pt \ p para alternar entre os modos
michael
Nota: no vimconfig do grml, a chave pastetoggle é mapeada para F11
Thomas
Eu uso formatpgmcom arrumado e estilo e depois gq. Aqui estão alguns exemplos dos meus .vimrc: au FileType xml set fp=tidy\ -q\ -i\ -xmleau FileType java set fp=/usr/local/bin/astyle\ --mode=java\ --indent=tab
Raffi Khatchadourian 27/02
acabou de baixar perltidy depois de ler isto, é muito melhor do que a auto travessão vim padrão
Joey Ciechanowicz
29

Se você deseja reinserir o bloco em que está, sem precisar digitar acordes, é possível:

[[=]]
Andrew Wagner
fonte
1
Desculpe reviver isso, mas o que você quis dizer com acordes? Coords?
John P
7
"Acordes" aqui refere-se a comandos emitidos mantendo pressionada uma tecla enquanto pressiona outra, em analogia aos acordes musicais, várias notas soam ao mesmo tempo. Então G é shift + g, ^] é ctrl +] e assim por diante. Eles levam mais tempo para digitar do que as ligações de tecla única.
Ralph Giles
Você também pode usar o =aBque não moverá o cursor.
31716
7
No teclado Nordic, [[=]]requer 5 acordes :(
k4kuz0
29

O mestre de todos os comandos é

gg=G

Isso recua o arquivo inteiro!

E abaixo estão alguns dos comandos simples e elegantes usados ​​para recuar linhas rapidamente no Vim ou gVim.

Para recuar todas as linhas abaixo da linha atual

=G

Para recuar a linha atual

==

Para recuar n linhas abaixo da linha atual

n==

Por exemplo, para recuar 4 linhas abaixo da linha atual

4==

Para recuar um bloco de código, vá para um dos chavetas e use o comando

=%
Sagar Jain
fonte
17

Você pode usar o aplicativo / utilitário organizado para indentar arquivos HTML e XML e funciona muito bem na indentação desses arquivos.

Pré-especificar um arquivo XML

:!tidy -mi -xml %

Pré-especificar um arquivo HTML

:!tidy -mi -html %
Naga Kiran
fonte
16

pressione escape e digite as combinações abaixo rapidamente:

gg=G
tokhi
fonte
28
Digitei devagar, você não vai acreditar no que aconteceu a seguir.
K0pernikus
Acabei de dar a resposta e o comentário um voto positivo, porque isso não tinha preço! lol @ k0pernikus
gglasses
12

1G=G. Isso deve recuar todas as linhas do arquivo. 1Gleva a primeira linha, =inicia o recuo automático e a final Gleva a última linha do arquivo.

Amjith
fonte
Ou até mesmo1gg=G
Biggybi 28/07/19
1G = G corrigiu para mim. Impressionante!
Natus Drew
8

:set pasteé seu amigo eu uso massa de vidraceiro e acabo copiando código entre janelas. Antes de eu ligar :set paste(e :set nopaste) copiar / colar, dei-me ajustes por esse mesmo motivo.

Elsporko
fonte
1
Sim, eu também estou usando massa de vidraceiro. : conjunto de colar é incrível
mmcdole
7

No Vim, use :insert. Isso manterá toda a sua formatação e não fará a identificação automática. Para mais informações help :insert.

Eric Johnson
fonte
7

se você não quiser usar :set paste, clique com o botão do meio set nopaste, também poderá colar o conteúdo da área de transferência:

"*p
"+p

Dessa forma, você não precisa sair do modo normal. se você precisar colar +ou *depender de como você selecionou o texto, consulte :help quoteplus.

0x89
fonte
4

O vim-autoformat formata seus arquivos de origem usando programas externos específicos para o seu idioma, por exemplo, a jóia "rbeautify" para arquivos Ruby, o pacote npm "js-beautify" para JavaScript.

Wojtek Kruszewski
fonte
3

Para arquivos C ++ complexos, o vim nem sempre obtém a formatação correta ao usar o =comando filter do vim . Portanto, para essas situações, é melhor usar um formatador C ++ externo como astyle (ou uncrustify ), por exemplo:

:%!astyle

A função '=' do Vim usa seu formatador interno por padrão (o que nem sempre acerta as coisas), mas também é possível configurá-lo para usar um formatador externo, como astyle, configurando-o adequadamente, conforme discutido nesta pergunta .

Pierz
fonte
1

Você pode criar um mapeamento para fazer isso por você.

Este recuará automaticamente o arquivo inteiro e ainda manterá o cursor na posição em que você está:

nmap <leader>ai mzgg=G`z
Sergio D. Márquez
fonte
0

Para o vi Editor, use: insert. Isso manterá toda a sua formatação e não inserirá a indentação automática. Depois disso, pressione escape para visualizar o arquivo formatado real, caso contrário, você verá alguns caracteres ilegíveis. como ^ eu por exemplo:

public static void main(String[] args) {
^I
^I System.out.println("Some Garbage printed upon using :insert"); 
}
ps2090
fonte
0

Basta ir para o modo visual no vim e selecionar de cima para baixo depois de selecionar, basta pressionar =, Toda a linha selecionada será recuada.

Ramanand Yadav
fonte
Eu evitaria isso. O modo visual é para quando você não tem certeza sobre seus movimentos, se você sabe capturar um conjunto de caracteres, não faz sentido a etapa extra de entrar no modo visual. Por que ggvG=quando você pode gg=G. Qual era o sentido de tornar o movimento visível? Isso vale para todas as ações que fazem movimentos.
alextes