Fark etmeden arabellek nasıl değiştirilir?


11

S: Bir arabellek undofark etmeden nasıl metin ekleyebilir / değiştirebilirim ?

İşte kullanım örneği. Diğer şeylerin yanı sıra, bir dosyada en son değişiklik için bir zaman damgası güncelleştiren her dosyanın başında bir yorum bloğu var. undoTesisleri fark etmeden bu zaman damgasını değiştirebilmek istiyorum .

undoBurada kısa devre yapmamın nedeni , LaTeX belgelerini düzenlerken / derlerken ortaya çıkan aşağıdaki kenar durumundan kaynaklanıyor (ve muhtemelen başkaları, ancak bu beni en çok tahrik eden durumdur):

  1. Derlenen dokümanı nasıl etkileyeceğini görmek için dosyada küçük bir değişiklik yapın
  2. Dosyayı kaydedin (zaman damgasını güncelleyen)
  3. latexDosyada çalıştır
  4. Değişikliğin kötü olduğuna karar ver
  5. undo değişiklikler

(5) ( undo) adımındaki problem, (1) adımında yapılan değişikliği geri almamakta, (2) adımında zaman damgası güncellemesini geri almasıdır. Bu beni rahatsız etmeyecekti (sadece bir undokez daha yapabilirim), aynı zamanda, gerçek asıl değişiklikten neredeyse her zaman çok, çok sayıda satır olan dosyanın üstündeki zaman damgasına kadar tüm noktayı taşır. Çok sarsıcı ve konsantrasyonumu tamamen bozuyor.

Ziyaret ettiğim bir dosyaya ilişkin soruyu dile getiriyorum, ancak daha genel olarak tamponları değiştirmekle ilgili.

Öyleyse: bir tamponda belirli bir değişiklik fark etmesini nasıl önleyebilirim undo?


1
Bu, geri alma sorunuzla ilgili değildir, ancak "noktayı geri al" sorununa yardımcı olabilir: stackoverflow.com/a/20510025/1279369
dadı

2
Bu tarih damgası değişikliğinin geri alma geçmişindeki en son öğeye eklenmesi iyi olmaz mıydı? Bu şekilde undoher ikisini de geri alabilirsiniz.
Malabarba

Gerçekten istediğin şey bence atomic-change-group.

@john: Bu nasıl yardımcı olur? Gruptaki iki değişiklik ayrı komutlarla tetiklenir: “küçük değişiklik” (örn. Ekleme) ve kaydetme sırasında yapılan zaman damgasının güncellenmesi.
Gilles 'SO- kötü olmayı kes

Herhangi bir nedenle, mevcut cevaplardaki bu yöntemlerin hiçbirinin benim için işe yaramadığını unutmayın, ancak bu cevap with-undo-collapseçok yararlı bir makro tanımlamaktadır : emacs.stackexchange.com/a/7560/2418
ideasman42

Yanıtlar:


6

@ stsquad'ın cevabı beni doğru yola soktu. Temel olarak, adımlar şunlardır:

  1. kayıt etmek buffer-undo-list
  2. devre dışı undo
  3. İşine bak
  4. yeniden etkinleştirin undove geri yükleyinbuffer-undo-list

İşte böyle bir işlevin bir taslağı:

(defun disable-undo-one-off ()
  (let ((undo buffer-undo-list))        ; save the undo list
    (buffer-disable-undo)               ; disable undo
    (do-some-stuff)                     ; do your thing
    (buffer-enable-undo)                ; re-enable undo
    (setq buffer-undo-list undo)))      ; restore the undo list

Düzenleme: aslında, daha basit bir çözüm hala basitçe let-böylece orijinal liste geri yüklendiğinde get clobbered buffer-undo-listgövdesindeki listede değişiklikler olduğu ortaya çıkıyor let:

(defun disable-undo-one-off ()
  (let (buffer-undo-list)
    (do-some-stuff)))

Bununla ilgili ana sınırlama, tampondaki karakter sayısını değiştirmeyen değişiklikler için işe yaradığıdır (örneğin, "yavru kedi" yi "yavru" olarak değiştirmek, "kedi" değil), aksi takdirde geri alma işleminin geri kalanı listesi şimdi yanlış noktalara atıfta bulunuyor. Dolayısıyla bu sadece kısmi bir çözümdür .


Bir gevrek koruma durumunda, şeylerinizin ortasındaki etkinlikten koparmak isteyebilirsiniz. Tüm bunları, işleri takip etmeyi kolaylaştıran bir fonksiyonda yaptığınızın farkında değildim.
stsquad

Geri alma geçmişini (ve mümkünse nokta geçmişini) güncellememek için zaman damgası güncellemesinin çözümünü de ekleyebilir misiniz?
Kaushal Modi

@ stsquad: iyi fikir, daha sonra yapmaya çalışacaktır. Söz konusu işlevler ve listeye ilişkin ipucu için tekrar teşekkürler.
Dan

@kaushalmodi: açıklayıcı soru: gerçek zaman damgası güncelleme işlevini görmek istediğiniz anlamına mı geliyor?
Dan

@ Geri alma veya nokta geçmişini güncellememek için zaman damgası güncelleme işlevinin nasıl değiştirileceğini görmek ister misiniz?
Kaushal Modi

3

Geri alma işlemi, geri alma listesindeki birkaç öğeyi birleştirir . nilListedeki bir girdi, iki değişiklik grubu arasındaki sınırı işaretler. nilEn üst düzey döngü tarafından otomatik olarak eklenen listenin başlangıcını kaldırarak¹, zaman damgası güncellemesini teknik olarak isteğinizle eşleşmeyen, ancak senaryodaki sorunu pratik olarak çözmesi gereken son arabellek değişikliği ile gruplayabilirsiniz.

(defun time-stamp-group-undo ()
  (if (eq nil (car buffer-undo-list))
      (setq buffer-undo-list (cdr buffer-undo-list)))
  (time-stamp))

(Uyarı: denenmemişse, geri alma listesi daha fazla masaj gerektirebilir.)

Zaman damgası güncellemesi için konum girişini (bir tam sayı) değiştirerek geri alma listesiyle farklı bir şekilde oynayabilirsiniz .

¹ grubu eklemeleri benzer bir kaldırma yapar. self-insert-command


2

Ne önerdiğinizle ilgili sorun, geri alma ağacının bulunduğunuz yerden istediğiniz yere ulaşmak için deltaların bir listesi olmasıdır. Bir arabellekte geri almayı devre dışı bırakmak mükemmel bir şekilde mümkün olsa da, değişiklikleri aktif olarak kaydetmemenin etkisinin ne olacağından emin değilim. Şu anda belirli bir arabellek geri alma / açma için bir geçiş var, çünkü büyüyen bir günlük veya ferahlatıcı sayfada bilgi geri almak için mantıklı değil. Ancak geçişteki değişiklikleri karıştırır:

(defun my-toggle-buffer-undo ()
  "Toggle undo tracking in current buffer."
  (interactive)
  (with-current-buffer (current-buffer)
    (if (eq buffer-undo-list t)
        (setq buffer-undo-list nil)
      (buffer-disable-undo (current-buffer)))))

(define-key my-toggle-map "u" 'my-toggle-buffer-undo)

tampon-disable-geri aslında sadece setleri tampon-geri alma-liste için nil . Belki arabellek-geri alma durumunu değiştirdiğinizde kaydettiyseniz daha sonra geri yükleyebilirsiniz.

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.