Come posso uscire immediatamente da ediff senza dover digitare 'y'


13

Quando esco da ediff con qmi viene chiesto se voglio davvero smettere. Preferirei smettere immediatamente. Non c'è nulla di ovvio sotto la personalizzazione . C'è una soluzione qui che sembra funzionare ridefinendo la qchiave, ma non sono sicuro dei dettagli di come funziona la funzione. Qual è il modo più semplice per smettere di significare davvero smettere?

Risposte:


13

Puoi consigliare in ediff-quitmodo che si ricolleghi y-or-n-pin modo dinamico a una funzione che ritorna 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)

Ciò è più efficace per le modifiche a monte rispetto alla ridefinizione ediff-quit.


Se notificasse che se un buffer diverso fosse cambiato, sarebbe perfetto.
CodyChan,

5

Purtroppo penso che sia necessario ricollegare q o regolare la sorgente di ediff-quit. Come è evidente nella fonte del ediff-quitprompt succede sempre.

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

Suggerirei di ridefinire il ediff-quittuo .emacse di inviare una patch alla fonte aggiungendo una variabile di personalizzazione.

Ricorda che la fonte di implementazione in emacs è sempre a distanza di pochi tasti. Presumendo che siano installate le fonti elisp, digitare C-h f, immettere il nome della funzione e seguire il collegamento al punto in cui è definito.


1

Uso il seguente rebind di q in ediff. Se uno qualsiasi dei buffer viene modificato, chiede se devono essere salvati, quindi si chiude. Se nessun buffer viene modificato, si chiude.

(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))))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.