Comment puis-je refaire (c.-à-d. «Annuler annuler») dans Vim?

697

À Vim, j'en ai trop fait. Comment annuler cela (c'est-à-dire, refaire)?

fil volant
la source
106
comme j'ai déjà recueilli 2 votes serrés, je pense que cela appartient ici car vim est l'éditeur d'un programmeur.
flybywire
28
Je suis d'accord, c'est lié à la programmation et c'est une vraie question.
DigitalRoss
41
Quelqu'un ici fait le tour et marque chaque question de Vim comme "appartient à SU" malgré que la communauté ait depuis longtemps décidé que Vim appartient à SO, c'est un outil de programmation.
Brian Carper,
@Brian: Avez-vous un lien vers le document où ce consensus a été atteint?
trop de php
12
meta.stackexchange.com/questions/20251/… mais je me souviens que cela est arrivé l'année dernière quelque temps. Vim / Emacs sont des IDE. De plus, les langages utilisés dans les fichiers de configuration pour les deux sont des langages de script complets de Turing, donc l'acte de configurer Vim est lui-même une programmation pour commencer.
Brian Carper,

Réponses:

907

Ctrl+r

John Millikin
la source
2
Je voudrais juste lancer le plugin undoTree, super génial pour les moments où vous vous êtes apparemment vissé avec une rafale d'annulations et de rétablissements.
Jake Sellers
3
Si je lis sur vi, mes doigts agissent d'eux-mêmes. Les commandes vi ne fonctionnent pas sur stackoverflow. :-)
ciscogambo
2
Remarque pour les utilisateurs de Mac: Ctrl + r dans un terminal Mac gâchera votre journée dans vim. Je ne connais pas la combinaison de touches appropriée dans le terminal Mac à annuler, mais ce n'est certainement PAS Ctrl + r!
tpartee
@tpartee Je viens d'utiliser Ctrl + r dans vim sous l'application Terminal de macOS - aucun problème ici.
Jase
3
Peut-être que @tpartee signifiait tout gâcher Cmd + r? Cela fait certainement quelque chose de bizarre; mais Ctrl + rça a bien fonctionné pour moi (Mac + tmux + vim)
dwanderson
133

Consultez également :undolist, qui offre plusieurs chemins à travers l'historique d'annulation. Ceci est utile si vous tapez accidentellement quelque chose après avoir trop annulé.

Peter
la source
22
@amindfv: prenez le nombre :undolistet tapez :undo 178(disons) pour revenir en arrière à l'étape 178.
Peter
existe-t-il un moyen de montrer exactement ce qui sera annulé :undolist?
csharpfolk
2
@csharpfolk Utilisez le plugin undotree ( github.com/mbbill/undotree )
54

Utilisez :earlier/ :later. Pour refaire tout ce que vous avez juste à faire

later 9999999d

( en supposant que vous devez d' abord modifié le fichier au plus il y a 9999999 jours), ou, si vous vous rappelez la différence entre l' état actuel et undo un besoin, l' utilisation Nh, Nmou Nspendant des heures, minutes et secondes respectivement. + :later N<CR><=> Ng+et :later Nfpour les écritures de fichiers.

ZyX
la source
1
:latertravaillé pour moi dans vi(pas vim - recherché "vi" sur google mais tous les résultats sont pour "vim"), merci!
Luc
@Luc Presque partout où vous avez une vicommande, il s'agit d'un lien symbolique vers un exécutable vim ou une copie de celui-ci. Pas complètement partout cependant.
ZyX
@ZyX Je souhaite que ce soit vrai. Je n'utilise vi qu'après bash lance a vim: command not found. La prochaine chose que je fais est alias vim=viparce que je le tape si automatiquement, mais c'est quand même le vi vieux. De plus, refaire (ctrl + r) aurait fonctionné correctement si vi avait été un alias pour vim.
Luc
2
9999999d remonte à 27395 ans. Je suppose que la fonction d'annulation n'a pas été implémentée dans vi à l'époque. Vous voudrez peut-être vous épargner des efforts de frappe exhaustifs et utiliser un nombre raisonnable. 9999d correspond à environ 27 ans, 999d à 2,7 ans. Je suppose que dans la plupart des cas, cela suffit ...
ChristophK
45

Documentation Vim

<Undo>      or                  *undo* *<Undo>* *u*
u           Undo [count] changes.  {Vi: only one level}

                            *:u* *:un* *:undo*
:u[ndo]         Undo one change.  {Vi: only one level}

                            *CTRL-R*
CTRL-R          Redo [count] changes which were undone.  {Vi: redraw screen}

                            *:red* *:redo* *redo*
:red[o]         Redo one change which was undone.  {Vi: no redo}

                            *U*
U           Undo all latest changes on one line.  {Vi: while not
            moved off of it}
geowa4
la source
30

En mode commande, utilisez la Utouche pour annuler et Ctrl+ rpour rétablir. Jetez un œil à http://www.vim.org/htmldoc/undo.html .

Xinus
la source
Et en mode insertion?
YuFeng Shen
1
@YuFengShen la puissance de vim est en mode commande. nous n'avons pas besoin de refaire en mode insertion
Tomas Hrubovcak
Le lien est (effectivement) rompu.
Peter Mortensen
14

Appuyez d'abord sur la Esctouche pour quitter le mode édition.

Alors,

Pour annuler , utilisez la utouche autant de fois que vous souhaitez annuler.

Pour refaire , utilisez la touche Ctrl+r

Amol Udage
la source
11

Reportez-vous à la partie "annuler" et "rétablir" du document Vim .

: red [o] (Rétablir un changement qui a été annulé) et {count} Ctrl+ r(Rétablir {count} changements qui ont été annulés) sont tous deux corrects.

De plus, le : {count} plus tôt (passer à un état de texte plus ancien {count} fois) pourrait toujours être un substitut pour annuler et refaire.

wangxinalex
la source
5

CTRL+r

Le "r" est en minuscule.

mimetnet
la source
9
En fait, cela ne devrait pas avoir d'importance - les consoles traditionnelles n'ont pas de distinction entre ^ret ^R, et Vim suit cela.
éphémère
@ephemient: d'accord. Dans MS-DOS, vous ne pouvez même pas taper un minuscule ^X(où Xpeut être n'importe quelle lettre).
nyuszika7h
Dans Vim, Ctrl-shift-R (ctrl avec R majuscule) est le mode de remplacement.
Paul Stelian
5

Vous utilisez VsVim pour Visual Studio?

Je suis tombé sur ce problème lors de l'expérimentation de VsVim, qui fournit des liaisons pour les commandes Vim dans Visual Studio .

Je sais Ctrlrdans Vim lui-même, mais cette liaison particulière ne fonctionne pas dans VsVim (du moins pas dans ma configuration?).

Ce qui fonctionne cependant, c'est la commande :red. C'est un peu plus compliqué que ce qui précède, mais c'est toujours bien quand vous en avez vraiment besoin.

Kjartan
la source
Voté parce que la question concerne spécifiquement vim, pas Visual Studio.
John Von Neumann
3
@JohnVonNeumann Ceci est lié à Vim, ou du moins aux liaisons Vim, juste dans le contexte de VS. C’est ce qui m’a amené à cette question, après tout. Punir quelqu'un pour avoir ajouté un peu plus d'informations semble un peu dur et inutile, ne pensez-vous pas, même si cela s'étend peut-être légèrement au-delà de la portée du PO?
Kjartan
2

En pratique, le :undolistest difficile à utiliser et Vim :earlieret le :latersuivi temporel des modifications ne sont utilisables que pour les corrections de grain de cours.

Compte tenu de cela, j'ai recours à un plug-in qui combine ces fonctionnalités pour fournir une arborescence visuelle d'annulations navigables, appelée «Gundo».

Évidemment, c'est quelque chose à utiliser uniquement lorsque vous avez besoin d'une correction à grain fin, ou si vous n'êtes pas sûr de l'état exact du document que vous souhaitez retourner. Voir: Gundo. Représentez graphiquement votre arbre d'annulation Vim avec style

grégorie
la source