Come incollare senza sovrascrivere il registro
Domanda
Qualcuno conosce un modo per incollare su un'area visivamente selezionata senza che la selezione sia inserita nel registro predefinito?
So di poter risolvere il problema incollando sempre da un registro esplicito. Ma è un dolore al collo digitare "x p invece di solo p
Soluzione
"{register}p
non funzionerà come descritto. Sostituirà la selezione con il contenuto del registro. Dovrai invece fare qualcosa del tipo:
" 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()
Che dovrebbe andare bene finché non si utilizza un plugin che ha una vmap non nore su p e che si aspetta che un registro venga sovrascritto.
Questo codice è disponibile come script ci . Ingo Karkat ha anche definito un plugin risolvendo lo stesso problema.
Altri suggerimenti
Non mi piace il comportamento vim predefinito di copiare tutto il testo eliminato con d
, D
, c
o C
nel registro predefinito.
L'ho aggirato mappando "_d
su "_c
, <=> su <=> e così via.
Dal mio .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
Utilizzare quanto segue:
xnoremap p pgvy
questo riselezionerà e riscriverà qualsiasi testo incollato in modalità visiva.
Modifica: per farlo funzionare con "xp
puoi fare:
xnoremap p pgv"@=v:register.'y'<cr>
v:register
si espande all'ultimo nome di registro utilizzato in un comando in modalità normale.
Nel tuo .vimrc
xnoremap p "_dP
L'ho trovato da una risposta su un thread simile, ma la fonte originale era http: // vim. wikia.com/wiki/Replace_a_word_with_yanked_text . Menziona alcuni inconvenienti, tuttavia funziona bene per me.
La soluzione di Luc Hermitte funziona come un fascino. Lo stavo usando da circa una settimana. Poi ho scoperto una soluzione da Steve Losh'slyvrcc> se YankRing fa parte della tua gamma di plug-in / bundle:
function! YRRunAfterMaps()
" From Steve Losh, Preserve the yank post selection/put.
vnoremap p :<c-u>YRPaste 'p', 'v'<cr>gv:YRYankRange 'v'<cr>
endfunction
Prova questo nel tuo ~/.vimrc
:
xnoremap <expr> p 'pgv"'.v:register.'y'
-
xnoremap
significa che questo è solo per la modalitàVisual
, non perVisual + Select
. -
<expr>
significa che{rhs}
dell'impostazionexnoremap {lhs} {rhs}
viene valutata come espressione. -
In questo caso, la nostra espressione di
'pgv"'.v:register.'y'
sta usando.
per la concatenazione. -
v:register
viene valutato nel registro utilizzato durante l'esecuzione della mappatura.
Il risultato di "xp
verrebbe valutato su pgv"xy
, dove x
è il registro.
Sono stato aiutato da una risposta a questa domanda stackoverflow: Vim: mappatura con un prefisso di registro opzionale unitamente alla risposta di Benoit in questa pagina
La funzione di Luc ha funzionato bene per me dopo aver apportato una modifica per supportare il fatto che ho appunti = set senza nome:
function! RestoreRegister()
let @" = s:restore_reg
if &clipboard == "unnamed"
let @* = s:restore_reg
endif
return ''
endfunction
Luc Hermitte ha fatto il trucco! Veramente buono. Ecco la sua soluzione messa in una funzione di attivazione / disattivazione, in modo da poter passare dal comportamento normale al put senza sostituzione.
il comando, commuta il comportamento
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>
prova -
:set guioptions-=a
:set guioptions-=A