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?


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.


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)


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-/są C-_, C-x ui M-x undo.

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


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ę.


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.


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.


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)

1

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

  1. ESC
  2. Wykonaj kolejne cofnięcie ( C + /)

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.