Question
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 pénible de taper & "; x p au lieu de juste p
La solution
"{register}p
ne fonctionnera pas comme vous le décrivez. Il remplacera la sélection par le contenu du registre. Au lieu de cela, vous devrez 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 convenir tant que vous n'utilisez pas de plug-in doté d'une vmap non-nore vers p, et qui s'attend à ce qu'un registre soit écrasé.
Ce code est disponible sous forme de script il . Ingo Karkat a également défini un plugin pour résoudre le même problème.
Autres conseils
Je n'aime pas le comportement par défaut de vim consistant à copier tout le texte supprimé avec d
, D
, c
ou C
dans le registre par défaut.
Je l'ai compris en mappant "_d
à "_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 les éléments suivants:
xnoremap p pgvy
Ceci resélectionnera et retranchera tout texte collé en mode visuel.
Modifier: pour que cela fonctionne avec "xp
vous pouvez faire:
xnoremap p pgv"@=v:register.'y'<cr>
v:register
passe au dernier nom de registre utilisé dans une commande en mode normal.
Dans votre .vimrc
xnoremap p "_dP
J'ai trouvé cela grâce à 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 quelques inconvénients, mais cela fonctionne très bien pour moi.
La solution de Luc Hermitte fonctionne à merveille. Je l'utilisais depuis environ une semaine. Ensuite, j'ai découvert une solution à partir de Steve Losh's 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 cela ne concerne que le modeVisual
et non pas lesVisual + Select
modes. -
<expr>
signifie que{rhs}
du paramètrexnoremap {lhs} {rhs}
est évalué en tant qu'expression. -
Dans ce cas, notre expression de
'pgv"'.v:register.'y'
utilise.
pour la concaténation. -
v:register
est évalué pour le registre utilisé pendant l'exécution du mappage.
Le résultat de "xp
serait évalué à pgv"xy
, où x
est le registre.
La réponse à cette question m'a été utile: Vim - mappage avec un préfixe de registre facultatif en conjonction avec la réponse de Benoit 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 presse-papiers = ensemble non nommé:
function! RestoreRegister()
let @" = s:restore_reg
if &clipboard == "unnamed"
let @* = s:restore_reg
endif
return ''
endfunction
Luc Hermitte a fait le tour! Très bien. Voici sa solution dans une fonction à bascule, vous pouvez donc basculer entre un comportement normal et une vente sans 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>
essayer -
:set guioptions-=a
:set guioptions-=A