;;; oni-ediff.el --- Ediff configuration -*- lexical-binding: t; -*- ;; Copyright (C) 2019 Tom Willemse ;; Author: Tom Willemse ;; 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 . ;;; 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