Por que o recuo do Vim colou o código incorretamente?

101

No Vim, se eu colar este script:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"

Eu recebo esses resultados estranhos:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       

Apareceram sinais de hash (#) e tabulações. Por quê?

elbarna
fonte
31
Esta pode ser uma pergunta melhor para vi.stackexchange.com
Eric Renouf
@EricRenouf por quê? (Pergunta honesta)
Qix
3
@qix meu pensamento era esta é uma pergunta sobre como funciona o VIM, que é uma ferramenta comum para ser usado em * nix, mas * nix não é um requisito para usar o vim
Eric Renouf
1
@JaredBurrows Eu espero que consiga
Eric Renouf
1
Como você está acionando a pasta? Com o mouse?
Ben Voigt

Respostas:

123

Há duas razões:

Para colar vimenquanto o recuo automático está ativado, você deve alterar para o modo de colar digitando:

:set paste

Em seguida, você pode alterar para o modo de inserção e colar seu código. Após a colagem, digite:

:set nopaste

para desativar o modo colar. Como essa é uma ação comum e frequente, vimoferece o modo de colar alternado:

set pastetoggle=<F2>

Você pode alterar F2para qualquer chave que desejar e agora pode ativar e desativar a colagem facilmente.


Para desativar a inserção automática de comentários, você pode adicionar estas linhas ao seu vimrc :

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END

vimtambém fornece um registro de colagem para você colar texto da área de transferência do sistema. Você pode usar "*pou "+pdependendo do seu sistema. Em um sistema sem o X11, como OSX ou Windows, você precisa usar o *registro. Em um sistema X11, como o Linux, você pode usar os dois.

Leitura adicional

cuonglm
fonte
2
Uso o Vim desde sempre e nunca soube disso. Muito Obrigado.
Caja
A maioria dos emuladores de terminais gráficos modernos suporta um recurso chamado "modo de pasta entre colchetes". O Vim pode solicitar ao terminal que ative esse modo, que, por sua vez, envolverá o texto colado com determinadas seqüências de escape. O Vim pode reconhecer isso e desativar o acondicionamento / recuo pela duração da pasta. História longa: colar "funcionará como esperado". Não sou usuário do vim, mas uma pesquisa rápida na Web certamente informará como configurar esse modo.
Egmont
2
@MichaelDurrant set pastenunca deve estar no seu vimrc. Ele desativa ou redefine muitas coisas, incluindo mapeamentos no modo de inserção, mapeamentos de linha de comando, abreviações, largura de texto, wrapmargin, autoindent, smartindent, softtabstop, formatoptions, indentexpr e algumas outras. :h pastetem a lista inteira. A maioria das pessoas usa algumas ou todas essas coisas e se pergunta por que essas configurações são ignoradas.
FDinoff
4
Eu costumo usar :r!catpara colar literalmente.
21915 Simon Simonter
1
Pode valer a pena discutir a interação com set mouse, que pode entrar e sair automaticamente do modo de colar ao colar com o clique do mouse.
Ben Voigt
36

Use a pasta vim. O que você deseja é colar o que está no buffer da área de transferência "+p

Isso seleciona +e cola no lugar.

Se você estiver usando Linux, *é o X / clique no meio do buffer (o último texto selecionado).

Então o vim sabe que é uma pasta.

Caso contrário, o vim acha que você digitou as chaves que estão sendo coladas e faz sua própria indentação automática (em cima da indentação copiada) até o final da pasta.

Como uma observação para que isso funcione sobre SSH, você precisa definir a opção de compartilhamento da área de transferência -Y

Veja man sshpara mais detalhes.

exussum
fonte
4
Esta é realmente a resposta correta imho
Kristoffer Sall-Storgaard 29/04
Parece que isso funciona apenas para o vim gráfico ( gvim); vim correndo em um emulador de terminal cola o último texto eliminado com "* p, não a seleção atual.
wurtel
Eu não uso o gvim, apenas o terminal vim. qual é a configuração do mouse? minha configuração do mouse é c. Não sabe ao certo como funciona quando a seleção do mouse é permitida. set mouse?
Exussum
2
Também verifique vim --versionse ver se ele foi compilado com suporte a área de transferência +xterm_clipboarddeve ser na saída
exussum
@ Wurtel: Talvez você tenha definido a área de transferência com unnamedbarbante.
cuonglm
8

As guias foram inseridas porque você ativou o autoindent e pode desativar esse comportamento desativando o autoindent ( :set noai) antes de colar no terminal.

As linhas comentadas são produzidas por comentários automáticos e podem ser desativadas desativando-as.

Alternativa para aqueles em que você deve obter o comportamento desejado usando as alternâncias :set paste, colando o código formatado e :set nopasterestaurando o comportamento normal.

Casey
fonte