¿Cómo puedo abandonar ediff inmediatamente sin tener que escribir 'y'?

13

Cuando dejo de construir con qme preguntan si realmente quiero renunciar. Prefiero dejarlo de inmediato. No hay nada obvio en la personalización . Hay una solución aquí , que parece que funciona mediante la redefinición de la qllave, pero no estoy seguro de los detalles de cómo funciona la función. ¿Cuál es la forma más simple de dejar de fumar para que realmente signifique dejar de fumar?

TooTone
fuente

Respuestas:

13

Puede aconsejarlo ediff-quitpara que se reenvíe dinámicamente y-or-n-pa una función que regrese 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)

Esto es más robusto para los cambios anteriores que la redefinición ediff-quit.

Clément Lassieur
fuente
Si notificara que si cambiara cualquier búfer diferente, sería perfecto.
CodyChan
5

Desafortunadamente, creo que tienes que volver a vincular q o ajustar la fuente de ediff-quit. Como es evidente en la fuente del ediff-quitaviso, siempre sucede.

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

Sugeriría redefinir ediff-quiten su .emacsy enviar un parche a la fuente agregando una variable de personalización.

Recuerde que la fuente de implementación en emacs siempre está a unas pocas teclas de distancia. Suponiendo que las fuentes elisp estén instaladas, escriba C-h f, ingrese el nombre de la función y siga el enlace a donde está definido.

dgtized
fuente
1

Utilizo el siguiente enlace de q en ediff. Si se modifica alguno de los búferes, pregunta si se van a guardar y luego se cierra. Si no se modifican los buffers, simplemente se cierra.

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