ฉันจะออกจาก ediff ได้ทันทีโดยไม่ต้องพิมพ์ 'y'


13

เมื่อฉันออกจาก ediff กับqฉันถูกถามว่าฉันต้องการที่จะเลิกจริง ๆ ฉันอยากให้มันเลิกทันที ไม่มีอะไรที่เห็นได้ชัดคือภายใต้การปรับแต่ง มีวิธีแก้ปัญหาที่นี่ซึ่งดูเหมือนว่าจะทำงานโดยการกำหนดqคีย์ใหม่ แต่ฉันไม่แน่ใจเกี่ยวกับรายละเอียดของการทำงานของฟังก์ชัน วิธีที่ง่ายที่สุดในการเลิกเลิกทำหมายถึงการเลิกอย่างแท้จริง

คำตอบ:


13

คุณสามารถให้คำแนะนำediff-quitเพื่อให้มันแบบไดนามิก rebinds ฟังก์ชั่นที่ส่งกลับy-or-n-pt

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

นี้มีประสิทธิภาพมากขึ้นในการเปลี่ยนแปลงต้นน้ำกว่า ediff-quitRedefining


ถ้ามันจะแจ้งให้ทราบว่าหากบัฟเฟอร์ที่แตกต่างใด ๆ เปลี่ยนไปมันจะสมบูรณ์แบบ
CodyChan

5

แต่น่าเสียดายที่ฉันคิดว่าคุณจะต้อง rebind Q ediff-quitหรือปรับแหล่งที่มาของ ตามที่ปรากฏในแหล่งที่มาของediff-quitพรอมต์ที่เกิดขึ้นเสมอ

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

ฉันอยากจะแนะนำให้นิยามใหม่ediff-quitของคุณ.emacsและส่งแพทช์ไปยังแหล่งที่มาเพิ่มตัวแปรการปรับแต่ง

โปรดจำไว้ว่าแหล่งที่มาของการนำไปใช้งานใน emacs นั้นอยู่ห่างออกไปไม่กี่ครั้ง สมมติว่ามีการติดตั้งแหล่งที่มาของ elisp ให้พิมพ์C-h fป้อนชื่อฟังก์ชันและตามลิงก์ไปยังตำแหน่งที่กำหนดไว้


1

ฉันใช้ rebind ของ q ต่อไปนี้ใน ediff หากมีการแก้ไขบัฟเฟอร์ใด ๆ มันจะถามว่าพวกเขาจะถูกบันทึกไว้หรือไม่แล้วมันจะหยุดทำงาน หากไม่มีการแก้ไขบัฟเฟอร์มันจะหยุดทำงาน

(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))))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.