Kod yorumları için tam otomatik doldurma paragrafı modu var mı?


18

Ben yazarken paragrafları her zaman dolu tutmak için küçük bir mod arıyorum ( aggressive-indent-modegirinti için ne benzer ). Ayrıca yalnızca yorumları (ve dile bağlı olarak dizeleri) dolduracak kadar akıllı olmalıdır.

Denediğim bazı şeyler:

  • auto-fill-mode yeni paragraflar yazarken otomatik olarak dolar, ancak paragrafları düzenlediğinizde yeniden doldurulmaz.

  • refill-mode paragrafları sürekli olarak yeniden doldurur ancak kodu paragrafların yanı sıra yorumlara da sarmaya çalışır.

  • Ben ekleyerek çalıştı fill-paragraphiçin after-change-functionskanca ama geri alma ve diğer şeylerin bol yukarı vidalar (bu muhtemelen tüm tamir edilebilir ama biraz çaba alacaktı).

Daha iyi bir fikrin var mı?


6
Bir yana: Glickstein'ın Yazma GNU Emacs Uzantıları bölüm 7, peşinde olduğunuz işlevselliği nasıl uygulayabileceğiniz üzerinde ilerliyor. Elisp ile öğrenmek / pratik yapmak için harika bir fırsat olabilir.
Dan

Otomatik doldurma paragrafını (otomatik doldurma etkinken) arıyorumorg-mode , ancak rebox2'yi
CodyChan

Yanıtlar:


4

Bu işlevselliği uygulamak için minimal bir yol buldum: sadece aramak için boşluk çubuğunu bağlayın (fill-paragraph)!

(defun fill-then-insert-space ()
  (interactive)
  (fill-paragraph)
  (insert " "))
(global-set-key (kbd "SPC") #'fill-then-insert-space)

Şimdiye kadar karşılaştığım birkaç uyarı var:

  1. elisp-mode(muhtemelen diğerleri) aradığınızda bazı fantezi kod doldurma yapar fill-paragraph, bu istediğiniz olabilir veya olmayabilir. Muhtemelen nokta bir yorum veya doktora olup olmadığını test ederek düzeltilebilir, ancak bunu nasıl yapacağımdan emin değilim.

  2. Bazen birden fazla boşluğa kolayca giremezsiniz (çünkü fill-paragrapharkadaki boşlukları öldürür). Boşluk çubuğu artık just-one-spacebu bağlamayı değiştirmenin uygun olduğu gibi davrandığından (insert " ").

Ben bu işlevi içeren küçük bir mod, bu bulunanlarda yapılan github veya melpa paketinde aggressive-fill-paragraph.


Çok aggressive-fill-paragraphdaha az agresif olan refill-mode, oldukça işe yaramaz olana kadar agresif olan ironik buluyorum ( > yeniden doldurma modu yeniden düzenleme şeyleri olmayan birini bile teklif edemediğiniz için: değiştirme için regexps kullansanız bile) .
Hi-Angel

1

Nasıl doldurma modu davranır isterseniz (I do not: p), ancak zaman o davranır doğru şartlarda değiliz ne zaman, onu inhibe ederek nispeten kolay düzeltme olmalıdır

Örneğin

(defvar plop/refill-enabler-function nil)

(defun plop/region-in-comment (beg end)
  ;; should really be comment-only-p, but that seems really broken for me
  (not
   (loop for c from beg to end
      if (not (eq 'font-lock-comment-face (get-char-property c 'face)))
      return t)))

(defun plop/refill-after-change-function (beg end len)
  (unless undo-in-progress
    (when (and plop/refill-enabler-function
               (funcall plop/refill-enabler-function beg end))
      (setq refill-doit end))))

(defun plop/install-refill-hack ()
  (if refill-mode
      (progn
        (add-hook 'after-change-functions 'plop/refill-after-change-function nil t)
        (remove-hook 'after-change-functions 'refill-after-change-function t))
    (progn
      (remove-hook 'after-change-functions 'plop/refill-after-change-function t))))

(defun plop/refill-hook ()
  (set (make-local-variable 'plop/refill-enabler-function)
       #'plop/region-in-comment)
  (add-hook 'refill-mode-hook 'plop/install-refill-hack t t)
  (refill-mode))

(add-hook 'some-hook 'plop/refill-hook)

Temel olarak, yeniden doldurmayı tetikleyen işlevi kaldırır after-change-functionsve yerine tam olarak aynı şeyi yapmadan önce bir yorumda olduğumuzu kontrol edecek bir işlevle değiştirir.


İyi bir başlangıç ​​gibi görünüyor, ancak yine de doğru değil: Bir yorum düzenlenirken bir yeniden doldurma tetiklenirse, çevredeki kod da dahil olmak üzere tüm paragrafı yeniden doldurur. Bu, çevredeki modun paragraf sınırlarını doğru bir şekilde tanımlamamasının hatası olabilir, ancak bundan şüphe ediyorum: Emacs Lisp modunda denedim, ki bu kitap tarafından bir şeyler yapıyor.
Gilles 'SO- kötü olmayı bırak

Peki, bu yüzden sevmediğimi söyledim refill-mode:) Sorun bunun yerine refill-modekullanır , böylece onurlandırma ve şeyleri potansiyel olarak dağınık hale getirme yeteneğini kaybetmefill-regionfill-paragraphfill-paragraph-function
Sigma
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.