tập tin đánh dấu đoạn văn đã thay đổi, ngay cả khi nó không làm gì cả


11

Bất cứ khi nào tôi gọi fill-paragraph, bộ đệm luôn được đánh dấu là đã sửa đổi, ngay cả khi lệnh không có hiệu lực (tức là nếu đoạn văn đã được điền). Nó cũng tạo ra một hành động hoàn tác trống rỗng (dễ dàng phát hiện với undo-tree-mode). Các lệnh khác có khả năng thực hiện thay đổi, chẳng hạn như các lệnh thụt lề, không đánh dấu bộ đệm là đã sửa đổi hoặc tạo một hành động không thể xóa được nếu không có gì thay đổi. Có cách nào để fill-paragraphđánh dấu bộ đệm được sửa đổi và tạo ra một hành động không thể hoàn tác chỉ khi nó thực sự thay đổi một cái gì đó?


Tôi không nghĩ rằng điều này là đúng-- M-qkhô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-paragraphtheo một cách nào đó.
shosti

@shosti Tôi đang sử dụng chế độ Cơ bản. Đoạn văn phải dài hơn một dòng (khi được điền đúng).
Lily Chung

Ah OK tôi thấy nó bây giờ.
shosti

Câu trả lời:


2

Lưu ý rằng điều này được cố định cho Emacsen mới hơn (v.26 trở lên).


10

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-paragraphloạ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.


1
Vâng, điều này từ lâu đã là một nỗi đau. ;-) Tôi tự hỏi (tôi không nhớ lại) liệu một sửa chữa cho điều này đã được yêu cầu trước đó. Có vẻ như nó sẽ được.
vẽ

Hừm. Tôi tự hỏi nếu có một giải pháp tốt hơn mà không phải kiểm tra toàn bộ bộ đệm - có thể nó chỉ có thể kiểm tra đoạn đã chọn?
Lily Chung

fill-paragraphcó một số khác biệt giữa các trường hợp khác nhau, tức là hành xử khác nhau tùy thuộc vào vùng hoạt động, chức năng đoạn văn hiện có, v.v. Bạn phải sao chép hành vi đó để tìm ra phần nào của bộ đệm thực sự sẽ bị thay đổi. Có thể, nhưng khó khăn. :-)
Jorgen Schäfer

@Drew Đã có một cuộc thảo luận dài về nó trong danh sách gửi thư năm ngoái: bug # 13949: 24.3.50; 'Đoạn văn không nên luôn luôn đặt bộ đệm như đã sửa đổi
dkim

@dkim: Vâng, tôi nhớ rồi. Và không có gì đến từ nó ...
vẽ

1

Trả lời muộn, nhưng đây là phiên bản đơn giản không sửa đổi bộ đệm nếu văn bản không thay đổi.

(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))))))

Nó điều chỉnh một số ý tưởng trong câu trả lời của @ JorgenSchäfer, nhưng chỉ hoạt động với đoạn hiện tại và chỉ theo cách đơn giản, tách biệt khoảng trắng (xem nhận xét về câu trả lời của @ JorgenSchäfer về các biến chứng dưới mui xe).

Đây là về trường hợp sử dụng duy nhất phù hợp với mục đích của riêng tôi (nghĩa là sử dụng tương tác với văn xuôi "bình thường", không có vùng hoạt động), vì vậy tôi sẽ đăng nó trong trường hợp bất kỳ ai muốn sử dụng hoặc cải thiện nó cho các trường hợp sử dụng phức tạp hơn .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.