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
Warning
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>