Using ediff as git mergetool

前端 未结 12 528
天命终不由人
天命终不由人 2020-12-12 10:22

I would like to be able to use ediff with \"git mergetool\".

I found some patches that alter the source code, which I don\'t want to do. Instead, I\'d like to add ed

12条回答
  •  渐次进展
    2020-12-12 11:27

    The elisp code in Viper3369's code (Using ediff as git mergetool) uses a function "display-usable-bounds" which doesn't exist. Since the hooks do a lot more than is strictly necessary, simply deleting all references to "display-usable-bounds" is sufficient to make it work for me. Good work! ;)

    (Edit: I think I should post the modified emacs-lisp code:

    ;;
    ;; Setup for ediff.
    ;;
    (require 'ediff)
    
    (defvar ediff-after-quit-hooks nil
      "* Hooks to run after ediff or emerge is quit.")
    
    (defadvice ediff-quit (after edit-after-quit-hooks activate)
      (run-hooks 'ediff-after-quit-hooks))
    
    (setq git-mergetool-emacsclient-ediff-active nil)
    
    
    (setq ediff-window-setup-function 'ediff-setup-windows-plain)
    (setq ediff-split-window-function 'split-window-horizontally)
    
    (defun local-ediff-before-setup-hook ()
      (setq local-ediff-saved-frame-configuration (current-frame-configuration))
      (setq local-ediff-saved-window-configuration (current-window-configuration))
      ;; (local-ediff-frame-maximize)
      (if git-mergetool-emacsclient-ediff-active
          (raise-frame)))
    
    (defun local-ediff-quit-hook ()
      (set-frame-configuration local-ediff-saved-frame-configuration)
      (set-window-configuration local-ediff-saved-window-configuration))
    
    (defun local-ediff-suspend-hook ()
      (set-frame-configuration local-ediff-saved-frame-configuration)
      (set-window-configuration local-ediff-saved-window-configuration))
    
    (add-hook 'ediff-before-setup-hook 'local-ediff-before-setup-hook)
    (add-hook 'ediff-quit-hook 'local-ediff-quit-hook 'append)
    (add-hook 'ediff-suspend-hook 'local-ediff-suspend-hook 'append)
    
    ;; Useful for ediff merge from emacsclient.
    (defun git-mergetool-emacsclient-ediff (local remote base merged)
      (setq git-mergetool-emacsclient-ediff-active t)
      (if (file-readable-p base)
          (ediff-merge-files-with-ancestor local remote base nil merged)
        (ediff-merge-files local remote nil merged))
      (recursive-edit))
    
    (defun git-mergetool-emacsclient-ediff-after-quit-hook ()
      (exit-recursive-edit))
    
    (add-hook 'ediff-after-quit-hooks 'git-mergetool-emacsclient-ediff-after-quit-hook 'append)
    

提交回复
热议问题