W jaki sposób vim określa rozmiar pojedynczej „edycji” przy użyciu „u” i „CTL-R”?

17

Podczas używania ulub CTL-Rcofania lub ponownej edycji w vimie wydaje mi się, że zmieniam fragmenty tekstu, a nie tylko ostatnie naciśnięcie klawisza.

Co decyduje o wielkości fragmentu uważanego za pojedynczą edycję?

DQdlM
źródło

Odpowiedzi:

19

Szukasz definicji undo-blocks.

Od :h undo-blocks:

Jedno polecenie cofnięcia zwykle cofa wpisane polecenie, bez względu na liczbę zmian wprowadzonych przez to polecenie. Ta sekwencja cofających się zmian tworzy blok cofania. Zatem jeśli wpisane klawisze wywołują funkcję, wszystkie polecenia w funkcji zostaną cofnięte razem.

Ten sam blok jest używany do redo. Od :h redo:

Ostatnie zmiany zostają zapamiętane. Możesz użyć powyższych poleceń cofania i ponawiania, aby przywrócić tekst do stanu sprzed każdej zmiany. Możesz także zastosować zmiany ponownie, odzyskując tekst przed cofnięciem.

vappolinario
źródło
4
Możesz także ręcznie rozdzielić pojedyncze cofnięcie bloku za pomocą polecenia CTRL-G uw trybie wstawiania, co jest przydatne, jeśli masz makra trybu wstawiania.
fruglemonkey
8

Modalne edycji Vim jest często postrzegana jako operator (np c, d...) stosuje się do ruchu (np iw, w, }, ...). Jako cudowny produkt uboczny Vim dostaje masywne cofnięcia. Tam, gdzie inni redaktorzy muszą zgadywać, aby przekształcić wiele małych cofnięć w bloki cofania, Vim robi to naturalnie. Innym efektem ubocznym jest to, że daje operator powtarzania .(inaczej polecenie kropki).

Twoje pytanie konkretnie dotyczy naciśnięć klawiszy, więc zakładam, że chcesz wiedzieć, jak cofać małe zmiany w trybie wstawiania. Odpowiedź brzmi: nie jest to „droga Vima”. „The Vim Way” oznacza, że ​​będziesz w trybie wstawiania dla krótkich serii na raz. Oznacza to, że gdy popełniane są błędy w trybie wstawiania, często po prostu wychodzisz do trybu normalnego i poprawiasz tekst lub po prostu cofasz ui przepisujesz tekst.

Czasami konieczne jest podzielenie bloku cofania w trybie wstawiania. Można tego dokonać <c-g>uw trybie wstawiania. Zobacz :h :undoji :h undo-blockswięcej informacji.

Aby uzyskać dalszą pomoc, sugeruję:

:h undo-blocks
:h :undoj
:h undo-tree
:h persistent-undo
:h undo.txt

Istnieją również screencasty na ten temat:

Peter Rincker
źródło
„Chunky undo” - najlepszy opis, jaki widziałem.
Matt Parker,
6

Możesz myśleć o tym również w ten sposób: za każdym razem, gdy przejdziesz do trybu wstawiania, aby edytować tekst i naciśniesz Esc, utworzy to blok. Jeśli spróbujesz cofnąć ten blok, przejdziesz do tej samej pozycji przed przejściem do trybu wstawiania.

Dlatego możesz „zapisać” swoje zmiany po prostu od czasu do czasu wychodząc z trybu wstawiania: powiedzmy, że idziesz do trybu wstawiania i piszesz funkcję. Możesz kontynuować kodowanie i przejść do następnej funkcji, jednak czasem lepiej jest wrócić do normalnego trybu i ponownie przejść do trybu wstawiania. W ten sposób możesz skonstruować swój kod w prosty sposób, a jeśli musisz wrócić, możesz wiedzieć, w jakiej pozycji skończysz.

Uwaga: jeśli używasz strzałek do poruszania się, to tak jakbyś nacisnął Esc+ [ hjkl]

Wylex
źródło