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

È stato utile?

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 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top