O problema é que fill-paragraph
(ou melhor, fill-region-as-paragraph
) removerá e reinserirá novas linhas enquanto divide seu parágrafo. Não modificará o buffer se houver apenas uma linha. O no-op na lista de desfazer que você testemunha está apenas fill-paragraph
removendo e reinserindo novas linhas.
Não é trivial evitar isso. A seguir, é um hack muito ruim e altamente ineficiente para buffers grandes, mas talvez funcione para você. O comando imita fill-paragraph
( M-q
) com o mesmo comportamento, exceto que ele armazena o conteúdo do buffer antes de chamá-lo e, posteriormente, se o conteúdo permanecer o mesmo, ele restaurará o estado de modificação e desfará a lista antes da alteração. Para fazer isso, ele precisa de uma cópia (duas, na verdade) do conteúdo do buffer; portanto, isso é realmente ineficiente. :-)
(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))))
Você pode vincular isso M-q
.
M-q
não marca o buffer alterado por padrão, pelo menos nos meus testes. Que modo você está usando? Eu acho que o modo está sobrescrevendofill-paragraph
de alguma forma.