Jak mogę bezpiecznie cofnąć zmiany, które mogłem wprowadzić lub nie?

12

Zbyt często popełniam błąd podczas pisania z niewłaściwym oknem (i zrobiłem to już kilka razy za pomocą uwierzytelniacza USB). W programach z włączoną dużą liczbą skrótów klawiszowych (Gmail, VLC, Vim) często ma to niezamierzoną konsekwencję wprowadzania niepożądanych modyfikacji.

Czasami mogę śledzić moje kroki i pamiętać, co wpisałem, aby naprawić wszelkie zmiany lub przywrócić ustawienia, które poprawiłem, jeśli wcześnie się złapię. Niestety nie zawsze tak jest.

W Vimie mogłem mieć coś tak niewinnego i widocznego jak zmiana linii tekstu, którą łatwo cofnąć. Albo mógłbym nieświadomie zmodyfikować coś, co nie jest tak łatwo zidentyfikowane. Jeśli przypadkowo wpisam sekwencję niechcianych poleceń w Vimie, jak mogę sprawdzić i cofnąć wszelkie zmiany lub zmiany ustawień?

JohnB
źródło
1
Czy szukasz akcji „cofnięcia”? :e!zrobiłby to
Jasper
1
Myślę, że :e!byłoby źle, jeśli nie zapisałeś od ostatniego poprawnego stanu, i umoże być niewystarczające, jeśli wpiszesz kilka rzeczy. (Jeśli date monthnp u.
Wpiszesz,
1
@WChargin Nie mówiąc o ubyciu częścią sekwencji, wykonując niektóre cofnięcia w środku.
yo „

Odpowiedzi:

14

Odwołać się

:undolist

aby zobaczyć, kiedy wprowadziłeś ostatni zestaw zmian. Jeśli jest napisane, że wprowadzono kilka zmian, np. „3 sekundy temu” i wiesz, że celowo zmieniłeś to, powiedzmy, minutę temu, a następnie wykonaj

:earlier 10s

przywrócić do pożądanego stanu. W przeciwnym razie, jeśli nie ma żadnych ostatnich zmian, nie musisz nic robić.


Dalsze odniesienia: :help undo-tree .

wchargin
źródło
4

Aby ponownie sformułować pytanie, szukasz sposobu, aby zobaczyć lub w inny sposób otrzymać powiadomienie o zmianach, które wprowadziłeś w pliku, a następnie użyć funkcji cofania. Może być inny sposób lub nawet wtyczki, które to obsługują. Ale wyjaśnię, czego używałem do tego samego celu.

Aby to zrobić, łączysz istniejącą funkcję vima. Na przykład możesz zdefiniować funkcję taką jak:

" Function: View changes after the last save
function! s:DiffSinceSave()
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
  exe "normal! ]c"
endfunction
com! DiffSaved call s:DiffSinceSave()

Możesz wtedy zadzwonić później, a nawet zmapować klawisz skrótu.

" Map key to function: View changes after the last save
nnoremap <leader>? :DiffSaved<CR>

Spowoduje to otwarcie widoku różnic opartego na podzielonym oknie, który pokaże zmiany dokonane od ostatniego zapisu. Po zidentyfikowaniu dokonanych zmian możesz wyjść z tego widoku i użyć innych funkcji vima, takich jak cofanie i cofanie drzewa, itp., A nawet wtyczek, aby powrócić do poprzednich stanów.

Zdaję sobie sprawę, że nie jest to idealne, ponieważ musisz mieć pewien rodzaj przepływu pracy, aby to było przydatne. Ale to działa całkiem dobrze. A na plus, nie zmieniamy sposobu działania vima ani nie polegamy na niczym zewnętrznym.

Mam nadzieję, że uznasz to za przydatne. Zaadaptowałem to rozwiązanie jakiś czas temu z fragmentów znalezionych w Internecie, w tym vim Wikia. Właśnie tam należy się kredyt.

dał
źródło
3

Wydaje mi się, że najprostszą odpowiedzią jest naciskanie, uaż cofniesz zmianę, którą chcesz zachować, a następnie naciśnij Ctrl-R.

superjer
źródło
0

Podobnie jak @ superjer, naciskam, uaż czerwony [+]znacznik na mojej linii statusu zniknie.

set statusline=%f\ %#Error#%m%##
joeytwiddle
źródło
Przydałoby się mieć klucz do automatycznego cofania do ostatniego niezmodyfikowanego stanu. Ale :e!jest też dobrym rozwiązaniem; obecnie Vim zachowa nawet twoje „odrzucone” zmiany w historii cofania.
joeytwiddle
5
To polecenie jest :earlier 1f. Te 1fśrodki „1 poprzedni zapisany stan”, więc będzie wrócić do poprzedniego raz plik został zapisany. Jeśli bufor zostanie zmodyfikowany, spowoduje to cofnięcie wszystkich modyfikacji. Jeśli bufor nie zostanie zmodyfikowany (tj. Jest obecnie w stanie zapisanym), przejdzie do poprzedniego zapisu pliku.
jamessan,