Come posso annullare solo il testo incollato in vim?


10

TL; DR; versione - Come posso annullare il testo incollato dal mio buffer di copia del sistema operativo senza annullare l'altro testo digitato da quando sono entrato in modalità inserimento?

Descrizione più lunga:

  1. Inserisci qualcosa nel tuo buffer di copia del sistema operativo (ad esempio, evidenzia un po 'di testo e fai Command-csu Mac)
  2. Entra in modalità insert in vim ( i)
  3. Digita qualcosa (ad es. asdf)
  4. Senza uscire dalla modalità di inserimento, incolla dal tuo buffer di copia in vim ( Command-vsu Mac)
  5. Colpire escape
  6. Prova a annullare la pasta ( u)

Annulla tutto dall'ultima volta che sei entrato in modalità inserimento. In altre parole, cancella asdfoltre a tutto il testo che ho incollato.

Come posso semplicemente annullare il testo incollato? Devo sempre uscire dalla modalità di inserimento e rientrare prima di incollare il testo solo per avere l'opzione di annullare il testo incollato?

Risposte:


4

Un modo è uscire e tornare esplicitamente nella modalità di inserimento prima dell'incolla. Se estendi i comandi incolla, puoi anche impostare automaticamente un punto di annullamento prima dell'incolla:

" Any text fragment pasted in insert mode should be undone separately, without
" destroying what was typed before.
inoremap <C-R> <C-G>u<C-R>

Quanto sopra è per il i_CTRL-Rcomando integrato . Non so come Command-vsia implementato in MacVim, ma anteporre <C-G>ual :imapcomando dovrebbe ottenere lo stesso effetto.


1
Funziona come un incantesimo, grazie! Probabilmente dovrei attenermi ai metodi vim standard per incollare comunque.
Javid Jamae,

Aggiungendo semplicemente questo: :h i_CTRL-G_u(ovvero "interrompi sequenza di annullamento, avvia nuove modifiche" in modalità inserimento).
Toraritte,

2

In MacVim, devi annullare la mappatura della Edit > Pastevoce di menu per sovrascrivere il collegamento, quindi puoi rimappare Cmd-V ( D-vin linguaggio MacVim) al comando appropriato in ciascuna modalità. Ho aggiunto questo al mio ~/.gvimrce ora tutto funziona meravigliosamente:

macmenu Edit.Paste key=<nop>
noremap <D-v> "*P
cnoremap <D-v> <C-r><C-o>*
inoremap <D-v> <C-g>u<C-r><C-o>*

L' <C-g>uè necessario solo in modalità di inserimento per fissare la cronologia degli annullamenti; la noremape cnoremapsono semplicemente per ripristinare il comportamento di pasta di default in modalità normale e di comando.

Grazie a Ingo Karkat per avermi indicato la giusta direzione qui.


1

In realtà la soluzione è che devi prima andare in modalità di comando (ad es. Esc) E accedere nuovamente alla modalità di inserimento, ma funziona solo se scrivo manualmente ma sembra "casualmente" smettere di funzionare se lo collaudo ~/.vimrc. Google non aiuta affatto.

Trascorro molto tempo a cercare di risolvere questo problema e ho solo capito il motivo nel mio caso:

Non mappare lo stesso tasto incolla con il tasto incolla esistente del terminale

ad esempio, Ctrl+Shift+Vsi incolla nel mio terminale Konsole, ma se mi assegna questo tasto <C-S-v>nel ~/.vimrc, l ' "annullamento per unico singolo pasta invece di più paste" non funziona.

Nel mio caso, devo usare <C-v>invece di <C-S-v>:

inoremap <C-v> <Esc>"+pi<Esc>i<Right><Right>

Il tuo caso può essere diverso, ma il punto è lo stesso: non assegnare gli stessi conflitti di chiave incolla con la chiave dell'emulatore di terminale esistente.

Ho dimostrato al 100% questa conclusione impostando la chiave del mio terminal paste su Ctrl+Ve ora <C-v>smetto di funzionare ma di <C-S-v>funzionare.

Nota anche che il vim è troppo sensibile e strano. Capisco che devo usare ie poi 2 tasti Destra manualmente per farlo funzionare nella posizione corretta del cursore, questo significa che devo mettere ie anche 2 tasti Destra ~/.vimrc. Il tuo caso potrebbe essere diverso, ma il punto è lo stesso, assicurati che i tasti + ordine in ~ / .vimrc corrispondano al 100% a ciò che digiti manualmente.

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.