'y'를 입력하지 않고 ediff를 즉시 종료 할 수있는 방법


13

내가 ediff를 끝내면 q정말 끝내고 싶은지 묻습니다. 차라리 즉시 종료하고 싶습니다. 커스터마이징 에는 분명한 것이 없다 . 이 솔루션입니다 여기 재정 의하여 작동하는 것 같다 q키,하지만 난 확인 기능이 작동하는 방법의 세부 사항의 아니에요. 금연을 의미하는 가장 간단한 방법은 무엇입니까?

답변:


13

를 반환하는 함수에 ediff-quit동적으로 리 바인드 y-or-n-p하도록 조언 할 수 있습니다 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)

이는 재정의보다 업스트림 변경에 더 강력합니다 ediff-quit.


다른 버퍼가 변경된 경우이를 알리면 완벽합니다.
CodyChan

5

불행히도 나는 당신이 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

나는 ediff에서 다음 q의 리 바인드를 사용합니다. 버퍼 중 하나라도 수정되면 저장 여부를 묻고 종료됩니다. 버퍼가 수정되지 않으면 종료됩니다.

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