web-dev-qa-db-fra.com

Comment coller sans écraser le registre

Quelqu'un connaît-il 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 explicite. Mais c'est une douleur dans le cou de taper "xp au lieu de juste p

102
Starr Horne

"{register}p ne fonctionnera pas comme vous le décrivez. Il remplacera la sélection par le contenu du registre. Vous devrez plutôt 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()

Ce qui devrait être bien tant que vous n'utilisez pas un plugin qui a une vmap non-nore à p, et qui s'attend à ce qu'un registre soit écrasé.

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

29
Luc Hermitte

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

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
37
Jeff Lake

Utilisez le suivant:

xnoremap p pgvy

cela resélectionnera et re-tirera tout texte collé en mode visuel.

Modifier: pour que cela fonctionne avec "xp tu peux faire:

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

v:register se développe jusqu'au dernier nom de registre utilisé dans une commande en mode normal.

28
Benoit

Dans ton .vimrc

xnoremap p "_dP

J'ai trouvé cela à partir d'une réponse sur un fil similaire, mais la source d'origine était http://vim.wikia.com/wiki/Replace_a_Word_with_yanked_text . Il mentionne certains inconvénients, mais cela fonctionne bien pour moi.

16
Jason Denney

La solution de Luc Hermitte fonctionne comme un charme. 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  
6
Taine

Essayez ceci dans votre ~/.vimrc:

xnoremap <expr> p 'pgv"'.v:register.'y'
  • xnoremap signifie que c'est uniquement pour le mode Visual, pas Visual + Select modes.

  • <expr> signifie que {rhs} du xnoremap {lhs} {rhs} le paramètre est évalué comme une expression.

  • Dans ce cas, notre expression de 'pgv"'.v:register.'y' utilise . pour la concaténation.

  • v:register est évalué par rapport au registre utilisé lors de l'exécution du mappage.

Le résultat de "xp serait évalué à pgv"xy, où x est le registre.

J'ai été aidé par une réponse à cette question de stackoverflow: Vim - mappage avec un préfixe de registre facultatif en conjonction avec Benoit la réponse de sur cette page

5
mrak

La fonction de Luc a bien fonctionné pour moi après avoir apporté une modification pour prendre en charge le fait que j'ai clipboard = set sans nom:

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

Luc Hermitte a fait l'affaire! Très bien. Voici sa solution mise dans une fonction de bascule, de sorte que vous pouvez basculer entre le comportement normal et le put sans registre de remplacement.

la commande, u bascule le comportement

let s:putSwap = 1 
function TogglePutSwap()
    if s:putSwap
        vnoremap <silent> <expr> p <sid>Repl()
        let s:putSwap = 0 
        echo 'noreplace put'
    else
        vnoremap <silent> <expr> p p 
        let s:putSwap = 1 
        echo 'replace put'
    endif
    return
endfunction
noremap ,p :call TogglePutSwap()<cr>
2
Joernsn