Posso fare in modo che Vim salvi anche le "piccole eliminazioni" nel registro "1?


14

Di recente ho rimosso il plug-in YankRing dalla mia installazione in parte perché stava causando alcuni problemi con le macro, ma soprattutto perché ho deciso che sarebbe meglio allenarmi a usare invece i registri di Vim - in particolare, il modo in cui il testo eliminato è archiviato inizialmente nel registro "1e poi spostato attraverso "2, "3ecc come ulteriori delezioni sono fatti è molto utile.

Tuttavia, quando una cancellazione / modifica rimuove meno di una riga di testo, viene invece memorizzata nel "-piccolo registro di eliminazione (con alcune eccezioni per alcuni comandi di spostamento). Se vengono effettuate piccole eliminazioni successive, quel pezzo di testo viene perso.

È possibile ottenere Vim per memorizzare tutte le eliminazioni nel registro "1?

nnoremap d "1d quasi funziona, ma si finisce con il testo in entrambi i registri "1 e "2 .

Non mi importa se la funzionalità del piccolo registro di cancellazione è influenzata o meno. Suggerire di cambiare il mio comportamento per salvare piccole cancellazioni in un registro con nome non sarebbe sicuramente una risposta utile - è quello che sto facendo attualmente.

Risposte:


10

Questo funzionava nelle versioni precedenti di Vim 7.3 quando :set clipboard=unnamed(vedi questa discussione su Reddit , a seguito di un bug, che ho riportato qui .

Quel thread contiene una patch di Aryeh Leib Taurog che introduce 'regone'un'opzione. Questo è entrato nella lista delle cose da fare (troppo lunga), ma è improbabile che venga presto incorporato. Quindi, al momento hai solo la possibilità di eseguire il downgrade a un Vim obsoleto o di creare Vim tu stesso con quella patch (e spingerlo per l'adozione nella mailing list di vim_dev ).


1
Interessante! (Soprattutto la tua idea sulla soglia.) Grazie per le informazioni. Devo resistere al voto / accettare per il momento nel tentativo di incoraggiare qualcuno a inventare qualche pazzo VimScript per farlo nel frattempo.
Rich

5

Ho una soluzione a prova di concetto che funziona per il dcomando con movimenti e in modalità visiva. Non è ancora una soluzione completamente solida (ad esempio, d[count]dnon funziona , e nemmeno funziona [count]D), ma copre quasi tutti i miei casi d'uso reali.

Funziona impostando una funzione operatore cliente che:

  1. memorizza i contenuti dei registri 1–8 in un dizionario,
  2. esegue la cancellazione nel registro 1,
  3. imposta i registri da 2 a 9 sui contenuti precedentemente salvati dei registri da 1 a 8.

Vedere :help map-operatorper una spiegazione di come funzionano le funzioni dell'operatore.

function! ShiftingDeleteOperator(type)
  let reg_dict = {}
  for k in range(1, 8)
    execute printf("let reg_dict[%d]=getreg('%d', 1)", k, k)
  endfor

  if a:type ==# 'v'
    execute 'normal! `<v`>d'
  elseif a:type ==# 'V'
    execute 'normal! `<V`>d'
  elseif a:type ==# "\<C-V>"
    execute "normal! `<\<C-V>`>d"
  elseif a:type ==# 'char'
    execute 'normal! `[v`]d'
  elseif a:type ==# 'line'
    execute "normal! '[V']d"
  else
    return
  endif

  let deleted = getreg('"', 1)
  call setreg(1, deleted)

  for [k, v] in items(reg_dict)
    execute printf("call setreg(%d, v)", k + 1)
  endfor
endfunction

" Call the function for d{motion} via operatorfunc
nnoremap <silent> d :set operatorfunc=ShiftingDeleteOperator<CR>g@
" Call the function when d or x are hit in visual mode
vnoremap d :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
vnoremap x :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
" Use the d{motion} as defined above to add limited support for `D` command
nmap D d$
" Use the standard dd command
nnoremap dd dd 

Ci scusiamo per il commento su una vecchia risposta. Ho adottato questa soluzione per ye cma per il cmio nvim non entra in modalità insert dopo l'azione ... Attualmente devo farlo execute le startinsertche non è una soluzione corretta (come c$metterebbe il cursore nella posizione sbagliata). Qualche idea?
Sunny Pun,

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.