2010-10-27 20 views
6

Emacs'de bazen kbd-makro'yu yanlışlıkla çağırıyorum. Geri aldığımda, klavye makrolarının tüm etkisini atomik olarak geri almayı geri almayı beklerdim, ancak bu gerçekleşmez. Bunun yerine, her seferinde makrodaki her adımı geri almak zorunda kalıyorum. Makro yürütmeden önce arabellek durumuna dönmek için nasıl emacs alabilirim?Emacs içinde son-kbd-makro çağrısı nasıl geri alınır

cevap

2

Korkarım ki sadece yerleşik 'undo mekanizması ile yapamazsınız. Emacs'teki makro sistemi, aslında kullanıcının tuş vuruşlarında (veya fare olaylarında) yazıyormuş gibi geri dönüyor ve undo history (buffer-undo-list) normal olarak güncelleniyor.

Güncel undo mekanizmasını istediğiniz gibi yapmak için nasıl genişleteceğinize dair bir öneri.

  1. /geri alma listesindeki yeni bir giriş, bir macro-begin işaretleyici ve bir macro-end elemanı

  2. tavsiye anlama makro oynatma başlangıcı/sonu işaretleri eklemek için makro oynatmayı değiştirmek için 'undo uzatmak

  3. tüm bir birim olarak iki işaret arasındaki olayları geri almak ve hepsini geri (ve redo şeyler, hala olduğunuzda böylece geri alma tarihin ucunda uygun işaretleri eklemek undo kod tedavi var

Uyarılar) tek bir blok olarak kabul:

  • Bu sadece tek bir tampon maddesi içinde faaliyet makro çalışmak, makro tampon açık (ya da başka tampon içinde yan etkileri vardı), bu değişiklikler bir blok olarak ele alınmaz.
  • Makronuz başlatılandan farklı bir arabelleğin içinde sona erdiyse, o zaman temiz bir şekilde işlemek zorunda kalırsınız - geri listeden "dengesiz" macro-begin ve macro-end işaretlerini istemezsiniz.

Söylemeye gerek yok, bu karmaşık bir çabadır. Sana şans diliyorum.

+1

Teşekkürler Trey. Gerçekten karmaşık bir cevap. Aynı ruhta daha basit ama daha hacköz bir çözüm, geri arama listesindeki bir son no-op işaretleyici türünü son-kbd-makrosu (veya bir sarıcı) yapmaktır. Ardından, işarete ulaşılana kadar tüm değişiklikleri geri alabilecek yeni bir makro-işaretleyici işlevi oluşturun. –

+2

Bu satırlar arasında, http://www.panix.com/~harley/elisp/undo-group.el adresinden bir işaretçi, yani bir "geri-grup" komutu için sınır olarak kullandığı iki 'nil' işareti vardır. . –