Od jakiegoś czasu korzystam z funkcji nieofile w Vimie. To bardzo miła funkcja.
Jednak jedną irytacją jest to, że bardzo łatwo jest przypadkowo cofnąć zmiany, które zrobiłem przy ostatnim otwarciu pliku; co może być 2 minuty temu, godzinę temu, w zeszłym tygodniu lub miesiąc temu.
Załóżmy na przykład, że otwieram plik, wprowadzam kilka zmian, idę i zmieniam inne pliki, i odkrywam, że moje zmiany nie były wymagane, a może były to tylko tymczasowe instrukcje debugowania.
Wcześniej mogłem przytrzymać uklawisz, dopóki Vim nie powie „Już przy najstarszej zmianie” :wq
i gotowe. Ale teraz muszę bardzo uważać, aby nie cofnąć zmian, które zrobiłem przy ostatnim otwarciu pliku. Nie ma oczywistego sposobu, aby zobaczyć, kiedy to robisz.
Czy jest jakiś sposób, aby uczynić to bardziej wyraźnym? Na przykład pokazując go gdzieś, wydając ostrzeżenie lub nawet prosząc o potwierdzenie.
źródło
Odpowiedzi:
Miałem dokładnie ten problem. Oto, co dodałem do mojego vimrc, aby to naprawić:
Pamiętaj, że nie ustawiasz
undofile
opcji; musisz go usunąć z vimrc, jeśli go posiadasz.Cofnij działa teraz jako „normalne”. Ale nie ręcznie zapisu pliku cofania z
wundo
polecenia wBufWritePost
.ReadUndo()
Funkcja ręcznego odczytuje plik cofania sięrundo
i ustawiaundofile
opcję. Teraz możemy użyć, uaby wrócić do historii. Odwzorowałem to na<Leader>u
.To może być prawdopodobnie lepsze. Zastępuje poprzednie informacje o cofnięciu, więc nie możesz wrócić do poprzedniej poprzedniej edycji pliku. Ale sam tego nie potrzebowałem.
źródło
Oooch, ooh, wreszcie szansa, aby pokazać to fajne polecenie!
Vim może „cofnąć się w czasie”. Ma
:earlier
polecenie ...... co może przywrócić plik do poprzedniego stanu. Można to wykorzystać na wiele sposobów.
Jeśli potrafisz oszacować, ile czasu zajęło ci wprowadzenie tych zmian, możesz podać czas na to polecenie. Lub na przykład, jeśli wiesz, że nie zmieniłeś pliku (z wyjątkiem zmian, które chcesz cofnąć) w poprzednim dniu, możesz użyć
Jeśli plik został zapisany (zapisany) tylko raz od czasu zmian, które chcesz cofnąć lub w ogóle nie zapisałeś pliku, możesz użyć
Jak opisano w
:help
tekście, plik zostanie przywrócony do poprzednio zapisanej wersji, jeśli właśnie napisałeś plik, lub przywróci ostatni raz, gdy został zapisany, jeśli nie masz żadnych zapisanych zmian.To nie odpowiada dokładnie na twoje pytanie, ale brzmi jak problem XY.
źródło
u
i przypadkowo mijam zmiany, które wprowadziłem teraz ... Nie jestem pewien, jaki mógł być oryginalny „problem X”?:earlier
tak przy okazji, ale wciąż muszę zgadywać ; tak jak muszę zgadywać podczas korzystania zu
... W niektórych przypadkach jest to prawdopodobnie trochę lepsze, ale wolałbym coś bardziej wyraźnego (jeśli to możliwe).:ea 5d
. Możesz również użyć tego:ea 1f
podejścia. W każdym razie jest znacznie mniej szczegółowy.Aktualizacja 28.06.2015 : Naprawiłem mały błąd i wydałem go jako wtyczkę . Kod wtyczki jest nieco lepszy, ponieważ ostrzega ponownie po przesunięciu kursora; Polecam użyć wtyczki.
Odpowiedź od superjera działa świetnie, ale ma niefortunny efekt uboczny, że można cofnąć zmiany tylko z ostatniej sesji Vima, a nie ze wszystkich poprzednich sesji Vima.
Jest tak, ponieważ
wundo
zastępuje plik cofania; nie jest scalony. O ile mi wiadomo, nie ma sposobu, aby to naprawić.Oto moje alternatywne rozwiązanie, wyświetli duży czerwony komunikat ostrzegawczy podczas cofania zmian z pliku cofania.
Jest to podobne do odpowiedzi Ingo Karkat , ale nie wymaga zewnętrznej wtyczki i ma pewne subtelne różnice (wyświetla ostrzeżenie zamiast sygnału dźwiękowego, nie wymaga
u
dwukrotnego naciśnięcia ).Uwaga To tylko modyfikuje
u
i<C-r>
wiąże i nieU
,:undo
i:redo
poleceń.źródło
Mam następujące informacje, które przerywają i emitują sygnał dźwiękowy, gdy polecenie Cofnij osiągnie zawartość bufora utrwalonego.
To integruje się z wtyczką repeat.vim; wymaga mojej wtyczki Ingo-Library .
źródło
Naprawdę podobał mi się cytowany pomysł, więc wydałem
:Revert
polecenie. Mam nadzieję, że uznasz to za istotne dla twojego pytania.Funkcje pomocnicze
Get_seq
iReal_seq
, w oparciu o undotree , są niezbędne, ponieważundotree()['seq_cur']
czasami nie wystarcza do wskazania aktualnej pozycji w drzewie cofania. Możesz przeczytać więcej na ten temat tutaj .źródło
au
. vimrc tam jest winowajcą. Po prostu to pomiń