"{register}p
não funcionará como você descreve. Substituirá a seleção pelo conteúdo do cadastro. Em vez disso, você terá que fazer algo como:
" I haven't found how to hide this function (yet)
function! RestoreRegister()
let @" = s:restore_reg
return ''
endfunction
function! s:Repl()
let s:restore_reg = @"
return "p@=RestoreRegister()\<cr>"
endfunction
" NB: this supports "rp that replaces the selection by the contents of @r
vnoremap <silent> <expr> p <sid>Repl()
O que deve funcionar, contanto que você não use um plugin que tenha um vmap não nore para p, e que espere que um registro seja sobrescrito.
Este código está disponível como um script lá . Ingo Karkat também definiu um plugin para resolver o mesmo problema.