How to paste over without overwriting register

Viewed 25820

Does anyone know of a way to paste over a visually selected area without having the selection placed in the default register?

I know I can solve the problem by always pasting from an explicit register. But it's a pain in the neck to type "xp instead of just p

12 Answers

I don't like the default vim behavior of copying all text deleted with d, D, c, or C into the default register.

I've gotten around it by mapping d to "_d, c to "_c, and so on.

From my .vimrc:

"These are to cancel the default behavior of d, D, c, C
"  to put the text they delete in the default register.
"  Note that this means e.g. "ad won't copy the text into
"  register a anymore.  You have to explicitly yank it.
nnoremap d "_d
vnoremap d "_d
nnoremap D "_D
vnoremap D "_D
nnoremap c "_c
vnoremap c "_c
nnoremap C "_C
vnoremap C "_C

"{register}p won't work as you describe. It will replace the selection with the content of the register. You will have instead to do something like:

" 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()

Which should be fine as long as you don't use a plugin that has a non-nore vmap to p, and that expects a register to be overwritten.

This code is available as a script there. Ingo Karkat also defined a plugin solving the same issue.

Luc's function worked well for me after I made a change to support the fact that I have clipboard=unnamed set:

function! RestoreRegister()
    let @" = s:restore_reg
    if &clipboard == "unnamed"
        let @* = s:restore_reg
    endif
    return ''
endfunction

duct-tape programming, but works for me:

nmap viwp viwpyiw
nmap vi'p vi'pyi'
nmap vi"p vi"pyi"
nmap vi(p vi(pyi(
nmap vi[p vi[pyi[
nmap vi<p vi<pyi<

Select the text and paste by P(uppercase).

Example:

viwP

See h: v_P for more infomation.

This is my solution.

vnoremap p p:let @+=@0<CR>

vnoremap P P:let @+=@0<CR>

I find out after paste, the old content is still stored in "0 register. Just restore it to current clipboard by

:let @+=@0

try -

:set guioptions-=a
:set guioptions-=A
Related