Comment annuler uniquement le texte collé dans vim?


10

TL; DR; version - Comment puis-je annuler du texte qui a été collé à partir de mon tampon de copie du système d'exploitation sans annuler un autre texte qui a été tapé depuis que je suis passé en mode insertion?

Description plus longue:

  1. Mettez quelque chose dans votre tampon de copie du système d'exploitation (par exemple, mettez du texte en surbrillance et faites-le Command-csur Mac)
  2. Passez en mode insertion dans vim ( i)
  3. Tapez quelque chose (par exemple asdf)
  4. Sans quitter le mode d'insertion, collez depuis votre tampon de copie dans vim ( Command-vsur Mac)
  5. Frappé escape
  6. Essayez d'annuler la pâte ( u)

Il annule tout depuis la dernière fois que vous êtes passé en mode insertion. En d'autres termes, il efface asdfplus tout le texte que j'ai collé.

Comment puis-je simplement défaire le texte qui collé dans? Dois-je toujours quitter le mode d'insertion et revenir avant de coller du texte juste pour avoir la possibilité d'annuler le texte collé?

Réponses:


4

Une façon consiste à abandonner explicitement et à revenir en mode d'insertion avant le collage. Si vous étendez les commandes de collage, vous pouvez également définir automatiquement un point d'annulation avant le collage:

" 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>

Ce qui précède concerne la i_CTRL-Rcommande intégrée . Je ne sais pas comment Command-vest implémenté dans MacVim, mais l'ajout <C-G>uà la :imapcommande devrait produire le même effet.


1
Fonctionne comme un charme, merci! Je devrais probablement m'en tenir aux méthodes standard de vim pour coller de toute façon.
Javid Jamae

Il suffit d'ajouter ceci: :h i_CTRL-G_u(c'est-à-dire "interrompre la séquence d'annulation, commencer une nouvelle modification" en mode insertion).
toraritte

2

Dans MacVim, vous devez démapper l' Edit > Pasteélément de menu afin de remplacer le raccourci, puis vous pouvez remapper Cmd-V ( D-vdans le langage MacVim) à la commande appropriée dans chaque mode. J'ai ajouté ceci à mon ~/.gvimrcet maintenant tout fonctionne à merveille:

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>*

Le <C-g>un'est nécessaire qu'en mode insertion pour corriger l'historique d'annulation; la noremapet cnoremapsont tout simplement de restaurer le comportement coller par défaut dans les modes normal et commande.

Merci à Ingo Karkat de m'avoir indiqué la bonne direction ici.


1

En fait, la solution est que vous devez d'abord passer en mode commande (par exemple Esc) et entrer à nouveau en mode insertion, mais cela ne fonctionne que si je tape manuellement mais il semble "au hasard" cesser de fonctionner si je le teste ~/.vimrc. Google n'aide pas du tout.

Je passe beaucoup de temps à essayer de résoudre ce problème et je viens de comprendre la raison dans mon cas:

Ne mappez pas la clé de collage de la même manière que la clé de collage existante du terminal

par exemple , Ctrl+Shift+Vva coller dans mon terminal Konsole, mais si j'attribue cette clé <C-S-v>dans ~/.vimrcla « undo seulement pâte unique au lieu de plusieurs pâtes » ne sera pas de travail.

Dans mon cas, je dois utiliser <C-v>au lieu de <C-S-v>:

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

Votre cas peut différer, mais le point est le même: n'affectez pas les mêmes conflits de clé de collage avec la clé d'émulateur de terminal existante.

J'ai 100% prouvé cette conclusion en définissant ma clé de collage de terminal sur Ctrl+Vet maintenant <C-v>arrêter de travailler mais de <C-S-v>travailler.

Notez également que le vim est trop sensible et étrange. Je me rends compte que je dois utiliser iet ensuite 2 touches Droite manuellement pour le faire fonctionner dans la position correcte du curseur, cela signifie que je dois mettre iet 2 touches Droite dans le ~/.vimrctrop. Votre cas peut différer, mais le point est le même, assurez-vous que les clés + ordre dans ~ / .vimrc correspondent à 100% à ce que vous tapez manuellement.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.