ตอบช้ากว่า แต่นี่เป็นเวอร์ชั่นง่าย ๆ ที่ไม่ได้แก้ไขบัฟเฟอร์หากข้อความไม่เปลี่ยนแปลง
(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 แต่ทำงานได้กับย่อหน้าปัจจุบันเท่านั้นและใช้วิธีแยกช่องว่างอย่างง่าย (ดูความคิดเห็นเกี่ยวกับคำตอบของ @ JorgenSchäferเกี่ยวกับภาวะแทรกซ้อนภายใต้ฝากระโปรง)
นี่เป็นเรื่องเกี่ยวกับกรณีการใช้งานเพียงอย่างเดียวที่เกี่ยวข้องกับวัตถุประสงค์ของตัวเอง (เช่นการใช้งานแบบโต้ตอบกับร้อยแก้ว "ปกติ" ไม่มีภูมิภาคที่ใช้งานอยู่) ดังนั้นฉันจึงโพสต์มันในกรณีที่ใครก็ตามต้องการใช้มันหรือปรับปรุงมัน .
M-q
ต้อง - ไม่ทำเครื่องหมายว่าบัฟเฟอร์เปลี่ยนโดยค่าเริ่มต้นอย่างน้อยจากการทดสอบของฉัน คุณกำลังใช้โหมดอะไร ฉันเดาว่าโหมดนั้นเขียนทับไม่fill-paragraph
ทางใดก็ทางหนึ่ง