Comment puis-je quitter ediff immédiatement sans avoir à taper «y»

13

Quand je quitte ediff avec, on qme demande si je veux vraiment arrêter. Je préférerais qu'il arrête immédiatement. Il n'y a rien d'évident dans la personnalisation . Il y a une solution ici qui semble fonctionner en redéfinissant la qclé, mais je ne suis pas sûr des détails du fonctionnement de la fonction. Quelle est la façon la plus simple de faire cesser de fumer signifie vraiment arrêter de fumer?

TooTone
la source

Réponses:

13

Vous pouvez le conseiller ediff-quitpour qu'il se lie y-or-n-pde nouveau dynamiquement à une fonction qui retourne 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)

Ceci est plus robuste aux changements en amont que la redéfinition ediff-quit.

Clément Lassieur
la source
S'il notifiait que si un tampon différent changeait, ce serait parfait.
CodyChan
5

Malheureusement, je pense que vous devez soit relier q, soit ajuster la source de ediff-quit. Comme cela est évident dans la source de ediff-quitl'invite, cela se produit toujours.

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

Je suggérerais de redéfinir ediff-quitvotre .emacset de soumettre un patch à la source en ajoutant une variable de personnalisation.

N'oubliez pas que la source d'implémentation dans emacs est toujours à quelques touches. En supposant que les sources elisp sont installées, saisissez C-h f, saisissez le nom de la fonction et suivez le lien vers son emplacement.

dgtized
la source
1

J'utilise le rebind suivant de q dans ediff. Si l'un des tampons est modifié, il demande s'ils doivent être enregistrés, puis il se ferme simplement. Si aucun tampon n'est modifié, il se ferme simplement.

(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
la source