Dấu nhắc bộ đệm với tùy chọn để làm thay đổi các thay đổi


8

Các save-some-bufferslệnh nhắc nhở để tiết kiệm hoặc bỏ qua mỗi tập tin sửa đổi, và cũng cung cấp một tùy chọn để diff file sửa đổi so với tập tin đó là truy cập.

Tôi muốn hành vi tương tự từ kill-bufferhoặc kill-this-buffer. Nếu bộ đệm được sửa đổi, đã có dấu nhắc có / không nhưng tôi cũng muốn tùy chọn xem khác biệt.

Có một cách tích hợp để làm điều này, hoặc một điểm mở rộng thích hợp? Hay tôi chỉ nên ràng buộc lệnh kill-buffer của riêng mình?


Bạn có thể muốn xem xét defadvice. Điều này sẽ cho phép bạn dễ dàng mở rộng tích hợp kill-buffer.
mẫu

Sử dụng lời khuyên 'trước' ở đây dường như có thể so sánh với việc viết lệnh của riêng tôi, điều tôi có thể làm: Tôi sẽ trình bày lời nhắc của riêng mình và nếu người dùng muốn tiếp tục và tắt bộ đệm, tôi đoán tôi có thể đặt buffer-modified-pvà gọi bản gốc kill-bufferđể tiếp tục giết mà không cần một dấu nhắc khác. Tôi tự hỏi nếu có một cách tốt hơn, nhưng có thể cho điều này đi.
glucas

Ồ Tôi đã sử dụng được save-some-buffersmột vài năm và chưa bao giờ biết nó có một difftính năng ... Cảm ơn!
mbork

@nanny Cuối cùng tôi đã sử dụng lời khuyên cho việc này - xem câu trả lời của riêng tôi dưới đây. Cho đến nay nó có vẻ hoạt động tốt, cảm ơn.
glucas

Câu trả lời:


6

Câu hỏi lớn là liệu bạn có muốn hành vi này cho kill-bufferchính nó hay không, điều đó có nghĩa là không chỉ khi bạn gọi nó một cách tương tác mà còn cho mỗi lần sử dụng nó trong mã Lisp hiện tại, hoặc bạn chỉ muốn nó sử dụng cho tương tác.

Tôi sẽ giả sử cái sau. Trong trường hợp đó, hãy để kill-bufferyên, xác định lệnh của riêng bạn thực hiện những gì bạn muốn và ánh xạ lại các khóa thường được ràng buộc với kill-bufferlệnh của bạn:

(global-set-key [remap kill-buffer] 'my-kill-buffer)

Đối với my-kill-bufferlệnh của bạn , chỉ cần kiểm tra ngay từ đầu xem bộ đệm đã được sửa đổi chưa, và nếu vậy thì khởi chạy ediffcho nó.

Để kiểm tra xem nó đã được sửa đổi, sử dụng buffer-modified-p.

Để ediffbạn có lẽ sẽ muốn lấy các tập tin (ví dụ, bộ đệm như lưu), và diff nó ngược dòng, sửa đổi đệm. Bạn có thể cần mân mê một chút để làm điều đó - tôi không biết về một edifflệnh hiện có thực hiện điều đó.

Nhưng có lẽ tất cả những gì bạn thực sự cần là một cái gì đó như highlight-changes-mode. Xem hướng dẫn sử dụng Emacs, nút Highlight Interactively. Nói cách khác, có lẽ tất cả những gì bạn cần là gọi highlight-changes-modenếu bộ đệm đã được sửa đổi.


Cảm ơn @Drew, tôi sẽ viết lệnh giết của riêng tôi. Một vài bit hữu ích: Tôi có thể sử dụng diff-buffer-with-fileđể tạo ra các khác biệt. Cũng có vẻ như tôi cần gọi set-buffer-modified-pnếu tôi muốn tiếp tục và giết mà không được nhắc lại từ triển khai gốc.
glucas

5

Dựa trên các câu trả lời và nhận xét khác, đây là một lệnh kill tùy chỉnh cung cấp tùy chọn để tìm khác biệt bộ đệm đã sửa đổi với tệp mà nó đang truy cập. Tôi đã ánh xạ nó tới C-x C-knhưng cũng có thể ánh xạ lại kill-buffernhư được đề xuất trong câu trả lời của @ Drew.

(defun my/kill-this-buffer ()
  (interactive)
  (catch 'quit
    (save-window-excursion
      (let (done)
        (when (and buffer-file-name (buffer-modified-p))
          (while (not done)
            (let ((response (read-char-choice
                             (format "Save file %s? (y, n, d, q) " (buffer-file-name))
                             '(?y ?n ?d ?q))))
              (setq done (cond
                          ((eq response ?q) (throw 'quit nil))
                          ((eq response ?y) (save-buffer) t)
                          ((eq response ?n) (set-buffer-modified-p nil) t)
                          ((eq response ?d) (diff-buffer-with-file) nil))))))
        (kill-buffer (current-buffer))))))

Sử dụng thực hiện cơ bản tương tự, bạn cũng có thể tư vấn kill-buffer. Với phương pháp này, bạn có tùy chọn để xem các khác biệt ở bất cứ nơi nào kill-bufferđược gọi - ví dụ: khi tiêu diệt bộ đệm được đánh dấu từ Ibuffer.

(defun my/kill-buffer (orig-func &optional buffer-or-name)
  (catch 'quit
    (save-window-excursion
      (with-current-buffer buffer-or-name
        (let (done (buf (current-buffer)))
          (when (and buffer-file-name (buffer-modified-p))
            (while (not done)
              (let ((response (read-char-choice
                               (format "Save file %s? (y, n, d, q) " (buffer-file-name buf))
                               '(?y ?n ?d ?q))))
                (setq done (cond
                            ((eq response ?q) (throw 'quit nil))
                            ((eq response ?y) (save-buffer) t)
                            ((eq response ?n) (set-buffer-modified-p nil) t)
                            ((eq response ?d) (diff-buffer-with-file) nil))))))
          (apply orig-func (list (current-buffer))))))))

(advice-add 'kill-buffer :around #'my/kill-buffer)

Một vấn đề bây giờ là tôi đã sử dụng điều này một chút: vòng lặp read-char không cho phép cuộn các khác biệt hoặc thực hiện các hành động khác. Tôi có lẽ cần phải sử dụng cách tiếp cận được thực hiện bởi map-y-or-np.
glucas
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.