Wie kann ich ediff sofort beenden, ohne 'y' eingeben zu müssen?

13

Wenn ich mit ediff kündige, werde qich gefragt, ob ich wirklich kündigen möchte. Ich möchte lieber, dass es sofort aufhört. Unter Anpassung ist nichts offensichtlich . Es gibt hier eine Lösung , die durch eine Neudefinition des qSchlüssels zu funktionieren scheint , aber ich bin mir nicht sicher, wie die Funktion im Detail funktioniert. Was ist der einfachste Weg, um gekündigt zu werden, um wirklich gekündigt zu werden?

TooTone
quelle

Antworten:

13

Sie können raten, ediff-quitdass es dynamisch y-or-n-pan eine zurückgegebene Funktion gebunden wird 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)

Dies ist robuster gegenüber Upstream-Änderungen als eine Neudefinition ediff-quit.

Clément Lassieur
quelle
Wenn es mitteilen würde, dass sich ein unterschiedlicher Puffer geändert hat, wäre es perfekt.
CodyChan
5

Leider denke ich, dass Sie entweder q neu binden oder die Quelle von anpassen müssen ediff-quit. Wie aus der Quelle ediff-quitder Eingabeaufforderung hervorgeht, geschieht dies immer.

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

Ich würde vorschlagen, ediff-quitIhre .emacsEinstellungen neu zu definieren und einen Patch an die Quelle zu senden, der eine Anpassungsvariable hinzufügt.

Denken Sie daran, dass die Implementierungsquelle in Emacs immer ein paar Tastenanschläge entfernt ist. Vorausgesetzt, die elisp-Quellen sind installiert, C-h fgeben Sie den Funktionsnamen ein und folgen Sie dem Link zu der Stelle, an der er definiert ist.

dgtized
quelle
1

Ich benutze den folgenden Rebind von q in ediff. Wenn ein Puffer geändert wird, werden Sie gefragt, ob er gespeichert werden soll, und der Vorgang wird beendet. Wenn keine Puffer geändert werden, wird es nur beendet.

(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))))
Joakim Hårsman
quelle