Puis-je annuler plusieurs fois dans nvi et / ou le vi original?

13

Parfois, je suis sur un système sans Vim et j'utilise le système par défaut nvi(systèmes BSD) ou l'original vi(Arch Linux).

Il y a quelques différences, mais le plus gros ennui est que je ne peux annuler que ma dernière opération. En appuyant sur ula deuxième fois, les travaux sont un "refaire".

Existe-t-il un moyen de faire fonctionner cela?

Martin Tournoij
la source

Réponses:

16

De nvi(1):

 u       Undo the last change made to the file.  If repeated, the u command
         alternates between these two states.  The . command, when used
         immediately after u, causes the change log to be rolled forward or
         backward, depending on the action of the u command.

Appuyez donc sur u, puis continuez d'appuyer .pour annuler; Si vous appuyez à unouveau, il "inversera" la direction et appuyez sur .sera une reprise.

Je n'ai jamais su cela jusqu'à hier; et pensait que c'était en quelque sorte une nouvelle fonctionnalité, mais il semble que cela fonctionne comme ça depuis au moins nvi 1.79 à partir de 1996 .

Cela ne fonctionne pas dans le vi d'origine ; où l'annulation est documentée comme:

   u      Undoes the last change made to the current buffer.  If repeated,
          will alternate  between  these  two  states,  thus  is  its  own
          inverse.  When  used after an insert which inserted text on more
          than one line, the lines are saved in the numeric named  buffers
          (3.5).

Ce qui est vraiment une façon compliquée de dire qu'appuyer à unouveau va refaire vos modifications.

C'est aussi ce que :help undodit Vim (et pourquoi j'ai supposé que cela ne fonctionnerait pas non plus nvi):

 u                       Undo [count] changes.  {Vi: only one level}
Martin Tournoij
la source
1

La chose la plus proche que l'original vidoit annuler plusieurs (à part Ucela peut annuler plusieurs modifications sur une seule ligne) est les registres numérotés, qui contiennent les neuf modifications ou suppressions les plus récentes.

Si vous placez à partir d'un registre numéroté, les commandes de points suivantes incrémenteront ce registre lors de la répétition de la commande.

Par exemple avec le texte suivant, avec la ligne de curseur indiquée par >,

  aaaa
> bbbb
  cccc
  dddd
  eeee

la commande dd..entraînera:

  aaaa
> eeee

Si vous tapez ensuite "1P, vi mettra la suppression la plus récente du registre "1:

  aaaa
> dddd
  eeee

Frapper .mettra le contenu du prochain registre le plus récent, en faisant "2P, et frapper à .nouveau mettra le contenu du registre "3.

Donc, en bref, "P..remettra tout le texte que vous avez supprimé, vous laissant avec

  aaaa
> bbbb
  cccc
  dddd
  eeee

Pas génial, mais mieux que rien! Plus utilement, vous pouvez l'utiliser au début ou à la fin de la mémoire tampon pour inspecter rapidement le contenu de vos registres numérotés. Ensuite, vous pouvez facilement supprimer ce dont vous n'avez pas besoin.

C'est documenté dans vim sous :help redo-register.

Antony
la source
-1

En utilisant le vi d'origine, appuyez sur [n] u pour revenir en arrière de n étapes. Revenir progressivement étape par étape ...

  • appuyez sur [n] u pour revenir en arrière n étapes
  • puis appuyez sur [n] u pour refaire n étapes
  • puis appuyez sur [n + 1] u pour revenir en arrière [n + 1] étapes
  • etc
Adam Milling
la source
1
J'ai quelque chose de proche du vi original , et il ne semble pas remonter de n étapes.
muru
D'accord. Le Vi d'origine ne peut rétablir qu'une seule modification avec uou restaurer une seule ligne telle qu'elle était avant de commencer à la modifier U.
Antony