aboutsummaryrefslogtreecommitdiffstats
path: root/oni-ediff.el
blob: 7449c34e5f1d027a34be039a96477a81b1a4c504 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
;;; oni-ediff.el --- Ediff configuration             -*- lexical-binding: t; -*-

;; Copyright (C) 2019  Tom Willemse

;; Author: Tom Willemse <tom@ryuslash.org>
;; Keywords: local
;; Version: 2023.0809.131051

;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <https://www.gnu.org/licenses/>.

;;; Commentary:

;; Ediff configuration.

;;; Code:

(require 'ediff)

(defun oni-ediff--turn-on-fullscreen ()
  "Turn on fullscreen for the current frame."
  (unless (memq (frame-parameter nil 'fullscreen)
                '(fullscreen fullboth))
    (set-frame-parameter nil 'fullscreen 'fullboth)))

(defun oni-ediff--turn-off-fullscreen ()
  "Turn off fullscreen for the current frame."
  (when (memq (frame-parameter nil 'fullscreen)
              '(fullscreen fullboth))
    (set-frame-parameter nil 'fullscreen nil)))

;;;###autoload
(defun oni-ediff-from-command-line ()
  "Call ‘ediff’ with arguments from the command line."
  (pcase command-line-args-left
    (`(,fileA ,fileB) (ediff-files fileA fileB))
    (`(,fileA ,fileB ,fileC) (ediff-files3 fileA fileB fileC))
    (_ (error "Invalid number of arguments, need either 2 or 3 files"))))

;;;###autoload
(defun oni-ediff-server (fun files proc &optional nowait)
  (pcase files
    ((and `((,fileB) (,fileA) (,command))
          (guard (string= (file-name-nondirectory command) "diff")))
     (let* ((file-a-path (expand-file-name fileA))
            (file-b-path (expand-file-name fileB))
            (file-a-opened-p (find-buffer-visiting fileA))
            (file-b-opened-p (find-buffer-visiting fileB))
            cleanup-function)
       (setq cleanup-function
             (lambda ()
               (remove-hook 'ediff-cleanup-hook cleanup-function)
               (when (not file-a-opened-p)
                 (kill-buffer (find-buffer-visiting file-a-path)))
               (when (not file-b-opened-p)
                 (kill-buffer (find-buffer-visiting file-b-path)))
               (delete-process proc)))
       (select-frame-set-input-focus (selected-frame))
       (ediff-files (expand-file-name fileA)
                    (expand-file-name fileB))
       (add-hook 'ediff-cleanup-hook cleanup-function))
     nil)
    (_ (funcall fun files proc nowait))))

;;;###autoload
(advice-add 'server-visit-files :around #'oni-ediff-server)

(setq ediff-window-setup-function 'ediff-setup-windows-plain)
(setq ediff-split-window-function 'split-window-horizontally)

(setq ediff-diff-options "-w")

(setq-default ediff-auto-refine 'on)

(add-hook 'ediff-mode-hook #'oni-ediff--turn-on-fullscreen)
(add-hook 'ediff-cleanup-hook #'oni-ediff--turn-off-fullscreen)
(add-hook 'ediff-cleanup-hook 'winner-undo)

(when (boundp 'ediff-floating-control-frame)
  (setq ediff-floating-control-frame t))

(provide 'oni-ediff)
;;; oni-ediff.el ends here