Come incollare senza sovrascrivere il registro


112

Qualcuno conosce un modo per incollare su un'area visivamente selezionata senza che la selezione sia posizionata nel registro predefinito?

So di poter risolvere il problema incollando sempre da un registro esplicito. Ma è un dolore al collo da digitare "xpinvece di solop

Risposte:


33

"{register}pnon funzionerà come descrivi. 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()

Il che dovrebbe andare bene fintanto che non si utilizza un plug-in che ha una vmap non nore in p e che si aspetta che un registro venga sovrascritto.

Questo codice è disponibile come script . Ingo Karkat ha anche definito un plugin che risolve lo stesso problema.


In realtà, pensavo che ci fosse un modo pulito per recuperare il registro usato, ma non riuscivo a ricordare come. Da qui la complessità della funzione.
Luc Hermitte

1
Penso che questo sia eccessivo, non ricorderò il regtype(linewise?) E che la rimappatura p su pgvyè sufficiente.
Benoit

2
Può essere eccessivo, ma non ha effetti collaterali. Su a "xp, questo non sovrascrive i @"contenuti con @xdiversamentepgvy
Luc Hermitte

1
allora che ne dici :xnoremap p pgv@=v:register.'y'<cr>?
Benoit

1
Non funziona per me. Ho anche provato a scaricare lo script. Ecco l'elenco dei comandi che eseguo: prima premo v, poi e per selezionare fino alla fine della parola, quindi y per strattonarla. Dopodiché, vado a una parola diversa che voglio sostituire. Premo v, e poi p per sostituire quello. Poi lo faccio di nuovo, ma questa volta la parola successiva viene sostituita da quella che ho sostituito in precedenza.
Eddy

41

Non mi piace il comportamento di default di vim di copiare tutto il testo cancellato con d, D, co Cnel registro di default.

L'ho aggirato mappando dsu "_d, csu "_ce 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

Per quanto utili siano queste mappature (faccio qualcosa di simile io stesso), non rispondono alla domanda di OP, p sovrascriverà comunque ciò che hai strappato incollando sul contenuto selezionato.
Magnus

32

Utilizza il seguente:

xnoremap p pgvy

questo riselezionerà e strapperà di nuovo qualsiasi testo incollato in modalità visiva.

Modifica: per poter lavorare con "xpquesto 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.


Su a "xp, questo approccio sovrascrive @"con @x.
Luc Hermitte

3
Il tuo suggerimento di xnoremap p pgv"@=v:register.'y'<cr>non ha funzionato per me. Questo, tuttavia, fa:xnoremap <expr> p 'pgv"'.v:register.'y'
mrak

Questo sembra interessante. Potresti aggiungere una riga su cosa gfa? Non l'ho mai visto prima.
LondonRob

4
@LondonRob: gda solo non fa nulla. Fornisce comandi multi-tasto estesi, come z. Ad esempio, gova all'ennesimo byte nel buffer gje gkpassa alla riga visualizzata successiva e precedente (differisce da jkquando le righe sono a capo), gavisualizza le informazioni sul carattere sotto il cursore, gJunisce le righe senza spazio e qui gvripristina l'ultima selezione visiva. Puoi usare :help gv.
Benoit

6
@mark :xnoremap <expr> p 'pgv"'.v:register.'y`>' , ho aggiunto `` ''> `` Per ripristinare la posizione del cursore
rox


6

La soluzione di Luc Hermitte funziona come un fascino. Lo stavo usando da circa una settimana. Poi ho scoperto una soluzione da .vimrc di Steve Losh che funziona bene se YankRing fa parte della tua linea di plugin / 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  

6

Prova questo nel tuo ~/.vimrc:

xnoremap <expr> p 'pgv"'.v:register.'y'
  • xnoremapsignifica che questo è solo per la Visualmodalità, non per le Visual + Selectmodalità.

  • <expr>significa che {rhs}l' xnoremap {lhs} {rhs}impostazione viene valutata come un'espressione.

  • In questo caso, la nostra espressione di 'pgv"'.v:register.'y'sta usando .per la concatenazione.

  • v:register viene valutato al registro in uso durante il completamento della mappatura.

Il risultato di "xprestituirebbe pgv"xy, dov'è xil registro.

Sono stato aiutato da una risposta a questa domanda su stackoverflow : Vim - mapping con un prefisso di registro opzionale insieme alla risposta di Benoit su questa pagina


4

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

1
Per riferimento: usare clipboard=unnamedplusquesto deve essere al @+posto di @*.
Sebastian Blask

2

Luc Hermitte ha fatto il trucco! Veramente buono. Ecco la sua soluzione inserita in una funzione di attivazione / disattivazione, in modo da poter passare dal comportamento normale a quello senza sostituzione del registro.

il comando, u alterna 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>

Puoi anche cambiare s: Repl per restituire "p" invece di "p @ = RestoreRegister () \ <cr>" a seconda del valore di s: putSwap.
Luc Hermitte

1
preferisco silent! vunmapinvece divnoremap <silent> <expr> p p
Luc Hermitte

0

programmazione con nastro adesivo, ma funziona per me:

nmap viwp viwpyiw
nmap vi'p vi'pyi'
nmap vi"p vi"pyi"
nmap vi(p vi(pyi(
nmap vi[p vi[pyi[
nmap vi<p vi<pyi<

-4

provare -

:set guioptions-=a
:set guioptions-=A

3
Quelli controllano se il testo selezionato viene aggiunto agli appunti del sistema a finestre (ad esempio, X11 o Win32), non ai registri di copia interni di Vim.
Rob Kennedy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.