Czy mogę cofnąć wiele razy w nvi i / lub oryginalnym vi?

13

Czasami korzystam z systemu bez Vima i używam domyślnego nvi(systemy BSD) lub oryginalnego vi(Arch Linux).

Jest całkiem sporo różnic, ale największą irytacją jest to, że mogę cofnąć tylko ostatnią operację. Naciśnięcie udrugiego dzieła to „ponowienie”.

Czy jest jakiś sposób, żeby to zadziałało?

Martin Tournoij
źródło

Odpowiedzi:

16

Od 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.

Naciśnij więc u, a następnie naciskaj, .aby cofnąć; Jeśli naciśniesz uponownie, nastąpi „zmiana kierunku”, a naciśnięcie .spowoduje ponowienie.

Nigdy o tym nie wiedziałem do wczoraj; i pomyślałem, że to jakaś nowa funkcja, ale wygląda na to, że działała w ten sposób od co najmniej nvi 1.79 z 1996 roku .

To nie działa w oryginalnym vi ; gdzie cofnięcie jest udokumentowane jako:

   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).

Co jest naprawdę skomplikowanym sposobem powiedzenia, że uponowne naciśnięcie spowoduje ponowne wprowadzenie zmian.

Tak też mówi Vim :help undo(i dlaczego założyłem, że to też nie zadziała nvi):

 u                       Undo [count] changes.  {Vi: only one level}
Martin Tournoij
źródło
1

Najbliższą rzeczą, którą vimusi cofnąć wielokrotność oryginału (poza Utym może cofnąć wiele zmian w obrębie jednej linii), są numerowane rejestry, które zawierają dziewięć ostatnich zmian lub usunięć.

Jeśli wstawisz z rejestru numerowanego, kolejne polecenia kropkowe zwiększą rejestr, gdy powtórzy polecenie.

Np. Z następującym tekstem i linią kursora oznaczoną >,

  aaaa
> bbbb
  cccc
  dddd
  eeee

polecenie dd..spowoduje:

  aaaa
> eeee

Jeśli następnie wpiszesz "1P, vi spowoduje ostatnie usunięcie z rejestru "1:

  aaaa
> dddd
  eeee

Uderzenie .spowoduje umieszczenie zawartości następnego najnowszego rejestru poprzez wykonanie "2P, a .ponowne naciśnięcie spowoduje umieszczenie zawartości rejestru "3.

Krótko mówiąc, "P..odłoży cały usunięty tekst, pozostawiając cię

  aaaa
> bbbb
  cccc
  dddd
  eeee

Nie genialne, ale lepsze niż nic! Bardziej użyteczne jest użycie go na początku lub na końcu bufora, aby szybko sprawdzić, co znajduje się w twoich numerowanych rejestrach. Następnie możesz łatwo usunąć to, czego nie potrzebujesz.

Jest to udokumentowane w vimie pod :help redo-register.

Antony
źródło
-1

Używając oryginalnego vi, naciśnij [n] u, aby cofnąć się o krok. Aby stopniowo cofać się krok po kroku ...

  • naciśnij [n] u, aby cofnąć się o krok
  • następnie naciśnij [n] u, aby powtórzyć kroki
  • następnie naciśnij [n + 1] u, aby cofnąć się o [n + 1] kroki
  • itp
Adam Milling
źródło
1
Mam coś zbliżonego do oryginalnego vi i wydaje się, że nie cofnie się o krok.
mur 18.04.16
Zgoda. Original Vi może przywrócić tylko jedną zmianę za pomocą ulub przywrócić jedną linię do stanu sprzed rozpoczęcia edycji U.
Antony