Apakah ada mode paragraf isian otomatis untuk komentar kode?

18

Saya mencari mode minor untuk membuat paragraf terisi setiap saat saat mengetik (mirip dengan apa yang aggressive-indent-modedilakukan lekukan). Itu juga harus cukup pintar untuk hanya mengisi komentar (dan mungkin string tergantung pada bahasa).

Beberapa hal yang saya coba adalah:

  • auto-fill-mode secara otomatis mengisi saat Anda mengetik paragraf baru tetapi tidak mengisi ulang saat Anda mengedit paragraf.

  • refill-mode tidak secara konstan mengisi ulang paragraf tetapi mencoba untuk membungkus kode menjadi paragraf serta komentar.

  • Saya mencoba menambahkan fill-paragraphke after-change-functionspengait tetapi mengacaukan membatalkan dan banyak hal lainnya (ini mungkin semua diperbaiki tetapi akan membutuhkan usaha).

Ada ide yang lebih baik?

dshepherd
sumber
6
Selain itu: bab 7 dari Glickstein Writing, GNU Emacs Extensions membahas bagaimana Anda dapat mengimplementasikan fungsionalitas yang Anda cari. Mungkin menjadi peluang besar untuk belajar / berlatih dengan elisp.
Dan
Saya mencari paragraf isi-otomatis (dengan isi-otomatis diaktifkan) org-mode, tetapi Anda dapat mencoba rebox2
CodyChan

Jawaban:

4

Saya datang dengan cara minimal menerapkan fungsi ini: cukup ikat spasi untuk juga menelepon (fill-paragraph)!

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

Ada beberapa peringatan yang saya temukan sejauh ini:

  1. elisp-mode(mungkin orang lain) melakukan beberapa kode mewah yang mengisi saat Anda menelepon fill-paragraph, ini mungkin atau mungkin bukan yang Anda inginkan. Mungkin bisa diperbaiki dengan menguji apakah titik ada di komentar atau docstring tapi saya tidak yakin bagaimana melakukannya.

  2. Anda kadang-kadang tidak dapat dengan mudah memasukkan beberapa spasi (karena fill-paragraphmembunuh semua spasi tambahan). Karena space-bar sekarang bertindak seperti just-one-spaceitu mungkin ok untuk menggantikan yang mengikat (insert " ").

Saya membuat mode minor yang berisi fungsi ini, tersedia di github atau dalam paket melpa aggressive-fill-paragraph.

dshepherd
sumber
Saya merasa ironis yang aggressive-fill-paragraphjauh lebih tidak agresif daripada refill-mode, yang agresif sampai menjadi sangat tidak berguna (karena Anda bahkan tidak dapat mengutip seseorang dengan > tanpa mengatur ulang barang-barang mode: bahkan jika Anda menggunakan regexps untuk penggantian) .
Hi-Angel
1

Jika Anda suka bagaimana mode isi ulang berperilaku (saya tidak: p) tetapi tidak ketika berperilaku, seharusnya relatif mudah untuk memperbaikinya dengan menghambatnya setiap kali Anda tidak berada dalam kondisi yang tepat

Sebagai contoh

(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)

Pada dasarnya itu menghapus fungsi yang memicu isi ulang dari after-change-functionsdan menggantikannya dengan yang akan memeriksa apakah kita dalam komentar sebelum melakukan hal yang persis sama.

Sigma
sumber
Sepertinya ini awal yang baik, tetapi masih kurang tepat: jika isi ulang dipicu saat mengedit komentar, isi ulang seluruh paragraf, termasuk kode di sekitarnya. Ini mungkin kesalahan mode di sekitarnya karena tidak mendefinisikan batas paragraf dengan benar, tetapi saya ragu: Saya mencoba dalam mode Emacs Lisp, yang saya anggap melakukan hal-hal berdasarkan buku.
Gilles 'SO- stop being evil'
baik, itu sebabnya saya bilang saya tidak suka refill-mode:) Masalahnya adalah refill-modemenggunakan fill-regionbukan fill-paragraph, sehingga kehilangan kemampuan untuk menghormati fill-paragraph-functiondan membuat hal-hal yang berpotensi berantakan
Sigma