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
"{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 là . Ingo Karkat a également défini un plugin résolvant le même problème.
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
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.
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.
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
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
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
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>