Emacs ile 'geri aldıktan' sonra değişiklikleri nasıl yeniden yaparsınız?


268

Bu makalede , "Emacs yinelendi, çünkü geri alırken yönü tersine çevirebilir, böylece geri almayı geri alabilirsiniz".

Ne anlama geliyor? Bir kullanıcı Emacs ile nasıl yeniden yapabilir?


3
Kabul cevap altındaki cevabı söyler nasıl insanların çoğu aslında arayan edilecek, bunu yazıldığı nasıl verilir, bu cevap, bakıyoruz bu yüzden en ben beklenebilir eğer.
Aaron Hall

Sadece boşluk çubuğuna vurdum ve sonra geri al ve alanı geri al ve sonuna kadar yapana kadar geri al ve sonra tekrar geri dönmeye başlıyor ... Çok daha karmaşık yollar olduğunu biliyorum, ama bu hızlı ve kolay, ve ben bu şekilde yuvarlanıyorum.
nroose

Yanıtlar:


294

Kısa versiyon: geri almayı geri alarak. Geri alır ve sonra gibi bir düzenleme dışı komut yaparsanız, bir C-fsonraki geri alma geri alma işlemini geri alır ve bu da yinelemeyle sonuçlanır.

Daha uzun versiyon:

Geri alma işlemini bir yığın işlem üzerinde çalışmak olarak düşünebilirsiniz. C-fBir dizi geri alma işlemi sonrasında bir komut (hatta bir navigasyon komutu bile ) gerçekleştirirseniz, tüm geri alma işlemleri işlem yığınına gönderilir. Böylece bir sonraki geri alma son komutu geri alır. Şöyle bir işlem diziniz olduğunu varsayalım:

  1. "Foo" ekle
  2. "Çubuk" ekle
  3. "Spam'ı seviyorum" ekle

Şimdi, geri al. Son eylemi geri alır ve aşağıdaki listede bulunur:

  1. "Foo" ekle
  2. "Çubuk" ekle

Bu noktada geri alma dışında bir şey yaparsanız - örneğin, C-fişlem yığını şöyle görünür:

  1. "Foo" ekle
  2. "Çubuk" ekle
  3. "Spam'ı seviyorum" ekle
  4. "Spam'ı seviyorum" eklemesini geri al

Şimdi, geri aldığınızda, geri alınan ilk şey geri alınır. Orijinal yığınınız (ve belge durumunuz) sonucu:

  1. "Foo" ekle
  2. "Çubuk" ekle
  3. "Spam'ı seviyorum" ekle

Geri alma sırasını kırmak için bir değiştirme komutu yaparsanız, geri alma işleminden sonra bu komut eklenir ve bu nedenle daha sonra geri alınacak ilk şeydir. Vurmak yerine "çubuk" üzerinde geri gittiğinizi varsayalım C-f. Sonra olurdu

  1. "Foo" ekle
  2. "Çubuk" ekle
  3. "Spam'ı seviyorum" ekle
  4. "Spam'ı seviyorum" eklemesini geri al
  5. "Çubuğu" sil

Bu ekleme / yeniden ekleme reklam sonsuz olur. Alışmak biraz zaman alır, ancak Emacs'a oldukça esnek ve güçlü bir geri alma / yineleme mekanizması verir.


117
Bunun sinir bozucu gelmesi durumunda, en büyük avantajı her zaman önceki bir duruma geri dönebilmenizdir. Çoğu editörde, birkaç değişikliği geri almak ve sonra yanlışlıkla bir karakter yazmak, geri aldığınız şeyi yeniden yapmanın hiçbir yolu olmadan sizi 'mahsur' bırakacaktır. Emacs bunu önemsiz kılar.
phils

3
Sanırım inşaatınızda, eğer bir kişi kağıt üzerinde yapmak isterse, iki deste istersiniz. Çünkü örneğin, "Şimdi, geri alırsınız. Son eylemi geri alır ve aşağıdakilere neden olur. list: "siz (anlaşılır bir şekilde) geri almayı göstermediniz ve eğer birçok geri alma yapmışsa, geri alma sırasını kırmak için bir şey yapılıncaya kadar bunları göstermezsiniz, sonra onları eklersiniz. Bunu göstermenin bir başka yolu, bir listeye sahip olmak ve kırılmadan önce listeye undos eklemek olacaktır, ancak imlecin listede nerede olduğunu not etmek için, bu yüzden
undos'un

25
Kulağa rahatsız edici geliyor.
Felipe

13
Sana NASIL söylemediğinde bile bu cevabın neden kabul edildiğini bilmiyorum .
Aaron Hall

8
Ne yazık ki bu cevap Cg C- / olan redo komutu hakkında hiçbir şey söylemiyor.
vishnuprasanth

211

Geri almak için: C-_

Geri alma işleminden sonra yeniden yapmak için: C-g C-_

Birden çok kez yazın C-_ tarafından geri alınan geçenlere yeniden yapmak C-_ , bir emacs birden çok kez komuta yinelemek komut sonra yazın yürütmek için C-xzve daha sonra birçok kez yazın z(birden çok kez makro çalıştırmak istediğinizde ilginç) komutu tekrarlamak için anahtarın


4
C-uÖrneğin, tekrarlamak için kullanabilirsiniz C-u 8 *(kablonun bulunduğu yere sekiz * ekler). Böylece x adımlarını C-u x C-_geri almak için kullanabilirsiniz .
Patrick

10
Bunun orijinal soru ile ilgisi yoktur, ancak bir klavye makrosu (ile C-x e) yürüttükten hemen sonra , etekrar yürütmek için istediğiniz sıklıkta basabilirsiniz .
Christian Berg

7
Ayrıca C-/ve C-x ualternatif geri bağlama anahtar bağları, eşdeğerdir C-_. Vurmak C-/daha kolay olduğu için tercih ederim .
Rory O'Kane

8
Uyarı: Bu yanıtta C-g C-_"geri alma işleminden sonra yinelenir" yazdığında, bu yalnızca kombinasyona ilk kez bastığınızda geçerlidir. Bundan sonra geri alma anahtarınızı olmadan tekrarlayın C-g. Geri aldıktan hemen sonra üç kez yeniden yapmak için yazın C-g C-_ C-_ C-_. Eğer yazarsanız C-g C-_ C-g C-_ C-g C-_, geri alma işleminizi tekrarlayarak geri
dönersiniz

@ RoryO'Kane Emacs hakkında fazla bir şey bilmiyorum, bu yüzden lütfen yanlış olduğum yerde beni düzeltin, ancak Cg C-_'in bir yinelemeden sonra herhangi bir etkisi olmadığı göz önüne alındığında, bunun nedeni yalnızca bir geri alma ("geri alma işleminden sonra yineleme" gibi) bir geri alma veya yineleme yineleme çevrelerinde gitmesi o kadar da fazla değildir. _ Cg C-_
ilkinden

56
  • Bir kez geri almak için :C-/
  • İki kez geri almak için: C-/ C-/
  • Geri aldıktan hemen sonra bir kez tekrarlamak için :C-g C-/
  • Hemen geri alındıktan sonra, iki kez yinelemek için: C-g C-/ C-/. Not C-gtekrar edilmez.
  • To geri hemen tekrar , bir kez:C-g C-/
  • Hemen geri almak için iki kez: C-g C-/ C-/
  • Tekrar yapmak için , aynı…

Son geri alma komutunuzdan bu yana herhangi bir tuşa bastıysanız (karakterleri yazın veya yalnızca imleci hareket ettirin) C-g, bir sonraki geri al / yinele işleminden önce yazmanıza gerek yoktur . C-gtek başına hiçbir şey yapmayan vurmak için güvenli bir anahtardır, ancak geri alma dizinizin sonunu bildirmek için geri alınmayan bir anahtar olarak sayılır. Bunun gibi başka bir komuta basılması C-fda işe yarayacaktır; sadece imleci sahip olduğunuz yerden hareket ettirecekti.

C-gDemek istemediğiniz bir anda vurursanız veya başka bir komut alırsanız ve şimdi yanlış yönde geri alıyorsanız C-g, yönünüzü tekrar tersine çevirmek için vurmanız yeterlidir . İstediğiniz geri alma işlemlerine erişmeden önce yanlışlıkla yapılan yinelemeler ve geri alma işlemleriniz boyunca geri almanız gerekir, ancak vurmaya devam C-/ederseniz, sonunda istediğiniz duruma ulaşırsınız. Aslında, bir C-gkez vurursanız ve daha sonra C-/yeterli kez basarsanız , tamponun bulunduğu her duruma ulaşılabilir .

İçin alternatif kısayollar undodışında C-/vardır C-_, C-x uve M-x undo.

Emacs'ın geri alma sistemi hakkında daha fazla bilgi için Emacs El Kitabı'ndaki Geri Al bölümüne bakın .


38

Daha yaygın geri alma / yineleme işlevine sahip olmak isteyenler için birileri yazdı undo-tree.el. Emac olmayan geri almanın görünümünü ve hissini sağlar, ancak geri alma geçmişinin tüm 'ağacına' erişim sağlar.

Emacs'ın yerleşik geri alma sistemini seviyorum, ancak bu paketi çok sezgisel buluyorum.

Dosyanın kendisinden yorumlar:

Emacs güçlü bir geri alma sistemine sahiptir. Çoğu yazılım standart geri alma / yeniden yapma sisteminin aksine, kurtarmak sağlayan herhangi (standart geri alma / yeniden yapma sistemi yinelemek yakında kadar geçmiş durumları kaybedebilir oysa) bir tampon geçmiş halini. Bununla birlikte, bu gücün bir bedeli vardır: birçok insan Emacs'ın geri alma sistemini kafa karıştırıcı ve kullanımı zor buluyor, daha az güçlü ama daha sezgisel geri alma / yineleme sistemi ile değiştirilen bir dizi paket ortaya çıkarıyor.

Hem standart geri alma / yineleme ile veri kaybı hem de Emacs'ın geri alma karışıklığı, geri alma geçmişini doğrusal bir değişiklik dizisi olarak ele almaya çalışmaktan kaynaklanır. Değil. Bu paket tarafından sağlanan `` ağaç geri alma modu '', Emacs'ın geri alma sistemini, geri alma geçmişini olduğu gibi ele alan bir sistemle değiştirir: dallanan bir değişiklik ağacı. Bu basit fikir, standart geri alma / yineleme sisteminin daha sezgisel davranışının hiçbir geçmişi kaybetmeme gücü ile birleştirilmesini sağlar. Ek bir yan bonus, geri alma geçmişinin bazı durumlarda daha verimli bir şekilde saklanabilmesidir ve Emacs geçmişi atmadan önce daha fazla değişikliğin birikmesine izin verir.


3
Fantastik! Emacs undo'nun dipsiz olduğunu kim söyledi? :-)
Peter.O

İnanılmaz! kavramsal olarak sağlam ve kullanıcı sezgisel. Bu, varsayılan paketlerde olmalıdır. Bir yorum: Keşke, sadece bir noktaya geri dönerken değil, bir şube noktasından geri çekilirken bazı uyarı mesajları gösterilsin. Örneğin, kullanıcı bir yineleme çağrısı yaptığında: 'Bir şube noktasından yineleme' veya 'Varsayılan yineleme dalı kullanıldı' - yalnızca kullanıcıyı birden fazla şube olduğu konusunda uyarmak için.
Basel Shishani

1
Bu soruna uygulanması çok daha basit olan ve bir görselleştirici gerektirmeyen başka bir yaklaşım SADECE son dal noktasını tutmak ve 3 komut sağlamaktır: geri al, yinele, anahtar dalı. Geri alma / yineleme, şubeye isabet ettiğinde uyarır ve bir dalda yalnızca bir dalda 'dalda değil' mesajı yayınlanırsa geçiş yapılır. Herhangi bir zamanda dallanma meydana gelirse, önceki dallanma noktası kaybolur. Bu durum, devlet kaybı sorununu oldukça iyi ve en az karmaşıklıkla çözecektir.
Basel Shishani

1
Bunun, rastgele başarısız olabilen yinelemede uzun süredir devam eden bir hataya sahip olduğuna dikkat edin: github.com/syl20bnr/spacemacs/issues/9903 - 2014'ten beri biliniyor
ideasman42

@ ideasman42 Görünüşe göre bu bir "hata değil": dr-qubit.org/Lost_undo-tree_history.html
Dalker

19

Yinele için ağaç geri alma tuhaflığına dikkat edin !

Birçok popüler “başlangıç ​​kiti” (başlangıç, purcell, spacemacs) ağaçla birlikte gelir. Çoğu (tümü?) Hatta otomatik olarak etkinleştirir. Belirtildiği gibi, geri alma ağacı, geri alma / yineleme ağacını görselleştirmenin ve çaprazlama yapmanın kullanışlı bir yoludur. Prelude ona bir anahtar akoru ( uu) da verir C-x u.

Sorun şudur: Geri alma ağacı Emacs' varsayılan ve bağlayıcı tanınmış enkaza görünüyor redo :C-g C-/ .

Bunun yerine, geri alma / yineleme için şu simetrik tuşları kullanabilirsiniz :

C-/     undo
C-S-/   redo

Bunlar, bazen görselleştiriciyi açmadan hızlı bir şekilde yeniden yapmak istediğiniz için yararlıdır .


Bu. Spacemacs kullanıyorum ve neden benim için çalışmadığını anlayamadım. Teşekkürler!
mghaoui

11

Ben "normal" geri al / yinele yapmak için redo.elson derece kullanışlı buluyorum , ve ben genellikle CSz bağlamak ve Cz geri, şöyle:

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

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

Sadece dosyayı indirin, lisp yolunuza koyun ve yukarıdakileri bilgisayarınıza yapıştırın .emacs.


Redo.el başlığındaki yorumlar XEmacs için yapıldığını söylüyor. GNU Emacs ve diğer ilgili Emacsen'de kullanırken herhangi bir sorun var mı?
A. Levy

Henüz herhangi bir sorun yaşamadım ve en az 6 aydır kullanıyorum :)
monotux

4
Kaynaktan emacswiki.org/emacs/RedoMode : Bununla birlikte, redo.el üzerinden güncel ve genellikle Emacs 22. RedoPlus olduğu ilkel-geri alma 'davranışı, bir öncekinden biraz farklı olmuştur, çünkü tampon" içeriğini yok bir çatal redo.el ve Emacs yeni sürümünde doğru çalışır.RooPlus alabilirsiniz burada: emacswiki.org/emacs/redo+.el
rofrol

2

Emacs 28 bir yineleme komutu (çağrılır undo-redo) ekler .

Daha tipik bir geri alma / yineleme işlemine sahip olmak istiyorsanız, aşağıdaki komutlar kullanılabilir.

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

1

Son işlemi yeniden yapmak istiyorsanız, aşağıdakileri yapın.

  1. ESC
  2. Başka bir geri al ( C + /)

0

Varsayılan olarak, Emacs'daki yinele Cg tuşuna basıp geri almayı gerektirir.

Ancak, yineleme komutunu uygulamak için Emacs yerleşik geri alma işlevini kullanmak da mümkündür.

Undo-fu paketi , hem geri alma hem de yinelemeyi ortaya çıkarmak için Emacs yerleşik geri alma işlevini kullanır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.