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"

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:
" then
" and then
" to fix the escape time problem with insert mode.
" Docs on bracketed paste mode:
" Docs on mapping fast escape codes in vim

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

function! WrapForTmux(s)
  if !g:bracketed_paste_tmux_wrap || !exists('$TMUX')
    return a:s

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

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

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

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

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>