Vấn đề là fill-paragraph
(hoặc đúng hơn, fill-region-as-paragraph
) sẽ loại bỏ và chèn lại các dòng mới trong khi nó phá vỡ đoạn văn của bạn. Nó sẽ không sửa đổi bộ đệm nếu chỉ có một dòng. No-op trong danh sách hoàn tác mà bạn chứng kiến chỉ là fill-paragraph
loại bỏ và chèn lại dòng mới.
Nó là không tầm thường để tránh điều này. Sau đây là một bản hack khá tệ và kém hiệu quả đối với các bộ đệm lớn, nhưng có lẽ nó hiệu quả với bạn. Lệnh bắt chước fill-paragraph
( M-q
) với hành vi giống hệt nhau, ngoại trừ nó lưu trữ nội dung của bộ đệm trước khi gọi nó và sau đó, nếu nội dung giữ nguyên, nó sẽ khôi phục trạng thái sửa đổi và hoàn tác danh sách từ trước khi thay đổi. Để làm điều này, nó cần một bản sao (hai, thực sự) của nội dung bộ đệm, vì vậy thực sự, điều này khá không hiệu quả. :-)
(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))))
Bạn có thể ràng buộc điều đó với M-q
.
M-q
không đánh dấu bộ đệm được thay đổi theo mặc định, ít nhất là từ thử nghiệm của tôi. Bạn đang sử dụng chế độ nào? Tôi đoán chế độ này được ghi đèfill-paragraph
theo một cách nào đó.