Проблема в том, что fill-paragraph
(или, скорее, fill-region-as-paragraph
) удалит и повторно вставит новые строки, пока он разбивает ваш абзац. Он не изменит буфер, если будет только одна строка. Нет в списке отмены, свидетелем которого вы являетесь, - это просто fill-paragraph
удаление и повторная вставка новых строк.
Это не тривиально, чтобы избежать этого. Следующее является довольно плохим хаком и крайне неэффективно для больших буферов, но, возможно, оно работает для вас. Команда mimics fill-paragraph
( M-q
) действует идентично, за исключением того, что она сохраняет содержимое буфера до его вызова, а затем, если содержимое остается прежним, восстанавливает состояние изменения и список отмены до изменения. Для этого ему нужна копия (фактически две) содержимого буфера, так что на самом деле это довольно неэффективно. :-)
(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))))
Вы можете связать это с M-q
.
M-q
- не помечает буфер, измененный по умолчанию, по крайней мере, из моего тестирования. Какой режим вы используете? Я предполагаю, что режим перезаписываетсяfill-paragraph
каким-то образом.