Làm thế nào để sửa đổi một bộ đệm mà không hoàn tác?


11

Q: Làm cách nào để chèn / sửa đổi văn bản trong bộ đệm mà không undonhận thấy?

Đây là trường hợp sử dụng. Tôi có một khối nhận xét ở đầu mỗi tệp, trong số những thứ khác, cập nhật dấu thời gian cho thay đổi gần đây nhất của tệp. Tôi muốn có thể sửa đổi dấu thời gian đó mà không cần các undocơ sở nhận thấy nó.

Lý do tôi muốn đoản mạch undoở đây là do trường hợp cạnh sau xuất hiện khi chỉnh sửa / biên dịch tài liệu LaTeX (và có thể là các tài liệu khác, nhưng đây là trường hợp khiến tôi khó chịu nhất):

  1. Thực hiện một thay đổi nhỏ cho tệp để xem nó sẽ ảnh hưởng đến tài liệu đã biên dịch như thế nào
  2. Lưu tệp (cập nhật dấu thời gian)
  3. Chạy latextrên tập tin
  4. Quyết định rằng sự thay đổi là một điều xấu
  5. undo những thay đổi

Vấn đề ở bước (5) ( undo) là nó không hoàn tác thay đổi được thực hiện ở bước (1), mà là hoàn tác dấu thời gian cập nhật ở bước (2). Điều đó sẽ không làm phiền tôi (tôi chỉ có thể undomột lần nữa) ngoại trừ việc nó cũng di chuyển điểm đến dấu thời gian ở đầu tệp, gần như luôn luôn là rất nhiều, rất nhiều so với thay đổi thực sự. Nó rất chói tai và phá vỡ hoàn toàn sự tập trung của tôi.

Tôi đang đặt câu hỏi liên quan đến một tập tin tôi đang truy cập, nhưng nói chung là về việc sửa đổi bộ đệm.

Vì vậy: làm thế nào tôi có thể ngăn không undonhận thấy một sửa đổi cụ thể đối với bộ đệm?


1
Điều này không liên quan đến câu hỏi hoàn tác của bạn, nhưng nó có thể giúp giải quyết vấn đề "hoàn tác di chuyển điểm": stackoverflow.com/a/20510025/1279369
nanny

2
Sẽ không phải là tốt nhất nếu thay đổi tem ngày này được thêm vào mục gần đây nhất trong lịch sử hoàn tác? Cách đó undosẽ hoàn tác cả hai.
Malabarba

Tôi nghĩ những gì bạn thực sự muốn là atomic-change-group.

@john: Làm thế nào sẽ giúp? Hai thay đổi đối với nhóm được kích hoạt bằng các lệnh riêng biệt: một thay đổi nhỏ của LĐNH (ví dụ: chèn) và cập nhật dấu thời gian được thực hiện trong khi lưu.
Gilles 'SO- ngừng trở nên xấu xa'

Lưu ý rằng vì một số lý do, không có phương pháp nào trong các câu trả lời hiện tại có hiệu quả với tôi, tuy nhiên câu trả lời này xác định một with-undo-collapsemacro rất hữu ích: emacs.stackexchange.com/a/7560/2418
ideaman42

Câu trả lời:


6

Câu trả lời của @ stsquad đã đưa tôi đi đúng hướng. Về cơ bản, các bước là:

  1. tiết kiệm buffer-undo-list
  2. vô hiệu hóa undo
  3. làm việc của bạn
  4. kích hoạt undolại và khôi phụcbuffer-undo-list

Vì vậy, đây là một bản phác thảo của một chức năng như vậy:

(defun disable-undo-one-off ()
  (let ((undo buffer-undo-list))        ; save the undo list
    (buffer-disable-undo)               ; disable undo
    (do-some-stuff)                     ; do your thing
    (buffer-enable-undo)                ; re-enable undo
    (setq buffer-undo-list undo)))      ; restore the undo list

Chỉnh sửa: trên thực tế, hóa ra một giải pháp đơn giản hơn vẫn chỉ đơn giản là tìm letkiếm buffer-undo-listđể thay đổi danh sách trong phần thân letbị ghi đè khi danh sách ban đầu được khôi phục:

(defun disable-undo-one-off ()
  (let (buffer-undo-list)
    (do-some-stuff)))

Hạn chế chính của điều này là nó dường như hoạt động đối với các sửa đổi không thay đổi số lượng ký tự trong bộ đệm (ví dụ: thay đổi "mèo con" thành "chó con", nhưng không phải là "mèo"), vì nếu không thì phần còn lại của hoàn tác danh sách hiện đang đề cập đến các điểm sai. Do đó, đây chỉ là một giải pháp một phần .


Bạn có thể muốn bọc nó trong một thư giãn bảo vệ trong trường hợp bạn thoát ra khỏi hoạt động giữa chừng. Tôi không nhận ra bạn đang làm tất cả những điều này trong một chức năng giúp việc theo dõi mọi thứ dễ dàng hơn.
stsquad

Bạn cũng có thể thêm vào giải pháp cho cập nhật dấu thời gian để không cập nhật lịch sử hoàn tác (và lịch sử điểm, nếu có thể)?
Kaushal Modi

@stsquad: ý kiến ​​hay, sẽ cố gắng thực hiện sau. Cảm ơn một lần nữa cho các mẹo về các chức năng và danh sách trong câu hỏi.
Dân

@kaushalmodi: làm rõ câu hỏi: có nghĩa là bạn muốn xem chức năng cập nhật dấu thời gian thực tế?
Dân

@Dan Muốn xem cách sửa đổi chức năng cập nhật dấu thời gian để không cập nhật lịch sử hoàn tác hoặc điểm.
Kaushal Modi

3

Một hoạt động hoàn tác kết hợp một số yếu tố từ danh sách hoàn tác . Một nilmục trong danh sách đánh dấu ranh giới giữa hai nhóm thay đổi. Bằng cách xóa phần nilđầu của danh sách được tự động chèn bởi vòng lặp toplevel¹, bạn có thể nhóm cập nhật dấu thời gian với thay đổi bộ đệm cuối cùng, về mặt kỹ thuật không phù hợp với yêu cầu của bạn nhưng thực tế sẽ giải quyết vấn đề trong kịch bản của bạn.

(defun time-stamp-group-undo ()
  (if (eq nil (car buffer-undo-list))
      (setq buffer-undo-list (cdr buffer-undo-list)))
  (time-stamp))

(Cảnh báo: chưa được kiểm tra, danh sách hoàn tác có thể yêu cầu mát xa nhiều hơn.)

Bạn cũng có thể chơi với danh sách hoàn tác theo một cách khác, bằng cách sửa đổi mục nhập vị trí (một số nguyên) để cập nhật dấu thời gian.

Thực hiện loại bỏ tương tự như chèn vào nhóm. self-insert-command


2

Vấn đề với những gì bạn đề xuất là cây hoàn tác là một danh sách các vùng đồng bằng để đi từ nơi bạn đến đến nơi bạn muốn. Mặc dù hoàn toàn có thể vô hiệu hóa hoàn tác theo dõi trên bộ đệm nhưng tôi không chắc tác động của việc không chủ động ghi lại các thay đổi sẽ là gì. Tôi hiện đang có một chuyển đổi để bật / tắt hoàn toàn trên một bộ đệm cụ thể vì sẽ không có ý nghĩa để hoàn tác thông tin trên nhật ký đang phát triển hoặc trang làm mới. Tuy nhiên, nó kết hợp các thay đổi trên chuyển đổi:

(defun my-toggle-buffer-undo ()
  "Toggle undo tracking in current buffer."
  (interactive)
  (with-current-buffer (current-buffer)
    (if (eq buffer-undo-list t)
        (setq buffer-undo-list nil)
      (buffer-disable-undo (current-buffer)))))

(define-key my-toggle-map "u" 'my-toggle-buffer-undo)

đệm-vô hiệu hóa-hoàn tác thực sự chỉ thiết lập danh sách đệm-hoàn tác thành nil . Có lẽ nếu bạn đã lưu trạng thái của danh sách đệm vào danh sách bạn chuyển đổi, bạn có thể khôi phục nó sau đó không?

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.