Sempre use: definir colar, é uma boa ideia?


19

Em um terminal vim, colar dados da área de transferência geralmente atrapalha o recuo do código. Eu só sabia que se eu usar :set pasteo travessão não está quebrado. Porém, depois de colar os dados, devo fazer :set nopastenovamente? E se eu não fizer, que problema vem?


Que tal tentar por si mesmo? Ou lendo a documentação ?
romainl

11
Consulte também "Modo de pasta com bracketing" na minha resposta para "Colar código na janela do terminal no vim" stackoverflow.com/a/7053522/754997 . Se o seu emulador de terminal suportar, você pode solicitar que o Vim mude para o / do modo de colar automaticamente sempre que colar texto no terminal.
Chris Page

11
@romainl Acho bastante plausível que 1) tente e espere para ver se há consequências negativas de sempre usar a pasta de conjunto (+ - nopaste) e 2) rtfm-ing (como um usuário de nível intermediário ou mais baixo, como o OP) , são menos úteis do que perguntar a quem tem experiência com as opções. Pedir aqui parece uma abordagem mais inteligente, e documentar isso ajudará outras pessoas.
Belacqua

Respostas:


5

Como outros escreveram, você não deseja deixar o conjunto 'colar'. Eu só queria ressaltar que, com um bom emulador de terminal e um compilado e configurado corretamente vim, você não precisa alterar 'colar'. Você precisa de um bom emulador de terminal, como o xterm ou o GNOME Terminal, o vim com o recurso X11 incluído e a opção 'mouse' definida como 'a'. Em seguida vim, "saberá" quando você está colando com o mouse e efetivamente definirá e desativará a opção "colar" para você.

Uma maneira de obter vimo recurso X11 é executar gvimcom a -vopção ou criar um alias,

alias vim='gvim -v'

Então coloque

set mouse=a

no seu ~ / .vimrc.


Quando defino mouse = a, não consigo copiar texto. "Copiar" fica acinzentado no menu do botão direito e no menu do aplicativo.
Lee Daniel Crocker

@LeeDanielCrocker: Copyficará acinzentado ou não estará visível, a menos que algum texto tenha sido selecionado. Como você está selecionando o texto a ser copiado?
garyjohn

Apenas com o mouse. Para sua informação, "y" funciona bem ... puxa o texto e o copia no teclado do sistema. São apenas os menus que não funcionam. Se o mouse estiver definido como "r", os menus funcionarão, mas o mouse incluirá os números de linha. Então, apesar de tudo, eu posso viver com mouse = a, só preciso lembrar de puxar em vez de copiar.
Daniel Daniel Crocker

7

Esta publicação tem minha resposta favorita, https://coderwall.com/p/if9mda/automatically-set-paste-mode-in-vim-when-pasting-in-insert-mode

Basicamente, se você iniciar no modo Inserir e usar Ctrl + Shift + V ou clicar com o botão direito do mouse em colar com o mouse, o Vim detecta que isso veio de um terminal e define automaticamente o modo de colagem, depois o desmarca assim que feito, para não perder as chaves remapeadas (que não pode funcionar no modo colar porque está gravando dados brutos) e você volta ao estado "sã" quando terminar.

Por apenas vim (coloque no 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

Se você usa o vim no Tmux (ainda entra no .vimrc)

function! WrapForTmux(s)
  if !exists('$TMUX')
    return a:s
  endif

  let tmux_start = "\<Esc>Ptmux;"
  let tmux_end = "\<Esc>\\"

  return tmux_start . substitute(a:s, "\<Esc>", "\<Esc>\<Esc>", 'g') . tmux_end
endfunction

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

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

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

Presumo que uma das let &t_SI .= "\<Esc>[?xxxxx"linhas está detectando o atalho de colagem do teclado? Isso também funciona para o Mac, devido aos diferentes atalhos?
Duvida #

@ duv1ejack Na verdade, eles estão detectando as seqüências de escape do Xterm, não como elas foram chamadas (ou seja, 2004h é uma pasta iniciada), desde que o seu terminal suporte os códigos de chave do Xterm e os passe para o Vim, ele deve funcionar bem no Mac.
precisa saber é o seguinte

AMD. você é meu herói. Eu digitei assim: set nopaste tantas vezes.
Max2

3

Como sugerido pela romainl, a documentação explica que a configuração da 'paste'opção desativa várias outras opções, e você certamente descobrirá que mais cedo ou mais tarde isso causará problemas para você. Por esse motivo, existe a 'pastetoggle'opção Vejo:

:help 'paste'
:help 'pastetoggle'

1

Se algo existe, deve ter seu significado. Você deve dar uma boa olhada na documentação do vim, que é muito útil.

  :help 'paste'
  :help 'pastetoggle'

Depois de ler, você pode querer o seguinte:

" Toggle paste mode
"   (prefer this over 'pastetoggle' to echo current state)
nmap <leader>p :setlocal paste! paste?<cr>

Espero que você ache este post útil :)


1

Quando você cola no vim, IIRC pensa essencialmente que você digitou todos esses caracteres. Portanto, se o recuo automático estiver ativado, ele recuará as coisas para você, mas o texto colado geralmente já contém recuo, de modo que o recuo é realmente "confuso". Mudar para o modo colar desativa coisas como recuo automático.

Se você gosta de recuar automaticamente enquanto digita, deve voltar para nopaste depois de colar. Experimente e observe como você deve fazer todo o recuo manualmente no modo de colar.

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.