Extra Characters when Pasting into SSH

Do you get extra 0~ and 1~ characters around the text you paste into a ssh terminal? Such as something like this:

0~this should not paste like this1~

Well the fix is easy. Just run this on your ssh command line:

printf "\e[?2004l"

If this happens when you log in, you can add this to your .bashrc

# Disable bracketed paste
if [ "$PS1" ]; then
  printf "\e[?2004l"
fi

What is causing this?

It’s called bracketed paste mode, and it’s a little known feature of some shells and other programs. Why a “feature”? Well, it allows your terminal to know the difference between something you’ve typed and something you’ve pasted. You can read more about it here

Vim may keep causing it

Vim, in some modes, can cause this to keep on coming back. For example, on one of my machines when I pasted text into the terminal at first, it would work good:

[user ~]# Pasted Text Here

But after I run vim, it makes it so when I paste in the text, it adds the ‘0~ 1~’:

[user ~]# vim ~/file
[user ~]# 0~Pasted Text Here1~

We can fix that with running printf "\e[?2004l" but that’ll be annoying to use after each time I use vim. Which is a lot.

Instead, I found a repository that fixes this issue. I found it on the above bracketed-paste page. Here is the code that you can put into your vimrc or .vimrc

Don’t use :set paste with this, as it will add characters when you paste something into vim.

" Code from:
" http://stackoverflow.com/questions/5585129/pasting-code-into-terminal-window-into-vim-on-mac-os-x
" then https://coderwall.com/p/if9mda
" and then https://github.com/aaronjensen/vimfiles/blob/59a7019b1f2d08c70c28a41ef4e2612470ea0549/plugin/terminaltweaks.vim
" to fix the escape time problem with insert mode.
"
" Docs on bracketed paste mode:
" http://www.xfree86.org/current/ctlseqs.html
" Docs on mapping fast escape codes in vim
" http://vim.wikia.com/wiki/Mapping_fast_keycodes_in_terminal_Vim

if !exists("g:bracketed_paste_tmux_wrap")
  let g:bracketed_paste_tmux_wrap = 1
endif

function! WrapForTmux(s)
  if !g:bracketed_paste_tmux_wrap || !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_ti .= WrapForTmux("\<Esc>[?2004h")
let &t_te .= WrapForTmux("\<Esc>[?2004l")

function! XTermPasteBegin(ret)
  set pastetoggle=<f29>
  set paste
  return a:ret
endfunction

execute "set <f28>=\<Esc>[200~"
execute "set <f29>=\<Esc>[201~"
map <expr> <f28> XTermPasteBegin("i")
imap <expr> <f28> XTermPasteBegin("")
vmap <expr> <f28> XTermPasteBegin("c")
cmap <f28> <nop>
cmap <f29> <nop>

Sources