Jak „ponawiasz” zmiany po „cofnięciu” w Emacsie?

268

W tym artykule jest napisane, że „Emacs ma ponawiać, ponieważ można cofać kierunek podczas cofania, a tym samym cofać cofanie”.

Co to znaczy? Jak użytkownik może „przerobić” za pomocą Emacsa?

prosseek
źródło
3
Odpowiedź pod zaakceptowaną odpowiedzią mówi ci, jak to jest , jeśli właśnie dlatego patrzysz na tę odpowiedź, która, biorąc pod uwagę, w jaki sposób jest napisana, spodziewałbym się, że większość ludzi faktycznie tego szuka.
Aaron Hall
Właśnie nacisnąłem klawisz spacji, a następnie cofam cofanie spacji i ponawiam cofnięcia, które zrobiłeś, aż dojdzie do końca, a następnie zacznie się cofać ... Wiem, że istnieją znacznie bardziej skomplikowane sposoby, ale jest to szybkie i łatwe i tak się toczę.
nroose 22.10.16

Odpowiedzi:

294

Wersja skrócona: cofając cofanie. Jeśli cofniesz, a następnie wykonasz polecenie nieedytowane, takie jak C-f, następne cofnięcie cofnie cofnięcie, co spowoduje ponowne wykonanie.

Dłuższa wersja:

Możesz myśleć o cofnięciu operacji jako o stosie operacji. Jeśli wykonasz jakieś polecenie (nawet polecenie nawigacyjne, takie jak C-f) po sekwencji operacji cofania, wszystkie cofnięcia zostaną wypchnięte na stos operacji. Kolejne cofnięcie cofa ostatnie polecenie. Załóżmy, że masz sekwencję operacji, która wygląda następująco:

  1. Wstaw „foo”
  2. Wstaw „pasek”
  3. Wstaw „Kocham spam”

Teraz cofniesz. Cofa ostatnią akcję, co powoduje wyświetlenie następującej listy:

  1. Wstaw „foo”
  2. Wstaw „pasek”

Jeśli w tym momencie zrobisz coś innego niż cofnięcie - powiedzmy, C-fstos operacji wygląda następująco:

  1. Wstaw „foo”
  2. Wstaw „pasek”
  3. Wstaw „Kocham spam”
  4. Cofnij wstawianie „Kocham spam”

Teraz, kiedy cofasz, pierwszą rzeczą, która jest cofana, jest cofanie. Wynikające z oryginalnego stosu (i stanu dokumentu):

  1. Wstaw „foo”
  2. Wstaw „pasek”
  3. Wstaw „Kocham spam”

Jeśli wykonasz polecenie modyfikujące, aby przerwać sekwencję cofania, polecenie to jest dodawane po cofnięciu, a zatem jest pierwszą rzeczą, którą należy później cofnąć. Przypuśćmy, że zamiast uderzania przesuwałeś się wstecz w „pasku” C-f. Wtedy byś miał

  1. Wstaw „foo”
  2. Wstaw „pasek”
  3. Wstaw „Kocham spam”
  4. Cofnij wstawianie „Kocham spam”
  5. Usuń „pasek”

To dodawanie / ponowne dodawanie odbywa się w nieskończoność. Trochę się przyzwyczaja, ale tak naprawdę daje Emacsowi bardzo elastyczny i potężny mechanizm cofania / ponawiania.

Michael Ekstrand
źródło
117
Na wypadek, gdyby zabrzmiało to denerwująco, główną zaletą jest to, że zawsze można przywrócić poprzedni stan. W większości redaktorów cofnięcie kilku zmian, a następnie przypadkowe wpisanie znaku sprawi, że nie będziesz miał możliwości zrobienia tego, co cofnąłeś. Emacs czyni to trywialnym.
phils
3
Przypuszczam, że w twojej konstrukcji, jeśli ktoś chciałby to zrobić na papierze, potrzebujesz dwóch stosów, ponieważ na przykład w punkcie, w którym napisałeś: „Teraz cofniesz. Cofa ostatnią akcję, co powoduje, że: list: „(co zrozumiałe) nie pokazałeś cofania, a jeśli zrobił wiele cofnięć, nie pokazywałbyś ich, dopóki nie zrobiono by czegoś, co przerwałoby sekwencję cofania, wtedy dodałeś je. Innym sposobem na pokazanie tego byłoby posiadanie jednej listy i dodawanie cofnięć do listy, zanim jeszcze zostaną złamane, ale zanotowanie, gdzie znajduje się kursor na liście, więc wiemy, gdzie
cofnięcia
25
Brzmi denerwująco.
Felipe
13
Nie wiem, dlaczego ta odpowiedź została zaakceptowana, skoro nawet nie mówi JAK .
Aaron Hall
8
Niestety ta odpowiedź nie mówi nic o poleceniu powtórzenia, którym jest Cg C- /.
vishnuprasanth
211

Cofnąć: C-_

Aby powtórzyć po cofnięciu: C-g C-_

Wpisz wiele razy, C-_ aby powtórzyć to, co zostało cofnięte. C-_ Aby powtórzyć polecenie emacs wiele razy, wykonaj polecenie, a następnie wpisz, C-xza następnie wpisz wiele razy zklawisz, aby powtórzyć polecenie (ciekawe, jeśli chcesz wykonać makro wiele razy)

Jérôme Radix
źródło
4
Do powtarzania rzeczy możesz także użyć C-u, na przykład C-u 8 *(wstaw osiem * w miejscu, w którym znajduje się kursor). Możesz więc użyć C-u x C-_do cofnięcia x kroków.
Patrick,
10
Nie ma to nic wspólnego z pierwotnym pytaniem, ale zaraz po uruchomieniu makra klawiatury (z C-x e) możesz naciskać etyle razy, ile potrzebujesz, aby wykonać je ponownie.
Christian Berg,
7
Również C-/i C-x ualternatywne cofanie przypisania klawiszy, co odpowiada C-_. Wolę, C-/ponieważ łatwiej jest trafić.
Rory O'Kane,
8
Ostrzeżenie: gdy ta odpowiedź mówi, że C-g C-_„cofnie się po cofnięciu”, dotyczy to tylko pierwszego naciśnięcia kombinacji. Następnie powtórz swój klawisz cofania bez C-g. Aby powtórzyć trzy razy zaraz po cofnięciu, wpisz C-g C-_ C-_ C-_. Jeśli C-g C-_ C-g C-_ C-g C-_napiszesz, będziesz krążył w kółko, cofając ponawianie swoich cofnięć ...
Rory O'Kane
@ RoryO'Kane Nie wiem wiele na temat emacsa, więc proszę popraw mnie tam, gdzie się mylę, ale biorąc pod uwagę, że Cg C-_ nie ma żadnego efektu po ponownej przerwie, to może być tak, ponieważ działa tylko po cofanie (jak sugeruje to opis „powtórz po cofnięciu”). Więc nie chodzi o to, że krąży w kółko, powtarzając cofnięcie lub powtórzenie itd., nic nie robi, ponieważ cofnięcie nie zostało zrobione wcześniej. CG C- _ Cg C-_ po pierwszym nie krąży w kółko, dosłownie nic nie robi
barlop
56
  • Aby cofnąć raz:C-/
  • Aby cofnąć dwukrotnie: C-/ C-/
  • Aby powtórzyć raz, natychmiast po cofnięciu:C-g C-/
  • Aby powtórzyć dwukrotnie, natychmiast po odkręceniu: C-g C-/ C-/. Zauważ, że C-gsię nie powtarza.
  • Aby cofnąć natychmiast ponownie , raz:C-g C-/
  • Aby cofnąć natychmiast ponownie, dwa razy: C-g C-/ C-/
  • Aby ponownie wykonać to samo…

Jeśli od ostatniego polecenia cofania naciśniesz dowolny klawisz (czy wpisujesz znaki, czy po prostu przesuwasz kursor), nie musisz pisać C-gprzed następnym cofnięciem / ponownym. C-gjest tylko bezpiecznym klawiszem do trafienia, który sam w sobie nie robi nic, ale liczy się jako klawisz cofania, który sygnalizuje koniec sekwencji cofania. Naciśnięcie innego polecenia, takiego jak C-fteż, działałoby; po prostu przesuwa kursor z miejsca, w którym go masz.

Jeśli uderzyłeś C-glub wykonałeś inne polecenie, kiedy nie chciałeś, a teraz cofasz się w złym kierunku, po prostu naciśnij, C-gaby odwrócić kierunek. Będziesz musiał cofnąć całą drogę przez przypadkowe powtórzenia i cofnięcia, zanim dojdziesz do cofnięć, które chcesz, ale jeśli nadal C-/będziesz naciskać , w końcu osiągniesz pożądany stan. W rzeczywistości każdy stan, w którym kiedykolwiek był bufor, jest osiągalny, jeśli uderzysz C-graz, a następnie naciskasz C-/wystarczająco dużo razy.

Alternatywne skróty undo, inne niż C-/C-_, C-x ui M-x undo.

Zobacz Cofnij w Podręczniku Emacsa, aby uzyskać więcej informacji na temat systemu cofania Emacsa.

Rory O'Kane
źródło
38

Dla tych, którzy chcą mieć bardziej powszechną funkcję cofania / ponawiania, ktoś napisał undo-tree.el. Zapewnia wygląd cofania nie Emacsa, ale zapewnia dostęp do całego „drzewa” cofania historii.

Lubię wbudowany system cofania Emacsa, ale uważam ten pakiet za bardzo intuicyjny.

Oto komentarz z samego pliku:

Emacs ma potężny system cofania. W przeciwieństwie do standardowego systemu cofania / ponawiania w większości programów, pozwala on odzyskać dowolny wcześniejszy stan bufora (podczas gdy standardowy system cofania / ponawiania może utracić przeszłe stany zaraz po ponownym wykonaniu). Jednak ta moc ma swoją cenę: wiele osób uważa system cofania Emacsa za mylący i trudny w użyciu, tworząc wiele pakietów, które zastępują go mniej wydajnym, ale bardziej intuicyjnym systemem cofania / ponawiania.

Zarówno utrata danych ze standardowym cofaniem / ponawianiem, jak i pomieszanie cofania Emacsa, wynikają z próby traktowania historii cofnięć jako liniowej sekwencji zmian. To nie jest. „Tryb cofania drzewa” udostępniany przez ten pakiet zastępuje system cofania Emacsa systemem, który traktuje historię cofania tak, jak jest: rozgałęzionym drzewem zmian. Ten prosty pomysł pozwala na bardziej intuicyjne zachowanie standardowego systemu cofania / ponawiania w połączeniu z mocą nigdy nie tracącej historii. Dodatkową korzyścią dodatkową jest to, że historia cofania może być w niektórych przypadkach bardziej efektywnie przechowywana, umożliwiając gromadzenie większej liczby zmian, zanim Emacs zacznie usuwać historię.

Trey Jackson
źródło
3
Fantastyczny! Kto powiedział, że emacs undo było niezgłębione? :-)
Peter.O
Niesamowity! koncepcyjnie zdrowy i intuicyjny w obsłudze. Powinno to być w domyślnych pakietach. Jeden komentarz: Chciałbym, aby komunikat ostrzegawczy pojawił się również podczas ponownego wykonywania od punktu rozgałęzienia, a nie tylko podczas powrotu do niego. Na przykład, gdy użytkownik wywołuje ponawianie: „Ponawianie od punktu rozgałęzienia” lub „Użyto domyślnej gałęzi ponawiania” - tylko w celu ostrzeżenia użytkownika, że ​​istnieje więcej niż jedna gałąź.
Basel Shishani,
1
Innym podejściem do tego problemu, który jest znacznie prostszy do wdrożenia i nie wymaga wizualizatora, jest zachowanie TYLKO ostatniego punktu rozgałęzienia i zapewnienie 3 poleceń: cofnij, powtórz, rozgałęzienie przełączające. Cofanie / ponawianie ostrzega, gdy gałąź zostanie trafiona, a gałąź przełączania po prostu przełączy się, jeśli w innej gałęzi po prostu wyśle ​​komunikat „nie w gałęzi”. Jeśli rozgałęzienie nastąpi w dowolnym momencie, poprzedni punkt rozgałęzienia zostanie utracony. To rozwiązałoby problem utraty stanu dość dobrze i przy minimalnej złożoności.
Basel Shishani,
1
Strzeż się, że ma on długotrwały błąd w przerobie, który może losowo zakończyć się niepowodzeniem: github.com/syl20bnr/spacemacs/issues/9903 - znany od 2014 roku
ideasman42
@ ideasman42 Najwyraźniej jest to „non-bug”: dr-qubit.org/Lost_undo-tree_history.html
Dalker
19

Strzeż się dziwnego cofania drzewa w celu ponownego wykonania !

Wiele popularnych „zestawów startowych” (preludium, purcell, spacemacs) jest dostarczanych w pakiecie z cofaniem drzewa. Większość (wszystkich?) Nawet włącza go automatycznie. Jak wspomniano, cofnij drzewo jest wygodnym sposobem na wizualizację i przejście przez drzewo cofania / ponawiania. Preludium daje nawet klawisz-akord ( uu), a także C-x u.

Problem polega na tym: cofanie drzewo wydaje się zniszczyć domyślne Emacs i znany wiążący dla redo :C-g C-/ .

Zamiast tego możesz użyć tych symetrycznych klawiszy do cofania / ponawiania :

C-/     undo
C-S-/   redo

Są one przydatne, ponieważ czasami chcesz szybko powtórzyć bez otwierania wizualizatora.

Micah Elliott
źródło
To. Używam Spacemacs i nie mogłem zrozumieć, dlaczego to nie działało dla mnie. Dzięki!
mghaoui
11

Uważam, że jest to szczególnie redo.elprzydatne do wykonywania „normalnych” operacji cofania / przywracania i zwykle wiążę to z CSz, a cofam z Cz, w następujący sposób:

(when (require 'redo nil 'noerror)
    (global-set-key (kbd "C-S-z") 'redo))

(global-set-key (kbd "C-z") 'undo)

Wystarczy pobrać plik, umieścić go na ścieżce lisp i wkleić powyższe w swoim .emacs.

monotux
źródło
Komentarze w nagłówku redo.el mówią, że jest on stworzony dla XEmacs. Czy jest jakiś problem z używaniem go w GNU Emacs i innych powiązanych Emacsen?
A. Levy,
Nie miałem jeszcze żadnych problemów i używam go przez co najmniej 6 miesięcy :)
monotux
4
Od emacswiki.org/emacs/RedoMode : Jednak redo.el jest nieaktualny i często niszczy zawartość „bufora”, ponieważ zachowanie „pierwotnego cofania” różni się nieco od starego od Emacsa 22. RedoPlus jest rozwidlenie redo.el i działa poprawnie w nowszej wersji Emacsa. Możesz pobrać RedoPlus tutaj: emacswiki.org/emacs/redo+.el
rofrol
2

Emacs 28 dodaje polecenie ponów (wywoływane undo-redo).

Jeśli chcesz mieć bardziej typowe cofanie / ponawianie, można użyć następujących poleceń.

(global-set-key (kbd "C-z") 'undo-only)
(global-set-key (kbd "C-S-z") 'undo-redo)
ideasman42
źródło
1

Jeśli chcesz ponownie wykonać ostatnią operację, wykonaj następujące czynności.

  1. ESC
  2. Wykonaj kolejne cofnięcie ( C + /)
Vineeshvs
źródło
0

Domyślnie ponawianie w Emacsie wymaga naciśnięcia Cg, a następnie cofnięcia.

Jednak możliwe jest użycie wbudowanego cofania Emacsa, aby zaimplementować polecenie ponawiania.

Pakiet cofnij-fu , wykorzystuje wbudowaną funkcję cofania Emacsa, aby ujawnić zarówno cofanie, jak i ponawianie.

ideasman42
źródło