;;; ediff-util.el --- the core commands and utilities of ediff
-;; Copyright (C) 1994, 95, 96, 97, 98, 99, 2000, 01, 02 Free Software Foundation, Inc.
+;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+;; 2003, 2004, 2005 Free Software Foundation, Inc.
;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
;; 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., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(kill-all-local-variables)
(setq major-mode 'ediff-mode)
(setq mode-name "Ediff")
+ ;; We use run-hooks instead of run-mode-hooks for two reasons.
+ ;; The ediff control buffer is read-only and it is not supposed to be
+ ;; modified by minor modes and such. So, run-mode-hooks doesn't do anything
+ ;; useful here on top of what run-hooks does.
+ ;; Second, changing run-hooks to run-mode-hooks would require an
+ ;; if-statement, since XEmacs doesn't have this.
(run-hooks 'ediff-mode-hook))
(eq this-command 'ediff-quit))))
))
- (ediff-restore-highlighting)
+ (or no-rehighlight
+ (ediff-restore-highlighting))
(ediff-with-current-buffer control-buf (ediff-refresh-mode-lines))
))
(eq this-command 'ediff-toggle-read-only)
(file-exists-p file)
(not (file-writable-p file)))
- (message "Warning: file %s is read-only"
- (ediff-abbreviate-file-name file) (beep 1)))
+ (progn
+ (beep 1)
+ (message "Warning: file %s is read-only"
+ (ediff-abbreviate-file-name file))))
))))
;; checkout if visited file is checked in
(if (y-or-n-p
(format
"Ignore regions that match %s regexps, OK? "
- msg-connective alt-msg-connective))
+ msg-connective))
(message "Will ignore regions that match %s regexps" msg-connective)
(setq ediff-hide-regexp-connective alt-connective)
(message "Will ignore regions that match %s regexps"
(if (y-or-n-p
(format
"Focus on regions that match %s regexps, OK? "
- msg-connective alt-msg-connective))
+ msg-connective))
(message "Will focus on regions that match %s regexps"
msg-connective)
(setq ediff-focus-regexp-connective alt-connective)
))
(ediff-install-fine-diff-if-necessary n)
+ ;; set current difference here so the hook will be able to refer to it
+ (setq ediff-current-difference n)
(run-hooks 'ediff-select-hook))))
(or (eq flag 'unselect-only)
(ediff-select-difference n))
+ ;; need to set current diff here even though it is also set in
+ ;; ediff-select-difference because ediff-select-difference might not
+ ;; be called if unselect-only is specified
(setq ediff-current-difference n)
) ; end protected section
(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)
- (if (stringp buf-A-file-name)
- (setq buf-A-file-name (file-name-nondirectory buf-A-file-name)))
- (if (stringp buf-B-file-name)
- (setq buf-B-file-name (file-name-nondirectory buf-B-file-name)))
- (setq file-A (ediff-make-temp-file ediff-buffer-A buf-A-file-name)
- file-B (ediff-make-temp-file ediff-buffer-B buf-B-file-name))
-
+ (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)))
(or (ediff-buffer-live-p ediff-custom-diff-buffer)
(setq ediff-custom-diff-buffer
(get-buffer-create
(ediff-unique-buffer-name "*ediff-custom-diff" "*"))))
(ediff-with-current-buffer ediff-custom-diff-buffer
- (setq buffer-read-only nil)
- (erase-buffer))
+ (setq buffer-read-only nil)
+ (erase-buffer))
(ediff-exec-process
ediff-custom-diff-program ediff-custom-diff-buffer 'synchronize
- ediff-custom-diff-options file-A file-B)
+ ediff-custom-diff-options
+ ;; repetition of buf-A-file-name is needed so it'll return a file
+ (or (and buf-A-file-name (file-exists-p buf-A-file-name) buf-A-file-name)
+ file-A)
+ (or (and buf-B-file-name (file-exists-p buf-B-file-name) buf-B-file-name)
+ file-B))
;; put the diff file in diff-mode, if it is available
(if (fboundp 'diff-mode)
(with-current-buffer ediff-custom-diff-buffer
(diff-mode)))
- (delete-file file-A)
- (delete-file file-B)
+ (and file-A (file-exists-p file-A) (delete-file file-A))
+ (and file-B (file-exists-p file-B) (delete-file file-B))
))
(defun ediff-show-diff-output (arg)
type ediff-current-diff-overlay-alist))
(buffer (ediff-get-buffer type))
(face (face-name
- (symbol-value
- (ediff-get-symbol-from-alist
- type ediff-current-diff-face-alist)))))
+ (ediff-get-symbol-from-alist
+ type ediff-current-diff-face-alist))))
(set overlay
(ediff-make-bullet-proof-overlay (point-max) (point-max) buffer))
(ediff-set-overlay-face (symbol-value overlay) face)