;;; ediff-util.el --- the core commands and utilities of ediff
;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-;; 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+;; 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
;; This file is part of GNU Emacs.
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs 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, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;;; Code:
+(provide 'ediff-util)
+
;; Compiler pacifier
-(defvar ediff-patch-diagnostics)
-(defvar ediff-patchbufer)
(defvar ediff-use-toolbar-p)
(defvar ediff-toolbar-height)
(defvar ediff-toolbar)
(defvar ediff-after-quit-hook-internal nil)
-(and noninteractive
- (eval-when-compile
- (load "reporter" 'noerror)))
+(eval-and-compile
+ (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
(eval-when-compile
- (let ((load-path (cons (expand-file-name ".") load-path)))
- (provide 'ediff-util) ; to break recursive load cycle
- (or (featurep 'ediff-init)
- (load "ediff-init.el" nil nil 'nosuffix))
- (or (featurep 'ediff-help)
- (load "ediff-help.el" nil nil 'nosuffix))
- (or (featurep 'ediff-mult)
- (load "ediff-mult.el" nil nil 'nosuffix))
- (or (featurep 'ediff-wind)
- (load "ediff-wind.el" nil nil 'nosuffix))
- (or (featurep 'ediff-diff)
- (load "ediff-diff.el" nil nil 'nosuffix))
- (or (featurep 'ediff-merg)
- (load "ediff-merg.el" nil nil 'nosuffix))
- (or (featurep 'ediff)
- (load "ediff.el" nil nil 'nosuffix))
- (or (featurep 'ediff-tbar)
- (featurep 'emacs)
- (load "ediff-tbar.el" 'noerror nil 'nosuffix))
- ))
+ (require 'ediff))
+
;; end pacifier
(require 'ediff-wind)
(require 'ediff-diff)
(require 'ediff-merg)
-
+;; for compatibility with current stable version of xemacs
(if (featurep 'xemacs)
(require 'ediff-tbar))
(make-local-variable 'ediff-window-setup-function)
(make-local-variable 'ediff-keep-variants)
- (ediff-cond-compile-for-xemacs-or-emacs
- (make-local-hook 'ediff-after-quit-hook-internal) ; xemacs form
- nil ; emacs form
- )
+ (make-local-variable 'window-min-height)
+ (setq window-min-height 2)
+
+ (if (featurep 'xemacs)
+ (make-local-hook 'ediff-after-quit-hook-internal))
;; unwrap set up parameters passed as argument
(while setup-parameters
(if (string-match "buffer" (symbol-name ediff-job-name))
(setq ediff-keep-variants t))
- (ediff-cond-compile-for-xemacs-or-emacs
- (make-local-hook 'pre-command-hook) ; xemacs form
- nil ; emacs form
- )
+ (if (featurep 'xemacs)
+ (make-local-hook 'pre-command-hook))
(if (ediff-window-display-p)
(add-hook 'pre-command-hook 'ediff-spy-after-mouse nil 'local))
(setq ediff-error-buffer
(get-buffer-create (ediff-unique-buffer-name "*ediff-errors" "*")))
+ (with-current-buffer ediff-error-buffer
+ (setq buffer-undo-list t))
+
(ediff-with-current-buffer buffer-A (ediff-strip-mode-line-format))
(ediff-with-current-buffer buffer-B (ediff-strip-mode-line-format))
(if ediff-3way-job
(ediff-multiframe-setup-p)
ediff-wide-display-p))
+ (set-window-dedicated-p (selected-window) t)
;; In multiframe, toolbar is set in ediff-setup-control-frame
(if (not (ediff-multiframe-setup-p))
(ediff-make-bottom-toolbar)) ; this checks if toolbar is requested
(interactive)
(ediff-barf-if-not-control-buffer)
(let ((ctl-buf (if (null buf) (current-buffer)))
- (buf-type (ediff-char-to-buftype last-command-char)))
+ (buf-type (ediff-char-to-buftype last-command-event)))
(or buf (ediff-recenter))
(or buf
(setq buf (ediff-get-buffer buf-type)))
(if (featurep 'emacs) "" "X")))
(cond ((eq ediff-window-setup-function 'ediff-setup-windows-multiframe)
+ (setq ediff-multiframe nil)
(setq window-setup-func 'ediff-setup-windows-plain))
((eq ediff-window-setup-function 'ediff-setup-windows-plain)
(if (ediff-in-control-buffer-p)
(ediff-kill-bottom-toolbar))
- (setq window-setup-func 'ediff-setup-windows-multiframe)))
+ (if (and (ediff-buffer-live-p ediff-control-buffer)
+ (window-live-p ediff-control-window))
+ (set-window-dedicated-p ediff-control-window nil))
+ (setq ediff-multiframe t)
+ (setq window-setup-func 'ediff-setup-windows-multiframe))
+ (t
+ (if (and (ediff-buffer-live-p ediff-control-buffer)
+ (window-live-p ediff-control-window))
+ (set-window-dedicated-p ediff-control-window nil))
+ (setq ediff-multiframe t)
+ (setq window-setup-func 'ediff-setup-windows-multiframe))
+ )
;; change default
(setq-default ediff-window-setup-function window-setup-func)
ediff-window-B nil)))
ediff-session-registry)
(if (ediff-in-control-buffer-p)
- (ediff-recenter 'no-rehighlight))))
+ (progn
+ (set-window-dedicated-p (selected-window) nil)
+ (ediff-recenter 'no-rehighlight)))))
;;;###autoload
;; The problem with this is that any previous bottom-toolbar
;; will not re-appear after our cleanup here. Is there a way
;; to do "push" and "pop" toolbars ? --marcpa
- (if (ediff-use-toolbar-p)
- (ediff-cond-compile-for-xemacs-or-emacs
- (progn ; xemacs
- (set-specifier bottom-toolbar (list (selected-frame) nil))
- (set-specifier bottom-toolbar-visible-p (list (selected-frame) nil)))
- nil ; emacs
- )
- ))
+ (if (featurep 'xemacs)
+ (when (ediff-use-toolbar-p)
+ (set-specifier bottom-toolbar (list (selected-frame) nil))
+ (set-specifier bottom-toolbar-visible-p (list (selected-frame) nil)))))
;; If wants to use toolbar, make it.
;; If not, zero the toolbar for XEmacs.
;; Do nothing for Emacs.
(defun ediff-make-bottom-toolbar (&optional frame)
- (if (ediff-window-display-p)
- (progn
- (setq frame (or frame (selected-frame)))
+ (when (ediff-window-display-p)
+ (setq frame (or frame (selected-frame)))
+ (if (featurep 'xemacs)
(cond ((ediff-use-toolbar-p) ; this checks for XEmacs
- (ediff-cond-compile-for-xemacs-or-emacs
- (progn ; xemacs
- (set-specifier
- bottom-toolbar
- (list frame (if (ediff-3way-comparison-job)
- ediff-toolbar-3way ediff-toolbar)))
- (set-specifier bottom-toolbar-visible-p (list frame t))
- (set-specifier bottom-toolbar-height
- (list frame ediff-toolbar-height)))
- nil ; emacs
- )
- )
+ (set-specifier
+ bottom-toolbar
+ (list frame (if (ediff-3way-comparison-job)
+ ediff-toolbar-3way ediff-toolbar)))
+ (set-specifier bottom-toolbar-visible-p (list frame t))
+ (set-specifier bottom-toolbar-height
+ (list frame ediff-toolbar-height)))
((ediff-has-toolbar-support-p)
- (ediff-cond-compile-for-xemacs-or-emacs
- (set-specifier bottom-toolbar-height (list frame 0)) ; xemacs
- nil ; emacs
- )
- )
- ))
- ))
+ (set-specifier bottom-toolbar-height (list frame 0)))))))
;; Merging
(error ediff-KILLED-VITAL-BUFFER))
(ediff-operate-on-windows
- (if (memq last-command-char '(?v ?\C-v))
+ (if (memq last-command-event '(?v ?\C-v))
'scroll-up
'scroll-down)
;; calculate argument to scroll-up/down
;; interactively so that they set the window's min_hscroll.
;; Otherwise, automatic hscrolling will undo the effect of
;; hscrolling.
- (if (= last-command-char ?<)
+ (if (= last-command-event ?<)
(lambda (arg)
(let ((prefix-arg arg))
(call-interactively 'scroll-left)))
in the specified buffer."
(interactive "P")
(ediff-barf-if-not-control-buffer)
- (let* ((buf-type (ediff-char-to-buftype last-command-char))
+ (let* ((buf-type (ediff-char-to-buftype last-command-event))
(buffer (ediff-get-buffer buf-type))
(pt (ediff-with-current-buffer buffer (point)))
(diff-no (ediff-diff-at-point buf-type nil (if arg 'after)))
"Restore ARGth diff from `ediff-killed-diffs-alist'.
ARG is a prefix argument. If ARG is nil, restore the current-difference.
If the second optional argument, a character, is given, use it to
-determine the target buffer instead of last-command-char"
+determine the target buffer instead of last-command-event"
(interactive "P")
(ediff-barf-if-not-control-buffer)
(if (numberp arg)
(ediff-jump-to-difference arg))
(ediff-pop-diff ediff-current-difference
- (ediff-char-to-buftype (or key last-command-char)))
+ (ediff-char-to-buftype (or key last-command-event)))
;; recenter with rehighlighting, but no messages
(let (ediff-verbose-p)
(ediff-recenter)))
(cond
((or (and (eq ediff-skip-diff-region-function
ediff-focus-on-regexp-matches-function)
- (eq last-command-char ?f))
+ (eq last-command-event ?f))
(and (eq ediff-skip-diff-region-function
ediff-hide-regexp-matches-function)
- (eq last-command-char ?h)))
+ (eq last-command-event ?h)))
(message "Selective browsing by regexp turned off")
(setq ediff-skip-diff-region-function 'ediff-show-all-diffs))
- ((eq last-command-char ?h)
+ ((eq last-command-event ?h)
(setq ediff-skip-diff-region-function ediff-hide-regexp-matches-function
regexp-A
(read-string
(or (string= regexp-B "") (setq ediff-regexp-hide-B regexp-B))
(or (string= regexp-C "") (setq ediff-regexp-hide-C regexp-C)))
- ((eq last-command-char ?f)
+ ((eq last-command-event ?f)
(setq ediff-skip-diff-region-function
ediff-focus-on-regexp-matches-function
regexp-A
temporarily reverses the meaning of this variable."
(interactive "P")
(ediff-barf-if-not-control-buffer)
- (let ((ctl-buf (current-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" "")))
(message "")
(set-buffer ctl-buf)
(ediff-really-quit reverse-default-keep-variants))
+ (select-frame ctl-frm)
+ (raise-frame ctl-frm)
(message ""))))
(if (or (not (file-exists-p file))
(y-or-n-p (format "File %s exists, overwrite? " file)))
(progn
- ;;(write-region (point-min) (point-max) file)
+ ;;(write-region nil nil file)
(ediff-with-current-buffer buf
(set-visited-file-name file)
(save-buffer))
(message
"To resume, type M-x eregistry and select the desired Ediff session"))
+;; ediff-barf-if-not-control-buffer ensures only called from ediff.
+(declare-function ediff-version "ediff" ())
(defun ediff-status-info ()
"Show the names of the buffers or files being operated on by Ediff.
(defun ediff-make-temp-file (buff &optional prefix given-file start end)
(let* ((p (ediff-convert-standard-filename (or prefix "ediff")))
(short-p p)
- (coding-system-for-write
- (ediff-with-current-buffer buff
- (if (boundp 'buffer-file-coding-system)
- buffer-file-coding-system
- ediff-coding-system-for-write)))
+ (coding-system-for-write ediff-coding-system-for-write)
f short-f)
(if (and (fboundp 'msdos-long-file-names)
(not (msdos-long-file-names))
;; Quote metacharacters (using \) when executing diff in Unix, but not in
;; EMX OS/2
;;(defun ediff-protect-metachars (str)
-;; (or (memq system-type '(emx vax-vms axp-vms))
+;; (or (memq system-type '(emx))
;; (let ((limit 0))
;; (while (string-match ediff-metachars str limit)
;; (setq str (concat (substring str 0 (match-beginning 0))
(ediff-barf-if-not-control-buffer)
(ediff-compute-custom-diffs-maybe)
(ediff-with-current-buffer
- (cond ((memq last-command-char '(?a ?b ?c))
+ (cond ((memq last-command-event '(?a ?b ?c))
(ediff-get-buffer
- (ediff-char-to-buftype last-command-char)))
- ((eq last-command-char ?d)
+ (ediff-char-to-buftype last-command-event)))
+ ((eq last-command-event ?d)
(message "Saving diff output ...")
(sit-for 1) ; let the user see the message
(cond ((and arg (ediff-buffer-live-p ediff-diff-buffer))
ediff-diff-buffer)
(t (error "Output from `diff' not found"))))
)
- (save-buffer)))
+ (let ((window-min-height 2))
+ (save-buffer))))
;; idea suggested by Hannu Koivisto <azure@iki.fi>
(defun ediff-make-cloned-buffer (buff region-name)
(ediff-make-indirect-buffer
buff (generate-new-buffer-name
- (concat (if (stringp buff) buff (buffer-name buff)) region-name))
- ))
+ (concat (if (stringp buff) buff (buffer-name buff)) region-name))))
(defun ediff-make-indirect-buffer (base-buf indirect-buf-name)
- (ediff-cond-compile-for-xemacs-or-emacs
- (make-indirect-buffer base-buf indirect-buf-name) ; xemacs
- (make-indirect-buffer base-buf indirect-buf-name 'clone) ; emacs
- ))
+ (if (featurep 'xemacs)
+ (make-indirect-buffer base-buf indirect-buf-name)
+ (make-indirect-buffer base-buf indirect-buf-name 'clone)))
;; This function operates only from an ediff control buffer
(let ((buf-A-file-name (buffer-file-name ediff-buffer-A))
(buf-B-file-name (buffer-file-name ediff-buffer-B))
file-A file-B)
- (unless (and buf-A-file-name (file-exists-p buf-A-file-name))
- (setq file-A
- (ediff-make-temp-file ediff-buffer-A)))
- (unless (and buf-B-file-name (file-exists-p buf-B-file-name))
- (setq file-B
- (ediff-make-temp-file ediff-buffer-B)))
+ (unless (and buf-A-file-name
+ (file-exists-p buf-A-file-name)
+ (not (ediff-file-remote-p buf-A-file-name)))
+ (setq file-A (ediff-make-temp-file ediff-buffer-A)))
+ (unless (and buf-B-file-name
+ (file-exists-p buf-B-file-name)
+ (not (ediff-file-remote-p buf-B-file-name)))
+ (setq file-B (ediff-make-temp-file ediff-buffer-B)))
(or (ediff-buffer-live-p ediff-custom-diff-buffer)
(setq ediff-custom-diff-buffer
(get-buffer-create
(or (number-or-marker-p end)
(setq end (eval end)))
(setq overl
- (ediff-cond-compile-for-xemacs-or-emacs
- (make-extent beg end buff) ; xemacs
- ;; advance front and rear of the overlay
- (make-overlay beg end buff nil 'rear-advance) ; emacs
- ))
+ (if (featurep 'xemacs)
+ (make-extent beg end buff)
+ ;; advance front and rear of the overlay
+ (make-overlay beg end buff nil 'rear-advance)))
;; never detach
(ediff-overlay-put
overl (if (featurep 'emacs) 'evaporate 'detachable) nil)
;; make overlay open-ended
;; In emacs, it is made open ended at creation time
- (if (featurep 'xemacs)
- (progn
- (ediff-overlay-put overl 'start-open nil)
- (ediff-overlay-put overl 'end-open nil)))
+ (when (featurep 'xemacs)
+ (ediff-overlay-put overl 'start-open nil)
+ (ediff-overlay-put overl 'end-open nil))
(ediff-overlay-put overl 'ediff-diff-num 0)
overl))))
(defun ediff-deactivate-mark ()
- (ediff-cond-compile-for-xemacs-or-emacs
- (zmacs-deactivate-region) ; xemacs
- (deactivate-mark) ; emacs
- ))
+ (if (featurep 'xemacs)
+ (zmacs-deactivate-region)
+ (deactivate-mark)))
+
(defun ediff-activate-mark ()
- (ediff-cond-compile-for-xemacs-or-emacs
- (zmacs-activate-region) ; xemacs
- (progn
- (make-local-variable 'transient-mark-mode)
- (setq mark-active t
- transient-mark-mode t) ; emacs
- )
- ))
+ (if (featurep 'xemacs)
+ (zmacs-activate-region)
+ (make-local-variable 'transient-mark-mode)
+ (setq mark-active t transient-mark-mode t)))
(defun ediff-nuke-selective-display ()
(if (featurep 'xemacs)
(interactive)
(ediff-barf-if-not-control-buffer)
- (ediff-cond-compile-for-xemacs-or-emacs
- (make-local-hook 'post-command-hook) ; xemacs form
- nil ; emacs form
- )
+ (if (featurep 'xemacs)
+ (make-local-hook 'post-command-hook))
(let ((pre-hook 'pre-command-hook)
(post-hook 'post-command-hook))
(run-hooks 'ediff-load-hook)
-(provide 'ediff-util)
-
;; Local Variables:
;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)