texto - debian vim colar




Desativando o recuo automático ao colar texto no vim (13)

Eu estou fazendo o esforço para aprender Vim.

Quando eu colo o código no meu documento da área de transferência, eu obtenho espaços extras no início de cada nova linha:

line
  line
    line

Eu sei que você pode desativar o recuo automático, mas não consigo fazê-lo funcionar porque eu tenho algumas outras configurações conflitantes ou algo assim (o que parece bastante óbvio no meu .vimrc, mas não parece importar quando eu as tirei).

Como faço para desativar o recuo automático quando eu colo o código, mas ainda tenho o recuo automático do vim quando estou escrevendo o código? Aqui está o meu arquivo .vimrc :

set expandtab  
set tabstop=2  
set shiftwidth=2  
set autoindent  
set smartindent  
set bg=dark  
set nowrap  

A maneira mais rápida que eu estou ciente de ir rapidamente para o modo paste-insert para uma pasta one-shot é o unpaired do tpope, que possui yo e yO , supostamente mnemônicos para “abrir”. Eles só estão documentados em seu vimdoc, como:

Um toggle não foi fornecido para 'colar' porque o caso de uso típico de encapsular uma inserção solitária é um desperdício: você alterna duas vezes, mas só cola uma vez (YOPO). Em vez disso, pressione yo ou yO para invocar o ou O com 'colar' já definido. Deixar o modo de inserção define 'nopaste' automaticamente.


Acabei de colocar set clipboard=unnamed no meu .vimrc. Isso faz com que o buffer pad padrão seja mapeado para a área de transferência do X.

Então, se eu marcar um pouco de texto em um terminal, posso simplesmente pressionar p para colá-lo no vim. Da mesma forma, eu posso arrancar coisas no vim (por exemplo, YY para puxar a linha atual para o buffer) e clique no meio em qualquer janela para colá-lo.

Não sei. Eu acho super conveniente.


Ao trabalhar dentro de um terminal, o plugin vim vim-bracketed-paste vim irá manipular automaticamente pastas sem precisar de pressionamentos de teclas antes ou depois da colagem.

Ele funciona detectando o modo de colagem entre colchetes, que é uma seqüência de escape enviada por terminais compatíveis "modernos" com terminais x, como iTerm2, gnome-terminal e outros terminais usando libvte. Como um bônus adicional, ele também funciona para sessões do tmux. Eu estou usando com sucesso com iTerm2 em um Mac conectando a um servidor linux e usando tmux.


Cole isso no seu ~ / .vimrc e seja feliz:

" enables :Paste to just do what you want
command Paste execute 'set noai | insert | set ai'

Edit: na reflexão :r !cat é uma abordagem muito melhor, já que é curta, semântica e não requer vimrc personalizado. Use isso em vez disso!


Embora :pastetoggle ou :paste e :nopaste devam estar funcionando bem (se implementados - eles nem sempre são como podemos ver na discussão) Eu recomendo colar usando a abordagem direta "+p ou "*p e lendo com "+r ou "*r :

O Vim tem acesso a dez tipos de registradores ( :help registers ) e o questionador está interessado em quotestar e quoteplus da seção

  1. Seleção e drop registra "* , "+ e "~

Use esses registros para armazenar e recuperar o texto selecionado para a GUI. Veja quotestar e quoteplus . Quando a área de transferência não está disponível ou não está funcionando, o registro não nomeado é usado no lugar. Para sistemas Unix, a área de transferência só está disponível quando o recurso + xterm_clipboard está presente. {não em vi}

Observe que há apenas uma distinção entre "* e" + para sistemas X11.

:help x11-selection esclarece ainda mais a diferença de * e + :

                                                  quoteplus quote+

Existem três seleções X documentadas: PRIMARY (que deverá representar a seleção visual atual - como no modo Visual do Vim), SECONDARY (que é mal definida) e CLIPBOARD (que deve ser usado para operações de recortar, copiar e colar ).

Destes três, o Vim usa PRIMARY ao ler e gravar o registrador * (portanto, quando as opções X11 estão disponíveis, o Vim define um valor padrão para 'área de transferência' de "autoselect") e CLIPBOARD ao ler e gravar o registro "+. O Vim não acessa a seleção SECONDARY.

Exemplos: (assumindo os valores das opções padrão)

  • Selecione um URL no modo visual no Vim. Vá para o seu navegador e clique no botão do meio do mouse no campo de texto da URL. O texto selecionado será inserido (esperançosamente!). Nota: no Firefox, você pode definir a preferência de middlemouse.contentLoadURL como true em about: config, e a URL selecionada será usada ao pressionar o botão do meio do mouse na maioria dos locais da janela.

  • Selecione algum texto no seu navegador, arrastando com o mouse. Vá para o Vim e pressione o botão do meio do mouse: O texto selecionado é inserido.

  • Selecione algum texto no Vim e faça "+ y. Vá para o seu navegador, selecione algum texto em um campo de texto arrastando com o mouse. Agora use o botão direito do mouse e selecione" Colar "no menu popup. O texto selecionado é sobrescrito por o texto do Vim. Observe que o texto no registro "+ permanece disponível ao fazer uma seleção Visual, o que torna o outro texto disponível no registro". Isso permite sobrescrever o texto selecionado.

Embora a configuração do modo de colagem com paste/nopaste/pastetoggle esteja perfeitamente bem, você ainda precisa habilitar manualmente o modo de colar antes de colar e desabilitar o modo de colar após a colagem. Sendo a pessoa preguiçosa que sou, abaixo está a melhor solução que encontrei até agora, que alterna automaticamente o modo de colar quando você cola.

Aqui está um pequeno truque que usa o modo de colar entre colchetes do terminal para definir / desmarcar automaticamente o modo colar do Vim quando você cola. Coloque seguindo em seu .vimrc:

let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

Agora você pode colar sem ativar ou desativar explicitamente o modo de colagem - ele é tratado automaticamente para você.

Fonte: Coderwall

Nota: Esta solução não funciona no WSL (Windows 10 Subsystem for Linux). Se alguém tiver uma solução para a WSL, atualize esta resposta ou adicione-a nos comentários.


Infelizmente eu encontrei o plugin vim mencionado para não estar trabalhando com o iTerm2 3.0.15 (para ser justo eu não sei se isso quebrou em versões mais antigas) - mas eu encontrei este hack em seu lugar.

Mapeie o comando -p para fazer a colagem e usando as chaves iTerm2 vim. Obviamente, isso só funciona para o iTerm2.

Como funciona. Eu uso "jk" para entrar no modo de escape, então você também precisará de:

: inoremap jk

no seu .vimrc.

Em seguida, ele invoca P para entrar no modo de colar, "+ p para colar a partir da área de transferência e, em seguida, P para desativar o modo de colar. Hth.


Isso funciona para mim (case for + register, o que eu uso como buffer de troca entre aps):

imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>

Outra maneira de colar é via <CR> e soltando o conteúdo do registrador (aqui o registro global). Veja:: :h i_ctrl-r e h i_CTRL-R_CTRL-O .

Da documentação de ajuda do vim:
Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse<MiddleMouse>. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}

Portanto, para colar o conteúdo no vim sem recuo automático, use <CR><CO>* na maioria dos sistemas unix.

Nota: isto só funciona se o vim é compilado com a clipboard .


Para evitar efeitos indesejados ao colar, existe uma opção que precisa ser definida:

set paste

Um comando útil para ter no seu .vimrc é set pastetoggle=<F10> ou algum outro botão, para alternar facilmente entre colar e nopaste.


Se você estiver em um mac, o macvim parece lidar bem com isso sem ter que alternar a pasta.

brew instalar o macvim --override-system-vim


Se você estiver trabalhando localmente, poderá colar a área de transferência do sistema com a sequência de teclas:

"+p

Este é um comando vim adequado, então não precisa se preocupar em entrar em um modo de inserção ou desligar primeiro o autoindent.

É claro que se você estiver trabalhando remotamente (consola por SSH, por exemplo), então isso não funcionará e você deve ir :set noai , inserir modo, colar no console, deixar insertmode,: :set ai route como descrito em outro lugar.


Atualização: melhor resposta aqui: https://.com/a/38258720/62202

Para desativar o autoindent ao colar o código, há um modo "colar" especial.

Tipo

:set paste

Em seguida, cole seu código. Observe que o texto na dica de ferramenta agora diz -- INSERT (paste) -- .

Depois de colar o código, desative o modo de colagem, para que o recuo automático ao digitar funcione corretamente novamente.

:set nopaste

No entanto, sempre achei isso pesado. É por isso que mapeio <F3> tal forma que ele pode alternar entre os modos colar e nopaste enquanto edita o texto! Eu adiciono isso ao .vimrc

set pastetoggle=<F3>




auto-indent