* comint.el (comint-send-input): Widen the buffer first.
[bpt/emacs.git] / lisp / ediff-diff.el
index 5745636..f1fbc5e 100644 (file)
@@ -1,7 +1,7 @@
 ;;; ediff-diff.el --- diff-related utilities
 
 ;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-;;   2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+;;   2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
 
 ;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
 
@@ -65,8 +65,11 @@ Must produce output compatible with Unix's diff3 program."
 ;; The following functions needed for setting diff/diff3 options
 ;; test if diff supports the --binary option
 (defsubst ediff-test-utility (diff-util option &optional files)
-  (eq 0 (apply 'call-process
-              (append (list diff-util nil nil nil option) files))))
+  (condition-case nil
+      (eq 0 (apply 'call-process
+                  (append (list diff-util nil nil nil option) files)))
+    (error (format "Cannot execute program %S." diff-util)))
+  )
 
 (defun ediff-diff-mandatory-option (diff-util)
   (let ((file (if (boundp 'null-device) null-device "/dev/null")))
@@ -75,13 +78,17 @@ Must produce output compatible with Unix's diff3 program."
           ((and (string= diff-util ediff-diff-program)
                 (ediff-test-utility
                  ediff-diff-program "--binary" (list file file)))
-           "--binary")
+           "--binary ")
           ((and (string= diff-util ediff-diff3-program)
                 (ediff-test-utility
                  ediff-diff3-program "--binary" (list file file file)))
-           "--binary")
+           "--binary ")
           (t ""))))
 
+
+;; must be before ediff-reset-diff-options to avoid compiler errors
+(fset 'ediff-set-actual-diff-options '(lambda () nil))
+
 ;; make sure that mandatory options are added even if the user changes
 ;; ediff-diff-options or ediff-diff3-options in the customization widget
 (defun ediff-reset-diff-options (symb val)
@@ -89,12 +96,9 @@ Must produce output compatible with Unix's diff3 program."
          (if (eq symb 'ediff-diff-options)
              ediff-diff-program
            ediff-diff3-program))
-        (mandatory-option (ediff-diff-mandatory-option diff-program))
-        (spacer (if (string-equal mandatory-option "") "" " ")))
-    (set symb
-        (if (string-match mandatory-option val)
-            val
-          (concat mandatory-option spacer val)))
+        (mandatory-option (ediff-diff-mandatory-option diff-program)))
+    (set symb (concat mandatory-option val))
+    (ediff-set-actual-diff-options)
     ))
 
 
@@ -129,9 +133,13 @@ are `-I REGEXP', to ignore changes whose lines match the REGEXP."
 (defcustom ediff-diff-options ""
   "*Options to pass to `ediff-diff-program'.
 If Unix diff is used as `ediff-diff-program',
- then a useful option is `-w', to ignore space.
-Options `-c' and `-i' are not allowed. Case sensitivity can be
- toggled interactively using \\[ediff-toggle-ignore-case]."
+then a useful option is `-w', to ignore space.
+Options `-c', `-u', and `-i' are not allowed. Case sensitivity can be
+toggled interactively using \\[ediff-toggle-ignore-case].
+
+This variable is not for customizing the look of the differences produced by
+the command \\[ediff-show-diff-output]. Use the variable 
+`ediff-custom-diff-options' for that."
   :set 'ediff-reset-diff-options
   :type 'string
   :group 'ediff-diff)
@@ -153,7 +161,7 @@ GNU diff3 doesn't have such an option."
   :group 'ediff-diff)
 
 ;; the actual options used in comparison
-(ediff-defvar-local ediff-actual-diff-options "" "")
+(ediff-defvar-local ediff-actual-diff-options ediff-diff-options "")
 
 (defcustom ediff-custom-diff-program ediff-diff-program
   "*Program to use for generating custom diff output for saving it in a file.
@@ -176,7 +184,7 @@ This output is not used by Ediff internally."
   :group 'ediff-diff)
 
 ;; the actual options used in comparison
-(ediff-defvar-local ediff-actual-diff3-options "" "")
+(ediff-defvar-local ediff-actual-diff3-options ediff-diff3-options "")
 
 (defcustom ediff-diff3-ok-lines-regexp
   "^\\([1-3]:\\|====\\|  \\|.*Warning *:\\|.*No newline\\|.*missing newline\\|^\C-m$\\)"
@@ -250,10 +258,10 @@ one optional arguments, diff-number to refine.")
 ;; ediff-setup-diff-regions-function, which can also have the value
 ;; ediff-setup-diff-regions3, which takes 4 arguments.
 (defun ediff-setup-diff-regions (file-A file-B file-C)
-  ;; looking for '-c', '-i', or a 'c', 'i' among clustered non-long options
-  (if (string-match "^-[ci]\\| -[ci]\\|\\(^\\| \\)-[^- ]+[ci]"
+  ;; looking for '-c', '-i', '-u', or 'c', 'i', 'u' among clustered non-long options
+  (if (string-match "^-[ciu]\\| -[ciu]\\|\\(^\\| \\)-[^- ]+[ciu]"
                    ediff-diff-options)
-      (error "Options `-c' and `-i' are not allowed in `ediff-diff-options'"))
+      (error "Options `-c', `-u', and `-i' are not allowed in `ediff-diff-options'"))
 
   ;; create, if it doesn't exist
   (or (ediff-buffer-live-p ediff-diff-buffer)
@@ -1326,7 +1334,8 @@ delimiter regions"))
 Used for splitting difference regions into individual words.")
 (make-variable-buffer-local 'ediff-forward-word-function)
 
-(defvar ediff-whitespace " \n\t\f"
+;; \240 is unicode symbol for nonbreakable whitespace
+(defvar ediff-whitespace " \n\t\f\r\240"
   "*Characters constituting white space.
 These characters are ignored when differing regions are split into words.")
 (make-variable-buffer-local 'ediff-whitespace)
@@ -1442,9 +1451,11 @@ arguments to `skip-chars-forward'."
            (not (file-directory-p f2)))
       (let ((res
             (apply 'call-process ediff-cmp-program nil nil nil
-                   (append ediff-cmp-options (list f1 f2)))))
-       (and (numberp res) (eq res 0))))
-  )
+                   (append ediff-cmp-options (list (expand-file-name f1)
+                                                   (expand-file-name f2))))
+            ))
+       (and (numberp res) (eq res 0)))
+    ))
 
 
 (defun ediff-same-contents (d1 d2 &optional filter-re)
@@ -1519,21 +1530,30 @@ affects only files whose names match the expression."
       (setq file-list-list (cdr file-list-list)))
     (reverse result)))
 
+
+(defun ediff-set-actual-diff-options ()
+  (if ediff-ignore-case
+      (setq ediff-actual-diff-options 
+           (concat ediff-diff-options " " ediff-ignore-case-option)
+           ediff-actual-diff3-options
+           (concat ediff-diff3-options " " ediff-ignore-case-option3))
+    (setq ediff-actual-diff-options ediff-diff-options
+         ediff-actual-diff3-options ediff-diff3-options)
+    )
+  (setq-default ediff-actual-diff-options ediff-actual-diff-options
+               ediff-actual-diff3-options ediff-actual-diff3-options)
+  )
+
+
 ;; Ignore case handling - some ideas from drew.adams@@oracle.com
 (defun ediff-toggle-ignore-case ()
   (interactive)
   (ediff-barf-if-not-control-buffer)
   (setq ediff-ignore-case (not ediff-ignore-case))
-  (cond (ediff-ignore-case
-        (setq ediff-actual-diff-options
-              (concat ediff-diff-options " " ediff-ignore-case-option)
-              ediff-actual-diff3-options
-              (concat ediff-diff3-options " " ediff-ignore-case-option3))
-        (message "Ignoring regions that differ only in case"))
-       (t
-        (setq ediff-actual-diff-options ediff-diff-options
-              ediff-actual-diff3-options ediff-diff3-options)
-        (message "Ignoring case differences turned OFF")))
+  (ediff-set-actual-diff-options)
+  (if ediff-ignore-case
+      (message "Ignoring regions that differ only in case")
+    (message "Ignoring case differences turned OFF"))
   (cond (ediff-merge-job
         (message "Ignoring letter case is too dangerous in merge jobs"))
        ((and ediff-diff3-job (string= ediff-ignore-case-option3 ""))