Jak mogę odrzucić moją historię cofania w vimie?

23

Cofanie jest przyjemne w Vimie. Ale czasami, w znanym dobrym punkcie, chcę wymazać historię cofania - aby móc ucofnąć pojedyncze zmiany, ale tylko do pewnego momentu. (Na przykład może to być czas, kiedy ostatni raz popełniłem.)

Jednym ze sposobów osiągnięcia tego jest zamknięcie i ponowne otwarcie pliku - historia cofania zaczyna się w tym momencie od razu. Ale to kłopot.

W przeszłości osiągałem to dzięki :edit!. Ale w Vimie 7.3 nie odrzuca historii cofania.

Czy jest na to inny sposób niż zamknięcie pliku?

Nathan Long
źródło
więc właściwie chcesz po prostu przywrócić stan pliku z ostatniego zatwierdzenia? chcesz zasadniczo po prostu ponownie przypisać klawisz „u” do czegoś takiego jak git checkout -f filelub hg rollback file?
akira
@akira - nie, chcę móc ucofać indywidualne zmiany, ale nie przekraczać punktu, w którym ostatnio popełniłem. Dokładnie tak, jakby za każdym razem, gdy się popełniłem, zamykałem plik i ponownie go otwierałem. Tak było :edit!kiedyś - przypominało to zamykanie pliku i otwieranie go ponownie. Nie musi to być powiązane z punktem zatwierdzenia, to jest właśnie czas, kiedy najczęściej tego chcę.
Nathan Long,
ah, dzięki temu problem jest znacznie wyraźniejszy. powinieneś nieco zmienić swoje pytanie.
akira

Odpowiedzi:

11
:set undoreload=0 | edit

powinien zrobić to, o co prosisz.

Steven
źródło
1
Ha! Wyłącz tę funkcję, co? :) Nie jestem pewien, dlaczego tak długo to zauważyłem.
Nathan Long,
7

Stary: edytuj! zachowanie w jednej linijce:

:exe "set ul=-1 | e! | set ul=" . &ul
Aldrik
źródło
To działa. Czy mógłbyś to wyjaśnić?
Nathan Long,
Połącz wartość ustawienia niedopoziomowania na końcu ciągu poleceń (aby można je było przywrócić) i wykonaj je. Więcej informacji można znaleźć w dokumentacji: :h :exe, :h :bar, :h :set-args, :h 'ul'i :h :edit!.
Aldrik
6

Funkcja Benoit nie działała dla mnie, ale znalazłem coś podobnego w instrukcji vima, tutaj:

http://www.polarhome.com/vim/manual/v73/undo.html#undo-remarks

Włączyłem go w funkcję, dodałem do mojego vimrc i wydaje się, że działa dobrze w vimie 7.3:

" A function to clear the undo history
function! <SID>ForgetUndo()
    let old_undolevels = &undolevels
    set undolevels=-1
    exe "normal a \<BS>\<Esc>"
    let &undolevels = old_undolevels
    unlet old_undolevels
endfunction
command -nargs=0 ClearUndo call <SID>ForgetUndo()

Można tego używać z :ClearUndo.

Nycto
źródło
1
Działa normalnie z wtyczką Gundo i ponownie ładuje pliki, co jest dla mnie bardzo przydatne. Zmieniłem jednak dwie rzeczy: zamiast zwykłego polecenia edycji (które wydaje się, że pozostawia trochę historii edycji na wersji 7.4), po prostu używam edycji! (i zawsze pisz przed skasowaniem historii cofania). Wygląda na to, że niektóre listy wewnętrzne nie są poprawnie aktualizowane, więc jeśli chcesz użyć tego z wtyczką Gundo, dokonaj dodatkowej edycji! na końcu funkcji zapobiegnie późniejszemu błędowi.
PlasmaHH,
@PlasmaHH Czy możesz zamieścić funkcję czyszczenia historii cofania, ponieważ nie rozumiem, co zmieniłeś ... (możesz ją opublikować jako odpowiedź dla tych z nas, którzy używają gundu). Dzięki
Ben
5

Prawdopodobnie:

:let old_ul=&ul
:set ul=-1
:let &ul=old_ul
:unlet old_ul

( 'ul'jest pseudonimem 'undolevels').

Benoit
źródło
To działa! Teraz próbuję zrobić to za pomocą jednego polecenia - najlepiej :edit!. Na początek stworzyłem funkcję o nazwie ClearUndos () z wymienionymi poleceniami, ale wywoływanie jej wydaje się nic nie robić, podczas gdy wykonywanie poleceń osobno robi ...
Nathan Long
3
:command -nargs=0 Reset let old_ul=&ul | set ul=-1 | e! | let &ul = old_ul | unlet old_ul
Benoit
czy to ma być zawartość funkcji? Dla mnie to nie działa, ale może źle zrozumiałem. Ponadto - może przenieść to do własnej odpowiedzi?
Nathan Long
Może nie możesz umieścić surowego |w treści polecenia. Następnie utwórz funkcję, która wykonuje to, co powiedziałem w mojej odpowiedzi, i ustaw polecenie na call thefunction().
Benoit
3

„Wyczyść historię cofania (: w, aby usunąć plik cofania, jeśli jest prezentowany)
command! -bar UndoClear exe "set ul=-1 | m-1 | let &ul=" . &ul

  • Po ustawieniu opcji „cofnij poziom” na -1 informacja o cofnięciu nie jest natychmiast usuwana, dzieje się to przy następnej zmianie, tzn. m-1Która tak naprawdę nie zmienia tekstu.
  • Kiedy 'undofile'jest włączony, :waby usunąć plik cofania lub łańcuch UndoClear|w.
Bohr
źródło
1

W skrypcie:

function! <SID>ForgetUndo
     let old_ul = &ul
     set ul=-1
     let &ul = old_ul
     unlet old_ul
endfunction
command -nargs=0 Reset call <SID>ForgetUndo()

Następnie użyj, :Resetaby to nazwać.

Benoit
źródło
Linia definicji funkcji potrzebuje () na końcu.
Nathan Long
To dziwne - uruchamianie tych poleceń indywidualnie działa dobrze, a echo wartości w całej funkcji pokazuje, że są odpowiednio ustawione i rozbrojone. Ale uruchomienie tej funkcji nie resetuje mojej historii cofnięć - potem nadal mogę cofać wiele razy. Być może set ul=polecenie wpływa tylko na zmienną lokalną, dopóki skrypt nie zostanie zamknięty, a ponieważ zmieniamy go z powrotem przed zakończeniem skryptu, nigdy nie ma to wpływu na środowisko? Czy przetestowałeś tę funkcję i sprawiłeś, że działa - co oznacza, że ​​jest coś dziwnego w mojej konfiguracji?
Nathan Long