dolgu paragrafı, hiçbir şey yapmasa bile dosyayı değiştirilmiş olarak işaretler


11

Ne fill-paragraphzaman çağırsam, komutun bir etkisi olmasa bile (yani paragraf zaten doldurulmuş olsa bile) arabellek her zaman değiştirilmiş olarak işaretlenir. Ayrıca boş, geri alınamayan bir eylem oluşturur (ile kolayca algılanır undo-tree-mode). Girinti komutları gibi değişiklik yapma potansiyeli olan diğer komutlar, arabelleği değiştirilmiş olarak işaretlemez veya hiçbir şey değiştirilmezse geri alınamaz bir eylem oluşturmaz. fill-paragraphTamponu değiştirilmiş hale getirmenin ve sadece bir şeyi değiştirdiğinde geri alınamaz bir eylem oluşturmanın herhangi bir yolu var mı ?


Bunun doğru olduğunu düşünmüyorum - M-qen azından testimden varsayılan olarak değiştirilen arabelleği işaretlemiyor. Hangi modu kullanıyorsunuz? Modun bir şekilde üzerine yazdığını tahmin ediyorum fill-paragraph.
shosti

@shosti Temel mod kullanıyorum. Paragrafın birden fazla satır uzunluğunda olması gerekir (düzgün doldurulduğunda).
Lily Chung

Ah tamam şimdi görüyorum.
shosti

Yanıtlar:


2

Bunun daha yeni Emacsen için düzeltildiğini unutmayın (v.26 yukarı doğru).


10

Sorun şu ki fill-paragraph(ya da daha doğrusu fill-region-as-paragraph), yeni satırları paragrafınızı bozurken kaldırır ve yeniden ekler. Yalnızca bir satır varsa arabelleği değiştirmez. Tanık olduğunuz geri alma listesindeki no-op yalnızca fill-paragraphyeni satırları kaldırmak ve yeniden eklemek.

Bundan kaçınmak önemsiz değildir. Aşağıdaki oldukça kötü bir hack ve büyük tamponlar için son derece verimsiz, ama belki sizin için çalışıyor. Komut aynı davranışı taklit eder fill-paragraph( M-q), ancak arabellek içeriğini çağırmadan önce saklar ve daha sonra içerik aynı kalırsa, değişiklik durumunu geri yükler ve değişiklikten önce listeyi geri alır. Bunu yapmak için, arabellek içeriğinin bir kopyasına (aslında iki tane) ihtiyacı vardır, bu yüzden gerçekten, bu oldukça verimsizdir. :-)

(defun my/fill-paragraph (&optional justify region)
  (interactive (progn
                 (barf-if-buffer-read-only)
                 (list (if current-prefix-arg 'full) t)))
  (let ((old-text (buffer-string))
        (old-modified (buffer-modified-p))
        (old-undo-list buffer-undo-list))
    (fill-paragraph justify region)
    (when (equal old-text (buffer-string))
      (setq buffer-undo-list old-undo-list)
      (set-buffer-modified-p old-modified))))

Bunu ona bağlayabilirsiniz M-q.


1
Evet, bu uzun süredir acı çekiyor. ;-) Bunun için bir düzeltme daha önce talep edilip edilmediğini merak ediyorum (hatırlamıyorum). Öyle görünüyor.
Drew

Hmmm. Tüm tamponu kontrol etmek zorunda olmayan daha iyi bir çözüm olup olmadığını merak ediyorum - belki sadece seçilen paragrafı bir şekilde kontrol edebilir?
Lily Chung

fill-paragraphçeşitli durumlar arasında bazı ayrımlar yapar, yani etkin bir bölgeye, mevcut dolgu paragrafı işlevlerine vb. bağlı olarak farklı davranır. Tamponun hangi bölümlerinin gerçekten değiştirileceğini anlamak için bu davranışı çoğaltmanız gerekir. Mümkün ama zor. :-)
Jorgen Schäfer

@ Çizim Geçen yıl posta listesinde uzun bir tartışma yapıldı: bug # 13949: 24.3.50; 'dolgu paragrafı' her zaman arabelleği değiştirildiği gibi
koymamalıdır

@dkim: Evet, şimdi hatırlıyorum. Ve hiçbir şey gelmedi ...
Drew

1

Geç cevap, ancak metin değişmezse arabelleği değiştirmeyen basit bir sürüm.

(defun my-fill-paragraph (&optional justify region)
  "Fill paragraph, but don't modify the buffer if filling doesn't
change the text.  See `fill-paragraph' for details."
  (interactive (progn
                 (barf-if-buffer-read-only)
                 (list (if current-prefix-arg 'full) t)))
  (if (buffer-modified-p)
      ;; if modified: use standard fill-paragraph
      (fill-paragraph justify region)
    ;; if unmodified: get a candidate filled version
    (save-excursion
      (let* ((col fill-column)
             (beg (progn (forward-paragraph -1)
                         (skip-syntax-forward " >")
                         (point)))
             (end (progn (forward-paragraph 1)
                         (skip-syntax-backward " >")
                         (point)))
             (old (buffer-substring-no-properties beg end))
             (new (with-temp-buffer
                    (setq fill-column col)
                    (insert old)
                    (fill-paragraph justify region)
                    (buffer-string))))
        ;; don't modify unless the old and new versions differ
        (unless (string-equal old new)
          (delete-region beg end)
          (insert new))))))

@ JorgenSchäfer'in cevabındaki bazı fikirleri uyarlar, ancak sadece mevcut paragrafla ve yalnızca boşlukla ayrılmış basit bir şekilde çalışır (@ JorgenSchäfer'in başlık altındaki komplikasyonlar hakkındaki cevabı hakkındaki yorumlara bakın).

Bu, kendi amaçlarım için alakalı olan tek kullanım durumu ile ilgilidir (yani, "normal" nesir ile etkileşimli kullanım, aktif bölge yok), bu yüzden herkesin bunu kullanmak veya daha karmaşık kullanım durumları için geliştirmek istemesi durumunda gönderiyorum .

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.