Trên hệ thống thực sự chỉnh sửa bộ đệm, có phải emacs chạy ediff-current-file không?


11

Bối cảnh

Khi emacs phát hiện ra rằng một tập tin đã được thay đổi bên ngoài bộ đệm chỉnh sửa.

Được Quan sát

emacs sẽ hỏi:

somefilename đã thay đổi trong đĩa; thực sự chỉnh sửa bộ đệm? (y, n, r hoặc Ch)

(Ngẫu nhiên, đôi khi nó xảy ra ngay cả khi không có thay đổi thực sự, ví dụ: tệp từ xa trên máy chủ có đồng hồ bị trôi, nhưng câu hỏi rất thú vị trong mọi trường hợp.)

Chúc

emacs sẽ hỏi:

somefilename đã thay đổi trong đĩa; thực sự chỉnh sửa bộ đệm? (y, n, r, d hoặc Ch)

Nhấn dsẽ cho thấy sự khác biệt giữa các phiên bản, ví dụ ediff-current-filecho phép đi qua sự khác biệt một cách tương tác.

Thông tin thêm

Điều đó sẽ tương tự như những gì quản lý gói Debian thực hiện khi phát hiện tệp cấu hình được tùy chỉnh cục bộ được cập nhật bởi phiên bản mới hơn của gói sở hữu. Để biết ví dụ, hãy xem Phiên bản mới của tệp cấu hình / etc / default / grub, nhưng phiên bản được cài đặt hiện đã được sửa đổi cục bộ - Unix & Linux Stack Exchange

Tìm kiếm trước khi bạn hỏi

Tôi thường tìm đường đến các giải pháp (ví dụ: emacsclient - Từ một tập lệnh bên ngoài, mở tệp và chạy một số biểu thức đơn giản cho dù emacs đã chạy hay chưa - Emacs Stack Exchange ) nhưng sau khi tìm kiếm trên này, tôi không thể tìm thấy bất kỳ giải pháp nào hiện có.

Tôi sẽ xem xét điều chỉnh bản thân mình nhưng không đủ thành thạo trong nội bộ emacs-lisp và emacs.

Phác thảo giải pháp

  • Nhấn C-grồi 'Mx ediff-current-file` thực hiện công việc, với chi phí của một số tổ hợp phím.
  • Mục tiêu ở đây sẽ là chạy ediff-current-filetrên một phím bấm tại dấu nhắc trên.


@Gilles cảm ơn bạn. Vâng, liên quan và khác nhau. Liên kết của bạn là về thời gian mở tập tin. Đây là về thời gian tiết kiệm tập tin.
Stéphane Gourichon

Câu trả lời:


2

grepping cho "thực sự chỉnh sửa bộ đệm" trong nguồn emacs tôi tìm thấy chức năng ask-user-about-supersession-threattrong tập tin userlock.el.

Có vẻ đơn giản để thêm một dsự lựa chọn cho cuộc gọi ediff-current-file. Mặc dù vậy, tôi chưa thử nghiệm rộng rãi điều này (các chỉnh sửa được đánh dấu bằng các ;;-bình luận).

(defun ask-user-about-supersession-threat (fn)
  "Ask a user who is about to modify an obsolete buffer what to do.
This function has two choices: it can return, in which case the modification
of the buffer will proceed, or it can (signal 'file-supersession (file)),
in which case the proposed buffer modification will not be made.

You can rewrite this to use any criterion you like to choose which one to do.
The buffer in question is current when this function is called."
  (discard-input)
  (save-window-excursion
    (let ((prompt
       (format "%s changed on disk; \
really edit the buffer? (y, n, r, d or C-h) " ;;- changed
           (file-name-nondirectory fn)))
      (choices '(?y ?n ?r ?d ?? ?\C-h))       ;;- changed
      answer)
      (while (null answer)
    (setq answer (read-char-choice prompt choices))
    (cond ((memq answer '(?? ?\C-h))
           (ask-user-about-supersession-help)
           (setq answer nil))
          ((eq answer ?r)
           ;; Ask for confirmation if buffer modified
           (revert-buffer nil (not (buffer-modified-p)))
           (signal 'file-supersession
               (list "File reverted" fn)))
          ((eq answer ?d)                     ;;- added
           (ediff-current-file))              ;;- added
          ((eq answer ?n)
           (signal 'file-supersession
               (list "File changed on disk" fn)))))
      (message
       "File on disk now will become a backup file if you save these changes.")
      (setq buffer-backed-up nil))))

Có vẻ hoạt động tốt trên emacs 46.1 trên Ubuntu 16.04. Cảm ơn!
Stéphane Gourichon
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.