遅い答えですが、テキストが変更されない場合にバッファを変更しない単純なバージョンを次に示します。
(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
何らかの方法で上書きされていると思います。