回答:
を返す関数に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
です。
残念ながら、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、を入力し、関数名を入力して、それが定義されている場所へのリンクをたどります。
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))))