Làm cách nào tôi có thể thoát ediff ngay lập tức mà không phải gõ 'y'


13

Khi tôi rời khỏi ediff với qtôi được hỏi nếu tôi thực sự muốn bỏ. Tôi thà bỏ nó ngay lập tức. Không có gì rõ ràng dưới sự tùy biến . Có một giải pháp ở đây dường như hoạt động bằng cách xác định lại qkhóa, nhưng tôi không chắc về chi tiết về cách thức hoạt động của chức năng. Cách đơn giản nhất để thoát khỏi thực sự có nghĩa là bỏ thuốc lá là gì?

Câu trả lời:


13

Bạn có thể tư vấn ediff-quitđể nó tự động bật y-or-n-plại một hàm trả về t.

(defun disable-y-or-n-p (orig-fun &rest args)
  (cl-letf (((symbol-function 'y-or-n-p) (lambda (prompt) t)))
    (apply orig-fun args)))

(advice-add 'ediff-quit :around #'disable-y-or-n-p)

Điều này là mạnh mẽ hơn để thay đổi ngược dòng hơn là xác định lại ediff-quit.


Nếu nó sẽ thông báo rằng nếu có bất kỳ bộ đệm khác nhau thay đổi, nó sẽ hoàn hảo.
CodyChan

5

Thật không may, tôi nghĩ rằng bạn phải rebind q hoặc điều chỉnh nguồn của ediff-quit. Như là rõ ràng trong nguồn của ediff-quitdấu nhắc luôn luôn xảy ra.

(defun ediff-quit (reverse-default-keep-variants)
  "Finish an Ediff session and exit Ediff.
Unselects the selected difference, if any, restores the read-only and modified
flags of the compared file buffers, kills Ediff buffers for this session
\(but not buffers A, B, C\).

If `ediff-keep-variants' is nil, the user will be asked whether the buffers
containing the variants should be removed \(if they haven't been modified\).
If it is t, they will be preserved unconditionally.  A prefix argument,
temporarily reverses the meaning of this variable."
  (interactive "P")
  (ediff-barf-if-not-control-buffer)
  (let ((ctl-buf (current-buffer))
    (ctl-frm (selected-frame))
    (minibuffer-auto-raise t))
    (if (y-or-n-p (format "Quit this Ediff session%s? "
              (if (ediff-buffer-live-p ediff-meta-buffer)
                  " & show containing session group" "")))
    (progn
      (message "")
      (set-buffer ctl-buf)
      (ediff-really-quit reverse-default-keep-variants))
      (select-frame ctl-frm)
      (raise-frame ctl-frm)
      (message ""))))

Tôi sẽ đề nghị xác định lại ediff-quittrong của bạn .emacsvà gửi một bản vá cho nguồn thêm một biến tùy chỉnh.

Hãy nhớ rằng nguồn thực hiện trong emacs luôn cách một vài tổ hợp phím. Giả sử các nguồn elisp được cài đặt, nhập C-h f, nhập tên hàm và theo liên kết đến nơi được xác định.


1

Tôi sử dụng rebind sau đây của q trong ediff. Nếu bất kỳ bộ đệm nào được sửa đổi, nó sẽ hỏi liệu chúng có được lưu hay không, sau đó nó sẽ thoát. Nếu không có bộ đệm được sửa đổi, nó chỉ thoát.

(add-hook 'ediff-startup-hook
          (lambda ()
            (local-set-key (kbd"q") 'my-ediff-quit)))

(defun my-ediff-quit ()
  "If any of the ediff buffers have been modified, ask if changes
should be saved. Then quit ediff normally, without asking for
confirmation"
  (interactive)
  (ediff-barf-if-not-control-buffer)
  (let* ((buf-a ediff-buffer-A)
         (buf-b ediff-buffer-B)
         (buf-c ediff-buffer-C)
         (ctl-buf (current-buffer))
         (modified (remove-if-not 'buffer-modified-p
                                  (list buf-a buf-b buf-c))))
    (let ((save (if modified (yes-or-no-p "Save changes?")nil)))
      (loop for buf in modified do
            (progn
              (set-buffer buf)
              (if save
                  (save-buffer)
                (set-buffer-modified-p nil))))
      (set-buffer ctl-buf)
      (ediff-really-quit nil))))
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.