157 votes

Vim: comment coller sans écraser le registre

Est-ce que quelqu'un connaît un moyen de coller sur une zone sélectionnée visuellement sans que la sélection soit placée dans le registre par défaut?

Je sais que je peux résoudre le problème en collant toujours à partir d'un registre expicit. Mais c’est pénible de taper "xp au lieu de p"

55voto

Benoit Points 35553

Utilisez le suivant:

 xnoremap p pgvy
 

cela resélectionnera et retranchera tout texte collé en mode visuel.

Éditer: pour que cela fonctionne avec "xp vous pouvez faire:

 xnoremap p pgv"@=v:register.'y'<cr>
 

v:register s'agrandit jusqu'au dernier nom de registre utilisé dans une commande en mode normal.

49voto

Jeff Lake Points 461

Je n'aime pas le comportement par défaut de vim consistant à copier tout le texte supprimé avec d , D , c ou C dans la valeur par défaut registre.

Je l'ai contourné en mappant d "_d , c "_c , etc.

De mon .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
 

36voto

Luc Hermitte Points 14171

"{register}p ne fonctionne pas comme vous le décrivez. Il va remplacer la sélection par le contenu d'un registre. Vous aurez de la place pour faire quelque chose comme:

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

Qui doit être très bien aussi longtemps que vous n'utilisez pas un plugin qui a un non-nore vmap à p, et qui s'attend à un registre de l'être remplacé.

Ce code est disponible sous forme de script il. Ingo Karkat a également défini un plugin résoudre le même problème.

6voto

Taine Points 41

La solution de Luc Hermitte fonctionne à merveille. Je l'utilisais depuis environ une semaine. Ensuite, j'ai découvert une solution de .vimrc de Steve Losh qui fonctionne bien si YankRing fait partie de votre gamme de plugins / bundles:

 function! YRRunAfterMaps()                                                                                                      
    " From Steve Losh, Preserve the yank post selection/put.    
    vnoremap p :<c-u>YRPaste 'p', 'v'<cr>gv:YRYankRange 'v'<cr> 
endfunction  
 

5voto

danprice Points 186

La fonction de Luc a bien fonctionné pour moi après avoir apporté une modification pour prendre en charge le fait que j'ai presse-papiers = ensemble non nommé:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X