Ibland är jag på ett system utan Vim och använder standard nvi
(BSD-system) eller original vi
(Arch Linux).
Det finns en hel del skillnader, men den största irritationen är att jag kan ångra bara min senaste operationen. Att trycka på u andra gången fungerar är en ”gör om”.
Finns det något sätt att få det att fungera?
Svar
Från 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.
Så tryck på u och tryck sedan på . för mer ångra; Om du trycker på u igen, det kommer att ”vända” riktning och trycka på . kommer att göras om.
Jag visste aldrig om detta förrän igår, och trodde att det på något sätt var en ny funktion, men det verkar som att det har fungerat så här sedan åtminstone nvi 1.79 från 1996 .
Detta fungerar inte arbeta i original vi ; där ångringen är dokumenterad som:
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).
Vilket är verkligen ett komplicerat sätt att säga att att trycka på u igen gör dina ändringar om.
Vilket är också vad Vim ”s :help undo
säger (och varför jag antog att det inte skulle fungera i nvi
):
u Undo [count] changes. {Vi: only one level}
Svar
Det närmaste som originalet vi
måste ångra flera gånger (förutom U
som kan återställa flera ändringar inom en rad) är de numrerade registren, som innehåller de nio senaste ändringarna eller raderingar.
Om du lägger från ett numrerat register kommer efterföljande punktkommandon att öka det registret när det upprepar kommandot.
t.ex. med följande text, med markörraden angiven med >
,
aaaa > bbbb cccc dddd eeee
kommandot dd..
kommer att resultera i:
aaaa > eeee
Om du sedan skriver "1P
, kommer vi att sätta senaste raderingen från registret "1
:
aaaa > dddd eeee
Slår .
lägger till innehållet i nästa senaste register, genom att göra "2P
och trycker på .
igen kommer innehållet i registret "3
.
Så kort sagt, "P..
kommer att lägga tillbaka all text du raderat och lämna dig med
aaaa > bbbb cccc dddd eeee
Inte lysande, men bättre än ingenting! Mer användbart är att du kan använda den i början eller slutet av bufferten för att snabbt inspektera vad som finns i dina numrerade register. Sedan kan du enkelt radera det du inte behöver.
Det dokumenteras i vim under :help redo-register
.
Svar
Tryck på [n] med original vi u för att gå tillbaka n steg. För att stegvis gå tillbaka steg för steg …
- tryck [n] u för att gå tillbaka steg steg
- tryck sedan på [n] u att göra om steg
- tryck sedan på [n + 1] u för att gå tillbaka [n + 1] steg
- etc
u
, eller återställa en enda rad till hur den var innan du började redigera den medU
.