Проблема полягає в тому, що fill-paragraph
(а точніше, fill-region-as-paragraph
) буде видаляти та вставляти нові рядки під час розбиття вашого абзацу. Він не змінить буфер, якщо є лише один рядок. Відмова в списку скасування, про який ви свідчите, лише fill-paragraph
видаляє та вставляє нові рядки.
Уникнути цього нетривіально. Далі йде досить поганий злом і дуже неефективний для великих буферів, але, можливо, він працює для вас. Команда імітує 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
якимось чином перезаписується .