Como posso manter o código formatado como fonte original quando colo no vim?


37

Quando copio algum código de páginas da Web e colo no VIM, percebo que ele se torna um estilo de bagunça, como uma escada, da seguinte maneira

xxxxxx
   xxxxxx
      xxxxxx
         xxxxxxxxxx

Como ele mexia tão regularmente, acho que talvez haja algo errado com o meu, .vimrcque é o seguinte:

set number
set nocompatible
set nowritebackup
set noswapfile
syntax on
filetype indent on
filetype plugin on
filetype on
set background=light
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions=T
set fileencodings=utf-8,prc
set ruler
set incsearch
map gs :%s
set t_Co=256
:colorscheme evening
filetype plugin indent on

Normalmente eu escrevo python no VIM.E ajuda seria apreciada.


11
Obrigado. Isso me irritou por anos, e eu nunca consegui perguntar a ninguém sobre isso. +1.
precisa saber é o seguinte

Respostas:


50

Faça isso antes:

:set paste

Então depois:

:set nopaste

Não é necessário para gvim; ativa e desativa automaticamente ao colar.
22410 Benjamin Bannier

Alguma idéia do porquê disso?
precisa saber é o seguinte

11
Apenas adivinhando: o Plain Vim é apenas linha de comando e não "sabe" sobre a área de transferência. Ele pega o "colar" como uma sequência de caracteres de entrada e aplica o recuo automático. O gvim que reconhece a GUI pode "saber" que os dados recebidos são da área de transferência e, assim, desabilitar a identificação automática para esse propósito.
precisa saber é o seguinte

Está correto. O terminal trata a operação "colar" como entrada de caracteres brutos.
Ignacio Vazquez-Abrams

Isso não é puramente um problema do vim - você pode obter um efeito semelhante colando no antigo editor do DOS em um prompt de comando. Este programa parece estar faltando no Windows 7 de 64 bits - presumivelmente porque é realmente um aplicativo DOS de 16 bits antigo e não valia a pena o trabalho de atualizá-lo. No entanto, é no Windows XP, e colar nele (1) funciona muito devagar, encenando a entrada caractere por caractere, e (2) faz uma bagunça real.
Steve314

16

http://vim.wikia.com/wiki/Toggle_auto-indenting_for_code_paste

Alternar recuo automático para colar código

fundo

Se você usar os comandos do Vim para colar texto, nada de inesperado ocorrerá. O problema só surge ao colar a partir de outro aplicativo e somente quando você não está usando uma versão GUI do Vim. Em uma versão de console ou terminal do Vim, não há procedimento padrão para colar texto de outro aplicativo. Em vez disso, o terminal pode emular a colagem inserindo texto no buffer do teclado, para que o Vim pense que o texto foi digitado pelo usuário. Após o término de cada linha, o Vim pode mover o cursor para que a próxima linha comece com o mesmo recuo que a última. No entanto, isso mudará a indentação já no texto colado.

Colar alternar

Coloque o seguinte no seu vimrc (mude para a chave que desejar):

set pastetoggle=<F2>

Para colar de outro aplicativo:

  • Inicie o modo de inserção.
  • Pressione F2 (ativa a opção 'colar').
  • Use seu terminal para colar texto da área de transferência.
  • Pressione F2 (desativa a opção 'colar').

Em seguida, o recuo existente do texto colado será mantido.

Você não precisa iniciar o modo de inserção primeiro, mas se estiver no modo normal e tiver um mapeamento para F2, esse mapeamento será aplicado e a função 'pastetoggle' não funcionará.

Algumas pessoas gostam do feedback visual mostrado na linha de status pela seguinte alternativa para o seu vimrc:

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

A primeira linha define um mapeamento para que pressionar F2 no modo normal inverta a opção 'colar' e, em seguida, mostre o valor dessa opção. A segunda linha permite pressionar F2 no modo de inserção, para ativar e desativar 'colar'. A terceira linha permite exibir se 'colar' está ativado no modo de inserção.


11
+1 para a solução de teclas de atalho. Para o firme não muito em VIM (como eu) que já mapeou as teclas F para outra coisa (como eu), <C-F2> seria Ctrl-F2 ...
DevSolar

excelente - agora estou usando isso
hoju

por que não mapear apenas as teclas de colar para fazer isso automaticamente, como <S-Insert> ou <Ctrl + V>, juntamente com suas funções originais? Ou escreva uma função que desabilite a colagem quando mais de alguns caracteres de entrada forem gravados no buffer no espaço de um segundo, é apenas uma ideia, claro que para mim eu tenho quase TODAS minhas chaves mapeadas para outras coisas, então é uma dor , Eu até tenho um teclado com 12 teclas F e + 15 teclas F (teclas G) e, com isso, três níveis, o que ainda não é suficiente :), mas sou apenas eu. O único problema é que o menu do botão direito, que não PDCs esc são enviados para sinalizar uma start-de-colar op ...
osirisgothra

2

É o autoindent que está mexendo com você.

set autoindent
set smartindent

Tente desabilitá-los quando você recortar e colar seu código e habilitá-los novamente quando terminar.


-2

A menor quantidade de esforço para conseguir isso é (pode ser aplicada .vimrc):

:set paste

Em seguida, cole seu código.


3
A 'paste'opção nunca foi criada para ser definida permanentemente. Ele desativa muitas coisas, incluindo mapeamentos e abreviações. Além disso, uma resposta anterior já cobre a 'paste'opção.
Heptite 9/11/16

2
Bem-vindo ao Super Usuário! Isso duplica uma resposta existente e não adiciona novo conteúdo. Não poste uma resposta, a menos que você realmente tenha algo novo para contribuir.
perfil completo de Toby Speight
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.