Como re-recuar o código mal recuado


39

Eu gosto do recurso de recuo inteligente do Vim, ele permite criar blocos de código bem recuados.

Eu copio / colo regularmente o código nos buffers, mas esse código geralmente está mal formatado.

O que seria ideal é "reprocessar" o código através do sistema de indentação inteligente.

É possível uma coisa dessas?

Por exemplo, como você 'consertaria' o código a seguir (uma extração de um bloco maior - não quero consertar cada linha manualmente ...):

    else 
                {
                        m[c] = 5;
                Finished = true;
std::cout<<"(ID,R,E)"<<"-->"<<"("<<g[c]<<","<<r[c]<<","<<E1 <<")"<< std::endl;
std::cout << "\n"<<"finish-->" << r[c] << "\t" <<"E1-->"<< E1 <<"\n" ;
                }
        }

11
Você está falando sobre colar um código originalmente recuado ou indentado corretamente que muda quando você o cola no Vim?
— jamessan

O código colado é pouco recuado para começar. Deixe-me incluir um exemplo ....
— rolfl

Respostas:


48

Eu faço isso de duas maneiras.

Colar ajustado recuo

Primeiro, se o código no buffer estiver formatado, mas em um nível diferente de recuo, eu uso em ]pvez de p, que cola o código como está, mas com o recuo alterado de modo que a primeira linha colada tenha a mesma profundidade que a linha I 'seg.

Origem do EG copiada para o buffer

while (1) {
    dostuff();
}

EG resultado de colá-lo com ]p

int myfunc() {
    int i = 5; /* Cursor on this line before paste */
    while (1) {
        dostuff();
    }
 }

O vim coloca o tempo no mesmo nível de indentação que int i. Isso é rápido, mas só funciona se o código copiado estiver corretamente recuado dentro de si.

Reformatar após colar

O =operador no vim reformata o código com base nas regras de formatação configuradas. Para pequenos trechos de colagem, entrarei no modo visual v, selecione as linhas que acabei de colar e pressione =para reformatá-las.

Para pastas maiores, aproveito o fato de o cursor ir para a primeira linha colada e o vim dizer algo como "84 linhas a mais". Posso entrar 84==para refazer essas 84 linhas (é claro, substitua 84 pelo número de linhas que você realmente cola).

Referências

:help ]p para colar recuo ajustado

:help =tampas ={motion}, [count]==e {Visual}=para filtrar através personalizado ou builtin regras travessão


6
Você pode selecionar bem o código que colou no modo visual usando `[v`]
— craigp

11
@Badger Apenas para esclarecer, isso é suporte de suporte-v-suporte-suporte?
— phatskat

11
sim .. o textarea surtou com os backticks, então não pude colocá-lo em um bloco de código: P
— craigp 04/02/2015

O operador = no vim reformata o código com base nas regras de formatação configuradas que eu daria +100, se pudesse. Eu poderia ter economizado dias.
— Wossname

11
Eu uso <control + R> "para colar, para que não precise sair do modo de inserção. O que é] p equivalente a <control + R>"?
— A --- B

15

O =comando pode ser usado para reinserir.

Como a maioria dos comandos no modo normal, ele pode ser aplicado a um movimento, para que você possa reinserir o código colado com =']. Isso volta da posição atual do cursor para a ']marca, que é a última linha da pasta.

= também pode ser usado no modo visual.

Outro comando útil é o ]pque cola no mesmo nível de recuo da linha atual. Isso pode ajudar a colar o texto recuado corretamente, embora com uma profundidade de recuo diferente, de acordo com o texto ao redor.


7

O uso =ap (mnemônico é 'formatar um parágrafo') terá uma tentativa do vim de formatar automaticamente o parágrafo atual.

Se você deseja prestar muita atenção ao que está reformatando, talvez seja mais fácil e rápido usá-lo vappara selecionar visualmente o parágrafo atual (fornecendo uma indicação visual do que está sendo reformatado), seguido por =. Acho isso útil em arquivos nos quais sei que o vim será reformatado incorretamente e não quero formatar incorretamente outras linhas por engano.


4

Para reinserir um arquivo já no buffer, use gg=G: Consulte Corrigir recuo

Para reinserir uma parte de um arquivo, vários limites podem ser aplicados ao =filtro (por exemplo, ==corrige apenas a linha atual).

Para manter o recuo inalterado ao colar o texto :set pasteantes de colar o texto no buffer, isso impedirá o vim de recuar automaticamente o texto que você acabou de colar. Depois de colar as coisas, você pode voltar a usar set :nopastequando terminar. Veja o vimdoc aqui .

Se você estiver colando coisas com frequência, seria uma boa ideia usar esta dica no VimWiki e configurar uma chave para alternar no modo "colar" adicionando estas linhas ao seu .vimrc:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

Você pode pressionar <F2>para alternar para o modo de colar. O vim mostrará as palavras "COLAR" na linha de status quando o modo colar estiver ativo.


2
Esta pergunta não é sobre colar código com recuo, é sobre como corrigir código mal recuado.
— Rolfl

4
Não vi o comentário que você postou. No entanto, você ainda pode usar gg=Gpara recuperar o arquivo inteiro.
— Bhargav Bhat #

@rolfl É aí que eu geralmente começo nesses casos : gg=G, depois observe as partes que vimderam errado.
— muru

Se você deseja ter mais controle (ou reduzir o incômodo repetido), considere adicionar um comando automático para chamar uma ferramenta de formatação de código, como astylequando você salva um buffer. Veja esta pergunta no SO para obter detalhes.
— Bhargav Bhat

2

Para re-recuar todo o bloco de um bloco entre colchetes ou colchetes automaticamente, coloque o cursor na mesma linha em que está um colchete e tente =%. Para alterar a largura do turno, use, por exemplo :set sw=2.

Se isso não funcionar como esperado, para diminuir o recuo manualmente ( ultrapassado ), tente <%e repita com .(se necessário). Use >%para o oposto.

Tão:

else
       {
         // some code
       }

torna-se:

else
{
  // some code
}

Para código específico, para re-recuar uma linha ou poucas linhas automaticamente, tente:

  • == recuar a linha atual
  • 5== re-recuar 5 linhas

Para aumentar / diminuir o avanço manualmente para uma linha ou poucas linhas, tente:

  • << recuar a linha atual por espaços de largura de turno
  • 5<< recuar 5 linhas por espaços de largura de turno
  • >> recuar a linha atual por espaços de largura de turno
  • 5>> recuar 5 linhas por espaços de deslocamento
  • . repetir se necessário

Você também pode fazer o recuo no modo visual ( v) selecionando texto e pressionando =(recuo automático), <(recuo) ou >(recuo).

Outro truque é recuo correto de todo o arquivo por: gg=G.

Se você tiver guias em vez de espaços, use: o :retabque substituirá todas as guias por espaços (consulte: Como substituir guias por espaços? ).


Para métodos externos, você pode tentar:

  • pythonTidy para reformatar o código Python, por exemplo:

    :%!pythonTidy
    

Palavras-chave:



1

Já existem muitas coisas abordadas nas respostas existentes. Eu apenas gosto de adicionar um mapeamento que eu uso com frequência para indentação.

nnoremap <Leader>i  mzgg=G`z

Eu vi alguns vimrc com isso mapeado para ===.

De qualquer forma, esse é um ótimo mapeamento e eu o uso quase sempre, principalmente quando colar o código copiado de outro lugar.

Ou, melhor ainda, coloque isso de autocmdforma que o Vim o indente antes de gravar as alterações no disco.

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.