11042
+ �� 1 ;;; ediff-init.el --- Macros, variables and defsubsts used by Ediff
+ �� 2 ;;; Copyright (C) 1994 Free Software Foundation, Inc.
+ �� 3
+ �� 4 ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
+ �� 5
+ �� 6 ;; This file is part of GNU Emacs.
+ �� 7
+ �� 8 ;; GNU Emacs is free software; you can redistribute it and/or modify
+ �� 9 ;; it under the terms of the GNU General Public License as published by
+ �� 10 ;; the Free Software Foundation; either version 2, or (at your option)
+ �� 11 ;; any later version.
+ �� 12
+ �� 13 ;; GNU Emacs is distributed in the hope that it will be useful,
+ �� 14 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+ �� 15 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ �� 16 ;; GNU General Public License for more details.
+ �� 17
+ �� 18 ;; You should have received a copy of the GNU General Public License
+ �� 19 ;; along with GNU Emacs; see the file COPYING. If not, write to
+ �� 20 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ �� 21
+ �� 22
+ �� 23 (defconst ediff-xemacs-p (string-match "\\(Lucid\\|Xemacs\\)" emacs-version)
+ �� 24 "Whether it is XEmacs.")
+ �� 25 (defconst ediff-emacs-p (not ediff-xemacs-p)
+ �� 26 "Whether it is Emacs.")
+ �� 27
+ �� 28 ;;; Macros
+ �� 29 (defmacro ediff-odd-p (arg)
+ �� 30 (` (eq (logand (, arg) 1) 1)))
+ �� 31
+ �� 32 (defmacro ediff-buffer-live-p (buf)
+ �� 33 (` (and (, buf) (get-buffer (, buf)) (buffer-name (get-buffer (, buf))))))
+ �� 34
+ �� 35 (defmacro ediff-get-buffer (arg)
+ �� 36 (` (cond ((eq (, arg) 'A) ediff-buffer-A)
+ �� 37 ((eq (, arg) 'B) ediff-buffer-B)
+ �� 38 ((eq (, arg) 'C) ediff-buffer-C)
+ �� 39 )
+ �� 40 ))
+ �� 41
+ �� 42 (defmacro ediff-get-value-according-to-buffer-type (buf-type list)
+ �� 43 (` (cond ((eq (, buf-type) 'A) (nth 0 (, list)))
+ �� 44 ((eq (, buf-type) 'B) (nth 1 (, list)))
+ �� 45 ((eq (, buf-type) 'C) (nth 2 (, list))))))
+ �� 46
+ �� 47 (defmacro ediff-char-to-buftype (arg)
+ �� 48 (` (cond ((memq (, arg) '(?a ?A)) 'A)
+ �� 49 ((memq (, arg) '(?b ?B)) 'B)
+ �� 50 ((memq (, arg) '(?c ?C)) 'C)
+ �� 51 )
+ �� 52 ))
+ �� 53
+ �� 54 (defmacro ediff-get-difference (n buf-type)
+ �� 55 (` (aref
+ �� 56 (symbol-value
+ �� 57 (intern (format "ediff-difference-vector-%S" (, buf-type)))) (, n))))
+ �� 58
+ �� 59 ;; tell if it has been previously determined that the region has
+ �� 60 ;; no diffs other than the white space and newlines
+ �� 61 ;; The argument, N, is the diff region number used by Ediff to index the
+ �� 62 ;; diff vector. It is 1 less than the number seen by the user.
+ �� 63 ;;
+ �� 64 ;; A difference vector has the form:
+ �� 65 ;; [diff diff diff ...]
+ �� 66 ;; where each diff has the form:
+ �� 67 ;; [overlay fine-diff-vector no-fine-diffs-flag]
+ �� 68 ;; fine-diff-vector is a vector [fine-diff fine-diff fine-diff ...]
+ �� 69 (defmacro ediff-no-fine-diffs-p (n)
+ �� 70 (` (aref (ediff-get-difference (, n) 'A) 2)))
+ �� 71
+ �� 72 (defmacro ediff-get-diff-overlay-from-diff-record (diff-rec)
+ �� 73 (` (aref (, diff-rec) 0)))
+ �� 74
+ �� 75 (defmacro ediff-get-diff-overlay (n buf-type)
+ �� 76 (` (ediff-get-diff-overlay-from-diff-record
+ �� 77 (ediff-get-difference (, n) (, buf-type)))))
+ �� 78
+ �� 79 (defmacro ediff-get-fine-diff-vector-from-diff-record (diff-rec)
+ �� 80 (` (aref (, diff-rec) 1)))
+ �� 81
+ �� 82 (defmacro ediff-set-fine-diff-vector (n buf-type fine-vec)
+ �� 83 (` (aset (ediff-get-difference (, n) (, buf-type)) 1 (, fine-vec))))
+ �� 84
+ �� 85 (defmacro ediff-get-state-of-diff (n buf-type)
+ �� 86 (` (if (ediff-buffer-live-p ediff-buffer-C)
+ �� 87 (aref (ediff-get-difference (, n) (, buf-type)) 3))))
+ �� 88 (defmacro ediff-set-state-of-diff (n buf-type val)
+ �� 89 (` (aset (ediff-get-difference (, n) (, buf-type)) 3 (, val))))
+ �� 90 (defmacro ediff-get-state-of-merge (n)
+ �� 91 (` (if (ediff-buffer-live-p ediff-buffer-C)
+ �� 92 (aref (ediff-get-difference (, n) 'C) 4))))
+ �� 93 (defmacro ediff-set-state-of-merge (n val)
+ �� 94 (` (aset (ediff-get-difference (, n) 'C) 4 (, val))))
+ �� 95
+ �� 96 ;; if flag is t, puts a mark on diff region saying that
+ �� 97 ;; the differences are in white space only. If flag is nil,
+ �� 98 ;; the region is marked as essential (i.e., differences are
+ �� 99 ;; not just in the white space and newlines.)
+ �� 100 (defmacro ediff-mark-diff-as-space-only (n flag)
+ �� 101 (` (aset (ediff-get-difference (, n) 'A) 2 (, flag))))
+ �� 102
+ �� 103 (defmacro ediff-get-fine-diff-vector (n buf-type)
+ �� 104 (` (ediff-get-fine-diff-vector-from-diff-record
+ �� 105 (ediff-get-difference (, n) (, buf-type)))))
+ �� 106
+ �� 107
+ �� 108 ;; Defines SYMBOL as an advertised local variable.
+ �� 109 ;; Performs a defvar, then executes `make-variable-buffer-local' on
+ �� 110 ;; the variable. Also sets the `permanent-local' property,
+ �� 111 ;; so that `kill-all-local-variables' (called by major-mode setting
+ �� 112 ;; commands) won't destroy Ediff control variables.
+ �� 113 ;;
+ �� 114 ;; Plagiarised from `emerge-defvar-local' for XEmacs.
+ �� 115 (defmacro ediff-defvar-local (var value doc)
+ �� 116 (` (progn
+ �� 117 (defvar (, var) (, value) (, doc))
+ �� 118 (make-variable-buffer-local '(, var))
+ �� 119 (put '(, var) 'permanent-local t))))
+ �� 120
+ �� 121 ;; Macro to switch to BUFFER, evaluate FORMS, returns to original buffer.
+ �� 122 ;; Differs from `save-excursion' in that it doesn't save the point and mark.
+ �� 123 ;; This is essentially `emerge-eval-in-buffer' with the test for live buffers."
+ �� 124 (defmacro ediff-eval-in-buffer (buffer &rest forms)
+ �� 125 (` (let ((StartBuffer (current-buffer)))
+ �� 126 (if (ediff-buffer-live-p (, buffer))
+ �� 127 (unwind-protect
+ �� 128 (progn
+ �� 129 (set-buffer (, buffer))
+ �� 130 (,@ forms))
+ �� 131 (set-buffer StartBuffer))
+ �� 132 (or (eq this-command 'ediff-quit)
+ �� 133 (error
+ �� 134 "You've killed an essential Ediff buffer---Please quit Ediff"))
+ �� 135 ))))
+ �� 136
+ �� 137
+ �� 138 (defmacro ediff-multiframe-setup-p ()
+ �� 139 (` (and window-system ediff-multiframe)))
+ �� 140
+ �� 141 (defmacro ediff-narrow-control-frame-p ()
+ �� 142 (` (and (ediff-multiframe-setup-p)
+ �� 143 (equal ediff-help-message ediff-brief-message-string))))
+ �� 144
+ �� 145 (defmacro ediff-3way-comparison-job ()
+ �� 146 (` (memq
+ �� 147 ediff-job-name
+ �� 148 '(ediff-files3 ediff-buffers3))))
+ �� 149 (ediff-defvar-local ediff-3way-comparison-job nil "")
+ �� 150
+ �� 151 (defmacro ediff-merge-job ()
+ �� 152 (` (memq
+ �� 153 ediff-job-name
+ �� 154 '(ediff-merge-files
+ �� 155 ediff-merge-buffers
+ �� 156 ediff-merge-files-with-ancestor
+ �� 157 ediff-merge-buffers-with-ancestor
+ �� 158 ediff-merge-revisions
+ �� 159 ediff-merge-revisions-with-ancestor))))
+ �� 160 (ediff-defvar-local ediff-merge-job nil "")
+ �� 161
+ �� 162 (defmacro ediff-merge-with-ancestor-job ()
+ �� 163 (` (memq
+ �� 164 ediff-job-name
+ �� 165 '(ediff-merge-files-with-ancestor
+ �� 166 ediff-merge-buffers-with-ancestor
+ �� 167 ediff-merge-revisions-with-ancestor))))
+ �� 168 (ediff-defvar-local ediff-merge-with-ancestor-job nil "")
+ �� 169
+ �� 170 (defmacro ediff-3way-job ()
+ �� 171 (` (or ediff-3way-comparison-job ediff-merge-job)))
+ �� 172 (ediff-defvar-local ediff-3way-job nil "")
+ �� 173
+ �� 174 ;; A diff3 job is like a 3way job, but ediff-merge doesn't require the use
+ �� 175 ;; of diff3.
+ �� 176 (defmacro ediff-diff3-job ()
+ �� 177 (` (or ediff-3way-comparison-job
+ �� 178 ediff-merge-with-ancestor-job)))
+ �� 179 (ediff-defvar-local ediff-diff3-job nil "")
+ �� 180
+ �� 181 (defmacro ediff-word-mode-job ()
+ �� 182 (` (memq
+ �� 183 ediff-job-name
+ �� 184 '(ediff-windows ediff-small-regions ediff-large-regions))))
+ �� 185 (ediff-defvar-local ediff-word-mode-job nil "")
+ �� 186
+ �� 187
+ �� 188 ;; Hook variables
+ �� 189
+ �� 190 (defvar ediff-before-setup-windows-hooks nil
+ �� 191 "*Hooks to run before Ediff sets its own window config.
+ �� 192 This can be used to save the previous window config, which can be restored
+ �� 193 on ediff-quit or ediff-suspend.")
+ �� 194 (defvar ediff-after-setup-windows-hooks nil
+ �� 195 "*Hooks to run after Ediff sets its own window config.
+ �� 196 This can be used to set up control window or icon in a desired place.")
+ �� 197 (defvar ediff-before-setup-control-frame-hooks nil
+ �� 198 "*Hooks run before setting up the frame to display Ediff Control Panel.
+ �� 199 Can be used to change control frame parameters to position it where it
+ �� 200 is desirable.")
+ �� 201 (defvar ediff-after-setup-control-frame-hooks nil
+ �� 202 "*Hooks run after setting up the frame to display Ediff Control Panel.
+ �� 203 Can be used to move the frame where it is desired.")
+ �� 204 (defvar ediff-startup-hooks nil
+ �� 205 "*Hooks to run in the control buffer after Ediff has been set up.")
+ �� 206 (defvar ediff-select-hooks nil
+ �� 207 "*Hooks to run after a difference has been selected.")
+ �� 208 (defvar ediff-unselect-hooks nil
+ �� 209 "*Hooks to run after a difference has been unselected.")
+ �� 210 (defvar ediff-prepare-buffer-hooks nil
+ �� 211 "*Hooks called after buffers A, B, and C are set up.")
+ �� 212 (defvar ediff-load-hooks nil
+ �� 213 "*Hook run after Ediff is loaded. Can be used to change defaults.")
+ �� 214
+ �� 215 (defvar ediff-mode-hooks nil
+ �� 216 "*Hook run just after ediff-mode is set up in the control buffer.
+ �� 217 This is done before any windows or frames are created. One can use it to
+ �� 218 set local variables that determine how the display looks like.")
+ �� 219 (defvar ediff-keymap-setup-hooks nil
+ �� 220 "*Hook run just after the default bindings in Ediff keymap are set up.")
+ �� 221
+ �� 222 (defvar ediff-display-help-hooks nil
+ �� 223 "*Hooks run after preparing the help message.")
+ �� 224
+ �� 225 (defvar ediff-suspend-hooks (list 'ediff-default-suspend-hook)
+ �� 226 "*Hooks to run in the Ediff control buffer when Ediff is suspended.")
+ �� 227 (defvar ediff-quit-hooks (list 'ediff-cleanup-mess)
+ �� 228 "*Hooks to run in the Ediff control buffer after finishing Ediff.")
+ �� 229
+ �� 230 ;; There will be deleted in due time
+ �� 231 (make-variable-buffer-local 'local-write-file-hooks)
+ �� 232 (make-variable-buffer-local 'before-change-function)
+ �� 233
+ �� 234
+ �� 235 ;; Help messages
+ �� 236
+ �� 237 (defconst ediff-long-help-message-head
+ �� 238 " Moving around | Toggling features | Manipulations
+ �� 239 =====================|===========================|============================="
+ �� 240 "The head of the full help message.")
+ �� 241 (defconst ediff-long-help-message-tail
+ �� 242 "=====================|===========================|=============================
+ �� 243 i -status info | ? -help off | G -send bug report
+ �� 244 -------------------------------------------------------------------------------
+ �� 245 X,Y (x,y) on the left are meta-symbols for the keys A,B,C (a,b,c).
+ �� 246 X,Y on the right are meta-symbols for buffers A,B,C.
+ �� 247 A,B,C on the right denote the working buffers A,B,C, respectively."
+ �� 248 "The tail of the full-help message.")
+ �� 249
+ �� 250 (defconst ediff-long-help-message-compare3
+ �� 251 "
+ �� 252 p,DEL -previous diff | | -vert/horiz split | xy -copy buf X's region to Y
+ �� 253 n,SPC -next diff | h -hiliting | rx -restore buf X's old diff
+ �� 254 j -jump to diff | @ -auto-refinement | * -refine current region
+ �� 255 gx -goto X's point| | ! -update diff regions
+ �� 256 C-l -recenter | ## -ignore whitespace |
+ �� 257 v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X
+ �� 258 </> -scroll lt/rt | X -read-only in buf X | wd -save diff output
+ �� 259 z/q -suspend/quit | m -wide display | ~ -rotate buffers
+ �� 260 "
+ �� 261 "Normally, not a user option. See `ediff-help-message' for details.")
+ �� 262
+ �� 263 (defconst ediff-long-help-message-compare2
+ �� 264 "
+ �� 265 p,DEL -previous diff | | -vert/horiz split |a/b -copy A/B's region to B/A
+ �� 266 n,SPC -next diff | h -hiliting | rx -restore buf X's old diff
+ �� 267 j -jump to diff | @ -auto-refinement | * -refine current region
+ �� 268 gx -goto X's point| | ! -update diff regions
+ �� 269 C-l -recenter | ## -ignore whitespace |
+ �� 270 v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X
+ �� 271 </> -scroll lt/rt | X -read-only in buf X | wd -save diff output
+ �� 272 z/q -suspend/quit | m -wide display | ~ -swap buffers
+ �� 273 "
+ �� 274 "Normally, not a user option. See `ediff-help-message' for details.")
+ �� 275
+ �� 276 (defconst ediff-long-help-message-word-mode
+ �� 277 "
+ �� 278 p,DEL -previous diff | | -vert/horiz split | xy -copy buf X's region to Y
+ �� 279 n,SPC -next diff | h -hiliting | rx -restore buf X's old diff
+ �� 280 j -jump to diff | |
+ �� 281 gx -goto X's point| % -narrow/widen buffs | ! -recompute diffs
+ �� 282 C-l -recenter | |
+ �� 283 v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X
+ �� 284 </> -scroll lt/rt | X -read-only in buf X | wd -save diff output
+ �� 285 z/q -suspend/quit | m -wide display | ~ -swap buffers
+ �� 286 "
+ �� 287 "Normally, not a user option. See `ediff-help-message' for details.")
+ �� 288
+ �� 289 (defconst ediff-long-help-message-merge
+ �� 290 "
+ �� 291 p,DEL -previous diff | | -vert/horiz split | x -copy buf X's region to C
+ �� 292 n,SPC -next diff | h -hiliting | r -restore buf C's old diff
+ �� 293 j -jump to diff | @ -auto-refinement | * -refine current region
+ �� 294 gx -goto X's point| ## -ignore whitespace | ! -update diff regions
+ �� 295 C-l -recenter | #f/#h -focus/hide regions | + -combine diff regions
+ �� 296 v/V -scroll up/dn | X -read-only in buf X | wx -save buf X
+ �� 297 </> -scroll lt/rt | m -wide display | wd -save diff output
+ �� 298 z/q -suspend/quit | s -shrink window C | ~ -swap buffers
+ �� 299 | $ -show clashes only | & -merge w/new default
+ �� 300 "
+ �� 301 "Normally, not a user option. See `ediff-help-message' for details.")
+ �� 302
+ �� 303 ;; The actual long help message.
+ �� 304 (ediff-defvar-local ediff-long-help-message ""
+ �� 305 "Normally, not a user option. See `ediff-help-message' for details.")
+ �� 306
+ �� 307 (defconst ediff-brief-message-string
+ �� 308 " ? - help "
+ �� 309 "Contents of the brief help message.")
+ �� 310 ;; The actual brief help message
+ �� 311 (ediff-defvar-local ediff-brief-help-message ""
+ �� 312 "Normally, not a user option. See `ediff-help-message' for details.")
+ �� 313
+ �� 314 (ediff-defvar-local ediff-brief-help-message-custom nil
+ �� 315 "The brief help message that the user can customize.
+ �� 316 If the user sets this to a parameter-less function, Ediff will use it to
+ �� 317 produce the brief help message. This function must return a string.")
+ �� 318 (ediff-defvar-local ediff-long-help-message-custom nil
+ �� 319 "The long help message that the user can customize.
+ �� 320 See `ediff-brief-help-message-custom' for more.")
+ �� 321
+ �� 322 (defvar ediff-prefer-long-help-message nil
+ �� 323 "*If t, Ediff starts with a long help message. Short help msg otherwise.")
+ �� 324
+ �� 325 ;; The actual help message.
+ �� 326 (ediff-defvar-local ediff-help-message ""
+ �� 327 "The actual help message.
+ �� 328 Normally, the user shouldn't touch this. However, if you want Ediff to
+ �� 329 start up with different help messages for different jobs, you can change
+ �� 330 the value of this variable and the variables `ediff-help-message-*' in
+ �� 331 `ediff-startup-hooks'.")
+ �� 332
+ �� 333 ;; Selective browsing
+ �� 334
+ �� 335 (ediff-defvar-local ediff-skip-diff-region-function 'ediff-show-all-diffs
+ �� 336 "Function that determines the next/previous diff region to show.
+ �� 337 Should return t for regions to be ignored and nil otherwise.
+ �� 338 This function gets a region number as an argument. The region number
+ �� 339 is the one used internally by Ediff. It is 1 less than the number seen
+ �� 340 by the user.")
+ �� 341
+ �� 342 ;; Regexp that determines buf A regions to focus on when skipping to diff
+ �� 343 (ediff-defvar-local ediff-regexp-focus-A "" "")
+ �� 344 ;; Regexp that determines buf B regions to focus on when skipping to diff
+ �� 345 (ediff-defvar-local ediff-regexp-focus-B "" "")
+ �� 346 ;; Regexp that determines buf C regions to focus on when skipping to diff
+ �� 347 (ediff-defvar-local ediff-regexp-focus-C "" "")
+ �� 348 ;; connective that determines whether to focus regions that match both or
+ �� 349 ;; one of the regexps
+ �� 350 (ediff-defvar-local ediff-focus-regexp-connective 'and "")
+ �� 351
+ �� 352 ;; Regexp that determines buf A regions to ignore when skipping to diff
+ �� 353 (ediff-defvar-local ediff-regexp-hide-A "" "")
+ �� 354 ;; Regexp that determines buf B regions to ignore when skipping to diff
+ �� 355 (ediff-defvar-local ediff-regexp-hide-B "" "")
+ �� 356 ;; Regexp that determines buf C regions to ignore when skipping to diff
+ �� 357 (ediff-defvar-local ediff-regexp-hide-C "" "")
+ �� 358 ;; connective that determines whether to hide regions that match both or
+ �� 359 ;; one of the regexps
+ �� 360 (ediff-defvar-local ediff-hide-regexp-connective 'and "")
+ �� 361
+ �� 362
+ �� 363 (defvar ediff-ange-ftp-ftp-name (if ediff-xemacs-p
+ �� 364 'ange-ftp-ftp-path
+ �� 365 'ange-ftp-ftp-name)
+ �� 366 "Function ange-ftp uses to find out if file is remote.")
+ �� 367
+ �� 368
+ �� 369 ;; Copying difference regions between buffers.
+ �� 370 (ediff-defvar-local ediff-killed-diffs-alist nil
+ �� 371 "A list of killed diffs.
+ �� 372 A diff is saved here if it is replaced by a diff
+ �� 373 from another buffer. This alist has the form:
+ �� 374 \((num (buff-object . diff) (buff-object . diff) (buff-object . diff)) ...),
+ �� 375 where some buffer-objects may be missing.")
+ �� 376
+ �� 377
+ �� 378 ;; Highlighting
+ �� 379 (defvar ediff-before-flag-bol "->>\n"
+ �� 380 "*Flag placed above the highlighted block of differences.
+ �� 381 Must end with newline.")
+ �� 382 (defvar ediff-after-flag-eol "<<-\n"
+ �� 383 "*Flag placed below the highlighted block of differences.
+ �� 384 Must end with newline.")
+ �� 385
+ �� 386 (defvar ediff-before-flag-mol "->>"
+ �� 387 "*Like ediff-before-flag, used when a difference starts in mid-line.")
+ �� 388 (defvar ediff-after-flag-mol "<<-"
+ �� 389 "*Like ediff-after-flag, used when a difference starts in mid-line.")
+ �� 390
+ �� 391 (ediff-defvar-local ediff-before-flag-A nil
+ �� 392 "This is the actual ASCII before-flag in effect in buffer A.
+ �� 393 It is either `ediff-before-flag-mol' or `ediff-before-flag-bol' depending
+ �� 394 on whether the selected difference region starts in the middle of a line
+ �� 395 or at the beginning of a line.")
+ �� 396 (ediff-defvar-local ediff-after-flag-A nil
+ �� 397 "This is the actual ASCII after-flag in effect in buffer A.
+ �� 398 It is either `ediff-before-flag-mol' or `ediff-before-flag-bol' depending
+ �� 399 on whether the selected difference region starts in the middle of a line
+ �� 400 or at the beginning of a line.")
+ �� 401
+ �� 402 (ediff-defvar-local ediff-before-flag-B nil
+ �� 403 "This is the actual ASCII before-flag in effect in buffer B.
+ �� 404 It is either `ediff-before-flag-mol' or `ediff-before-flag-bol' depending
+ �� 405 on whether the selected difference region starts in the middle of a line
+ �� 406 or at the beginning of a line.")
+ �� 407 (ediff-defvar-local ediff-after-flag-B nil
+ �� 408 "This is the actual ASCII after-flag in effect in buffer B.
+ �� 409 It is either `ediff-before-flag-mol' or `ediff-before-flag-bol' depending
+ �� 410 on whether the selected difference region starts in the middle of a line
+ �� 411 or at the beginning of a line.")
+ �� 412
+ �� 413 (ediff-defvar-local ediff-before-flag-C nil
+ �� 414 "This is the actual ASCII before-flag in effect in buffer C.
+ �� 415 It is either `ediff-before-flag-mol' or `ediff-before-flag-bol' depending
+ �� 416 on whether the selected difference region starts in the middle of a line
+ �� 417 or at the beginning of a line.")
+ �� 418 (ediff-defvar-local ediff-after-flag-C nil
+ �� 419 "This is the actual ASCII after-flag in effect in buffer C.
+ �� 420 It is either `ediff-before-flag-mol' or `ediff-before-flag-bol' depending
+ �� 421 on whether the selected difference region starts in the middle of a line
+ �� 422 or at the beginning of a line.")
+ �� 423
+ �� 424
+ �� 425 (ediff-defvar-local ediff-use-faces t
+ �� 426 "If t, differences are highlighted using faces on a window system.
+ �� 427 If nil, they are highlighted using ASCII flags, ediff-before-flag
+ �� 428 and ediff-after-flag. On a non-window system, differences are always
+ �� 429 highlighted using ASCII flags.
+ �� 430 This variable can be set either in .emacs or toggled interactively.
+ �� 431 Use `setq-default' if setting it in .emacs")
+ �� 432
+ �� 433
+ �� 434 ;; this indicates that diff regions are word-size, so fine diffs are
+ �� 435 ;; permanently nixed; used in ediff-windows and ediff-small-regions
+ �� 436 (ediff-defvar-local ediff-word-mode nil "")
+ �� 437 ;; Name of the job (ediff-files, ediff-windows, etc.
+ �� 438 (ediff-defvar-local ediff-job-name nil "")
+ �� 439
+ �� 440 ;; Narrowing and ediff-region/windows support
+ �� 441 ;; This is a list (overlay-A overlay-B overlay-C)
+ �� 442 ;; If set, Ediff compares only those parts of buffers A/B/C that lie within
+ �� 443 ;; the bounds of these overlays.
+ �� 444 (ediff-defvar-local ediff-narrow-bounds nil "")
+ �� 445
+ �� 446 ;; List (overlay-A overlay-B overlay-C), where each overlay spans the
+ �� 447 ;; entire corresponding buffer.
+ �� 448 (ediff-defvar-local ediff-wide-bounds nil "")
+ �� 449
+ �� 450 ;; Current visibility boundaries in buffers A, B, and C.
+ �� 451 ;; This is also a list of overlays. When the user toggles narrow/widen,
+ �� 452 ;; this list changes from ediff-wide-bounds to ediff-narrow-bounds.
+ �� 453 ;; and back.
+ �� 454 (ediff-defvar-local ediff-visible-bounds nil "")
+ �� 455
+ �� 456 (ediff-defvar-local ediff-start-narrowed t
+ �� 457 "Non-nil means start narrowed, if doing ediff-windows, ediff-small-regions,
+ �� 458 or ediff-large-regions.")
+ �� 459 (ediff-defvar-local ediff-quit-widened t
+ �� 460 "*Non-nil means: when finished, Ediff widens buffers A/B.
+ �� 461 Actually, Ediff restores the scope of visibility that existed at startup.")
+ �� 462
+ �� 463 (ediff-defvar-local ediff-highlight-all-diffs t
+ �� 464 "If nil, only the selected differences are highlighted.
+ �� 465 This variable can be set either in .emacs or toggled interactively, using
+ �� 466 ediff-toggle-hilit. Use `setq-default' to set it.")
+ �� 467
+ �� 468 ;; A var local to each control panel buffer. Indicates highlighting style
+ �� 469 ;; in effect for this buffer: `face', `ascii', nil -- temporarily
+ �� 470 ;; unhighlighted, `off' -- turned off \(on a dumb terminal only\).
+ �� 471 (ediff-defvar-local ediff-highlighting-style nil "")
+ �� 472
+ �� 473
+ �� 474 ;; Variables that control each Ediff session. They are local to the
+ �� 475 ;; control buffer.
+ �� 476
+ �� 477 ;; Mode variables
+ �� 478 ;; The buffer in which the A variant is stored.
+ �� 479 (ediff-defvar-local ediff-buffer-A nil "")
+ �� 480 ;; The buffer in which the B variant is stored.
+ �� 481 (ediff-defvar-local ediff-buffer-B nil "")
+ �� 482 ;; The buffer in which the C variant is stored.
+ �� 483 (ediff-defvar-local ediff-buffer-C nil "")
+ �� 484 ;; Ancestor buffer
+ �� 485 (ediff-defvar-local ediff-ancestor-buffer nil "")
+ �� 486 ;; The control buffer of ediff.
+ �� 487 (ediff-defvar-local ediff-control-buffer nil "")
+ �� 488
+ �� 489
+ �� 490 ;; The suffix of the control buffer name.
+ �� 491 (ediff-defvar-local ediff-control-buffer-suffix nil "")
+ �� 492 ;; Same as ediff-control-buffer-suffix, but without <,>.
+ �� 493 ;; It's a number rather than string.
+ �� 494 (ediff-defvar-local ediff-control-buffer-number nil "")
+ �� 495
+ �� 496
+ �� 497 ;; There three are to be deleted in due time
+ �� 498 ;; Working values of ediff-saved-variables for buffer A.
+ �� 499 (ediff-defvar-local ediff-buffer-A-values nil "")
+ �� 500 ;; working values of ediff-saved-variables for buffer B.
+ �� 501 (ediff-defvar-local ediff-buffer-B-values nil "")
+ �� 502 ;; working values of ediff-saved-variables for buffer C.
+ �� 503 (ediff-defvar-local ediff-buffer-C-values nil "")
+ �� 504
+ �� 505 ;; The original values of ediff-protected-variables for buffer A
+ �� 506 (ediff-defvar-local ediff-buffer-A-values-orig nil "")
+ �� 507 ;; The original values of ediff-protected-variables for buffer B
+ �� 508 (ediff-defvar-local ediff-buffer-B-values-orig nil "")
+ �� 509 ;; The original values of ediff-protected-variables for buffer C
+ �� 510 (ediff-defvar-local ediff-buffer-C-values-orig nil "")
+ �� 511 ;; Buffer-local variables to be saved then restored during Ediff sessions
+ �� 512 (defconst ediff-protected-variables '(buffer-read-only
+ �� 513 mode-line-format))
+ �� 514
+ �� 515 ;; These three vars are to be deleted when emacs gets before/after strings
+ �� 516 ;; Remember ediff-saved-variables for ediff-buffer-A as they were at setup.
+ �� 517 (ediff-defvar-local ediff-buffer-A-values-setup nil "")
+ �� 518 ;; Remembers ediff-saved-variables for ediff-buffer-B as they were at setup.
+ �� 519 (ediff-defvar-local ediff-buffer-B-values-setup nil "")
+ �� 520 ;; Remembers ediff-saved-variables for ediff-buffer-C as they were at setup.
+ �� 521 (ediff-defvar-local ediff-buffer-C-values-setup nil "")
+ �� 522
+ �� 523 ;; Vector of differences between the variants. Each difference is
+ �� 524 ;; represented by a vector of two overlays plus a vector of fine diffs,
+ �� 525 ;; plus a no-fine-diffs flag. The first overlay spans the
+ �� 526 ;; difference region in the A buffer and the second overlays the diff in
+ �� 527 ;; the B buffer. If a difference section is empty, the corresponding
+ �� 528 ;; overlay's endpoints coincide.
+ �� 529 ;;
+ �� 530 ;; The precise form of a difference vector for one buffer is:
+ �� 531 ;; [diff diff diff ...]
+ �� 532 ;; where each diff has the form:
+ �� 533 ;; [diff-overlay fine-diff-vector no-fine-diffs-flag state-of-difference
+ �� 534 ;; state-of-merge]
+ �� 535 ;; fine-diff-vector is a vector [fine-diff-overlay fine-diff-overlay ...]
+ �� 536 ;; no-fine-diffs-flag says if there are fine differences.
+ �� 537 ;; state-of-difference is A, B, C, or nil, indicating which buffer is
+ �� 538 ;; different from the other two (used only in 3-way jobs.
+ �� 539 ;; state-of-merge is default-A, default-B, prefer-A, or prefer-B. It
+ �� 540 ;; indicates the way a diff region was created in buffer C.
+ �� 541 (ediff-defvar-local ediff-difference-vector-A nil "")
+ �� 542 (ediff-defvar-local ediff-difference-vector-B nil "")
+ �� 543 (ediff-defvar-local ediff-difference-vector-C nil "")
+ �� 544
+ �� 545 ;; The difference that is currently selected.
+ �� 546 (ediff-defvar-local ediff-current-difference -1 "")
+ �� 547 ;; Number of differences found.
+ �� 548 (ediff-defvar-local ediff-number-of-differences nil "")
+ �� 549
+ �� 550 ;; Buffer containing the output of diff, which is used by Ediff to step
+ �� 551 ;; through files.
+ �� 552 (ediff-defvar-local ediff-diff-buffer nil "")
+ �� 553 ;; Like ediff-diff-buffer, but contains context diff. It is not used by
+ �� 554 ;; Ediff, but it is saved in a file, if user requests so.
+ �� 555 (ediff-defvar-local ediff-custom-diff-buffer nil "")
+ �� 556 ;; Buffer used for diff-style fine differences between regions.
+ �� 557 (ediff-defvar-local ediff-fine-diff-buffer nil "")
+ �� 558 ;; Temporary buffer used for computing fine differences.
+ �� 559 (defconst ediff-tmp-buffer " *ediff-tmp*" "")
+ �� 560 ;; Buffer used for messages
+ �� 561 (defconst ediff-msg-buffer " *ediff-message*" "")
+ �� 562 ;; Buffer containing the output of diff when diff returns errors.
+ �� 563 (ediff-defvar-local ediff-error-buffer nil "")
+ �� 564 ;; Buffer to display debug info
+ �� 565 (ediff-defvar-local ediff-debug-buffer "*ediff-debug*" "")
+ �� 566
+ �� 567 ;; to be deleted in due time
+ �� 568 ;; List of ediff control panels associated with each buffer A/B.
+ �� 569 (ediff-defvar-local ediff-this-buffer-control-sessions nil "")
+ �� 570
+ �� 571 ;; to be deleted in due time
+ �� 572 ;; List of difference overlays disturbed by working with the current diff.
+ �� 573 (defvar ediff-disturbed-overlays nil "")
+ �� 574
+ �� 575 ;; Priority of non-selected overlays.
+ �� 576 (defvar ediff-shadow-overlay-priority 100 "")
+ �� 577
+ �� 578
+ �� 579 (if ediff-xemacs-p
+ �� 580 (progn
+ �� 581 (fset 'ediff-read-event (symbol-function 'next-command-event))
+ �� 582 (fset 'ediff-overlayp (symbol-function 'extentp))
+ �� 583 (fset 'ediff-make-overlay (symbol-function 'make-extent))
+ �� 584 (fset 'ediff-delete-overlay (symbol-function 'delete-extent))
+ �� 585 (fset 'ediff-overlay-buffer (symbol-function 'extent-buffer))
+ �� 586 (fset 'ediff-overlay-p (symbol-function 'extentp))
+ �� 587 (fset 'ediff-overlay-get (symbol-function 'extent-property)))
+ �� 588 (fset 'ediff-read-event (symbol-function 'read-event))
+ �� 589 (fset 'ediff-overlayp (symbol-function 'overlayp))
+ �� 590 (fset 'ediff-make-overlay (symbol-function 'make-overlay))
+ �� 591 (fset 'ediff-delete-overlay (symbol-function 'delete-overlay))
+ �� 592 (fset 'ediff-overlay-buffer (symbol-function 'overlay-buffer))
+ �� 593 (fset 'ediff-overlay-p (symbol-function 'overlayp))
+ �� 594 (fset 'ediff-overlay-get (symbol-function 'overlay-get)))
+ �� 595
+ �� 596 ;; A fix for NeXT Step
+ �� 597 ;; Should probably be eliminated in later versions.
+ �� 598 (if (and window-system (eq window-system 'ns))
+ �� 599 (progn
+ �� 600 (fset 'x-display-color-p (symbol-function 'ns-display-color-p))
+ �� 601 (fset 'x-color-defined-p (symbol-function 'ns-color-defined-p))
+ �� 602 (fset 'x-display-pixel-height (symbol-function 'ns-display-pixel-height))
+ �� 603 (fset 'x-display-pixel-width (symbol-function 'ns-display-pixel-width))
+ �� 604 ))
+ �� 605
+ �� 606 (if ediff-xemacs-p
+ �� 607 (progn
+ �� 608 (fset 'ediff-make-frame (symbol-function 'make-screen))
+ �� 609 ;;(fset 'ediff-make-frame-invisible
+ �� 610 ;; (symbol-function 'make-screen-invisible))
+ �� 611 (fset 'ediff-raise-frame (symbol-function 'raise-screen))
+ �� 612 (fset 'ediff-iconify-frame (symbol-function 'iconify-screen))
+ �� 613 (fset 'ediff-delete-frame (symbol-function 'delete-screen))
+ �� 614 (fset 'ediff-frame-visible-p (symbol-function 'screen-visible-p))
+ �� 615 (fset 'ediff-select-frame (symbol-function 'select-screen))
+ �� 616 (fset 'ediff-selected-frame (symbol-function 'selected-screen))
+ �� 617 ;;(fset 'ediff-frame-selected-window
+ �� 618 ;; (symbol-function 'screen-selected-window))
+ �� 619 (fset 'ediff-frame-parameters (symbol-function 'screen-parameters))
+ �� 620 ;;(fset 'ediff-frame-pixel-width (symbol-function 'screen-pixel-width))
+ �� 621 (fset 'ediff-frame-width (symbol-function 'screen-width))
+ �� 622 (fset 'ediff-modify-frame-parameters
+ �� 623 (symbol-function 'modify-screen-parameters))
+ �� 624 (fset 'ediff-frame-live-p (symbol-function 'screen-live-p))
+ �� 625 (fset 'ediff-window-frame (symbol-function 'window-screen))
+ �� 626 (if window-system
+ �� 627 (progn
+ �� 628 (fset 'ediff-display-color-p (symbol-function 'x-color-display-p))
+ �� 629 (fset 'ediff-valid-color-p (symbol-function 'x-valid-color-name-p))
+ �� 630 (fset 'ediff-get-face (symbol-function 'get-face)))))
+ �� 631 (if window-system
+ �� 632 (progn
+ �� 633 (fset 'ediff-make-frame (symbol-function 'make-frame))
+ �� 634 ;;(fset 'ediff-make-frame-invisible
+ �� 635 ;; (symbol-function 'make-frame-invisible))
+ �� 636 (fset 'ediff-raise-frame (symbol-function 'raise-frame))
+ �� 637 (fset 'ediff-iconify-frame (symbol-function 'iconify-frame))
+ �� 638 (fset 'ediff-delete-frame (symbol-function 'delete-frame))
+ �� 639 (fset 'ediff-frame-visible-p (symbol-function 'frame-visible-p))
+ �� 640 (fset 'ediff-window-frame (symbol-function 'window-frame))
+ �� 641 (fset 'ediff-select-frame (symbol-function 'select-frame))
+ �� 642 (fset 'ediff-selected-frame (symbol-function 'selected-frame))
+ �� 643 ;;(fset 'ediff-frame-selected-window
+ �� 644 ;; (symbol-function 'frame-selected-window))
+ �� 645 (fset 'ediff-frame-parameters (symbol-function 'frame-parameters))
+ �� 646 ;;(fset 'ediff-frame-pixel-width (symbol-function 'frame-pixel-width))
+ �� 647 (fset 'ediff-frame-width (symbol-function 'frame-width))
+ �� 648 (fset 'ediff-modify-frame-parameters
+ �� 649 (symbol-function 'modify-frame-parameters))
+ �� 650 (fset 'ediff-frame-live-p (symbol-function 'frame-live-p))
+ �� 651 ))
+ �� 652
+ �� 653 (if window-system
+ �� 654 (progn
+ �� 655 (fset 'ediff-display-color-p (symbol-function 'x-display-color-p))
+ �� 656 ;; Temporary fix for OS/2 users
+ �� 657 ;; pm-win.el in PM-Emacs should be fixed.
+ �� 658 (if (eq window-system 'pm)
+ �� 659 (fset 'ediff-valid-color-p
+ �� 660 (function (lambda (color) (assoc color pm-color-alist))))
+ �� 661 (fset 'ediff-valid-color-p (symbol-function 'x-color-defined-p)))
+ �� 662
+ �� 663 (fset 'ediff-get-face (symbol-function 'internal-get-face))))
+ �� 664 )
+ �� 665
+ �� 666 ;; not a window system
+ �� 667 (if (not window-system)
+ �� 668 (progn
+ �� 669 (fset 'ediff-window-frame (function (lambda (wind) (if wind 1 nil)) ))
+ �� 670 (fset 'ediff-selected-frame 'selected-window)
+ �� 671 (fset 'ediff-frame-width 'window-width)
+ �� 672 (fset 'ediff-make-current-diff-overlay (function (lambda (type) nil)))))
+ �� 673
+ �� 674 (if (not window-system)
+ �� 675 ()
+ �� 676 (defun ediff-set-face (ground face color)
+ �� 677 "Sets face foreground/background."
+ �� 678 (if (ediff-valid-color-p color)
+ �� 679 (if (eq ground 'foreground)
+ �� 680 (set-face-foreground face color)
+ �� 681 (set-face-background face color))
+ �� 682 (cond ((memq face
+ �� 683 '(ediff-current-diff-face-A
+ �� 684 ediff-current-diff-face-B
+ �� 685 ediff-current-diff-face-C))
+ �� 686 (copy-face 'highlight face))
+ �� 687 ((memq face
+ �� 688 '(ediff-fine-diff-face-A
+ �� 689 ediff-fine-diff-face-B
+ �� 690 ediff-fine-diff-face-C
+ �� 691 ;; ediff-combined-diff-face
+ �� 692 ))
+ �� 693 (copy-face 'secondary-selection face)
+ �� 694 (set-face-underline-p face t))
+ �� 695 ((memq face
+ �� 696 '(ediff-even-diff-face-A ediff-odd-diff-face-A
+ �� 697 ediff-even-diff-face-B ediff-odd-diff-face-B
+ �� 698 ediff-even-diff-face-C ediff-odd-diff-face-C))
+ �� 699 (copy-face 'secondary-selection face)))))
+ �� 700
+ �� 701 (defvar ediff-current-diff-face-A
+ �� 702 (progn
+ �� 703 (make-face 'ediff-current-diff-face-A)
+ �� 704 (or (face-differs-from-default-p 'ediff-current-diff-face-A)
+ �� 705 (cond ((ediff-display-color-p)
+ �� 706 (ediff-set-face
+ �� 707 'foreground 'ediff-current-diff-face-A "firebrick")
+ �� 708 (ediff-set-face
+ �� 709 'background 'ediff-current-diff-face-A "pale green"))
+ �� 710 (t
+ �� 711 (if ediff-xemacs-p
+ �� 712 (copy-face 'modeline 'ediff-current-diff-face-A)
+ �� 713 (copy-face 'highlight 'ediff-current-diff-face-A))
+ �� 714 )))
+ �� 715 'ediff-current-diff-face-A)
+ �� 716 "Face for highlighting the selected difference in buffer A.")
+ �� 717
+ �� 718 (defvar ediff-current-diff-face-B
+ �� 719 (progn
+ �� 720 (make-face 'ediff-current-diff-face-B)
+ �� 721 (or (face-differs-from-default-p 'ediff-current-diff-face-B)
+ �� 722 (cond ((ediff-display-color-p)
+ �� 723 (ediff-set-face
+ �� 724 'foreground 'ediff-current-diff-face-B "DarkOrchid")
+ �� 725 (ediff-set-face
+ �� 726 'background 'ediff-current-diff-face-B "Yellow"))
+ �� 727 (t
+ �� 728 (if ediff-xemacs-p
+ �� 729 (copy-face 'modeline 'ediff-current-diff-face-B)
+ �� 730 (copy-face 'highlight 'ediff-current-diff-face-B))
+ �� 731 )))
+ �� 732 'ediff-current-diff-face-B)
+ �� 733 "Face for highlighting the selected difference in buffer B.")
+ �� 734
+ �� 735
+ �� 736 (defvar ediff-current-diff-face-C
+ �� 737 (progn
+ �� 738 (make-face 'ediff-current-diff-face-C)
+ �� 739 (or (face-differs-from-default-p 'ediff-current-diff-face-C)
+ �� 740 (cond ((ediff-display-color-p)
+ �� 741 (ediff-set-face
+ �� 742 'foreground 'ediff-current-diff-face-C "Navy")
+ �� 743 (ediff-set-face
+ �� 744 'background 'ediff-current-diff-face-C "Pink"))
+ �� 745 (t
+ �� 746 (if ediff-xemacs-p
+ �� 747 (copy-face 'modeline 'ediff-current-diff-face-C)
+ �� 748 (copy-face 'highlight 'ediff-current-diff-face-C))
+ �� 749 )))
+ �� 750 'ediff-current-diff-face-C)
+ �� 751 "Face for highlighting the selected difference in buffer C.")
+ �� 752
+ �� 753 (defvar ediff-fine-diff-face-A
+ �� 754 (progn
+ �� 755 (make-face 'ediff-fine-diff-face-A)
+ �� 756 (or (face-differs-from-default-p 'ediff-fine-diff-face-A)
+ �� 757 (cond ((ediff-display-color-p)
+ �� 758 (ediff-set-face 'foreground 'ediff-fine-diff-face-A
+ �� 759 "Navy")
+ �� 760 (ediff-set-face 'background 'ediff-fine-diff-face-A
+ �� 761 "sky blue"))
+ �� 762 (t (set-face-underline-p 'ediff-fine-diff-face-A t))))
+ �� 763 'ediff-fine-diff-face-A)
+ �� 764 "Face for highlighting the refinement of the selected diff in buffer A.")
+ �� 765
+ �� 766 (defvar ediff-fine-diff-face-B
+ �� 767 (progn
+ �� 768 (make-face 'ediff-fine-diff-face-B)
+ �� 769 (or (face-differs-from-default-p 'ediff-fine-diff-face-B)
+ �� 770 (cond ((ediff-display-color-p)
+ �� 771 (ediff-set-face 'foreground 'ediff-fine-diff-face-B "Black")
+ �� 772 (ediff-set-face 'background 'ediff-fine-diff-face-B "cyan"))
+ �� 773 (t (set-face-underline-p 'ediff-fine-diff-face-B t))))
+ �� 774 'ediff-fine-diff-face-B)
+ �� 775 "Face for highlighting the refinement of the selected diff in buffer B.")
+ �� 776
+ �� 777 (defvar ediff-fine-diff-face-C
+ �� 778 (progn
+ �� 779 (make-face 'ediff-fine-diff-face-C)
+ �� 780 (or (face-differs-from-default-p 'ediff-fine-diff-face-C)
+ �� 781 (cond ((ediff-display-color-p)
+ �� 782 (ediff-set-face 'foreground 'ediff-fine-diff-face-C "black")
+ �� 783 (ediff-set-face
+ �� 784 'background 'ediff-fine-diff-face-C "Turquoise"))
+ �� 785 (t (set-face-underline-p 'ediff-fine-diff-face-C t))))
+ �� 786 'ediff-fine-diff-face-C)
+ �� 787 "Face for highlighting the refinement of the selected diff in buffer C.")
+ �� 788
+ �� 789 ;; (defvar ediff-combined-diff-face
+ �� 790 ;; (progn
+ �� 791 ;; (make-face 'ediff-combined-diff-face)
+ �� 792 ;; (or (face-differs-from-default-p 'ediff-combined-diff-face)
+ �� 793 ;; (cond ((ediff-display-color-p)
+ �� 794 ;; (ediff-set-face 'foreground 'ediff-combined-diff-face "black")
+ �� 795 ;; (ediff-set-face
+ �� 796 ;; 'background 'ediff-combined-diff-face "Plum"))
+ �� 797 ;; (t (set-face-underline-p 'ediff-combined-diff-face t))))
+ �� 798 ;; 'ediff-combined-diff-face)
+ �� 799 ;; "Face for highlighting combined selected diff regions in buffer C.")
+ �� 800
+ �� 801 (defvar ediff-even-diff-face-A
+ �� 802 (progn
+ �� 803 (make-face 'ediff-even-diff-face-A)
+ �� 804 (or (face-differs-from-default-p 'ediff-even-diff-face-A)
+ �� 805 (cond ((ediff-display-color-p)
+ �� 806 (ediff-set-face
+ �� 807 'foreground 'ediff-even-diff-face-A "black")
+ �� 808 (ediff-set-face
+ �� 809 'background 'ediff-even-diff-face-A "light grey"))
+ �� 810 (t
+ �� 811 (copy-face 'italic 'ediff-even-diff-face-A))))
+ �� 812 'ediff-even-diff-face-A)
+ �� 813 "Face used to highlight even-numbered differences in buffer A.")
+ �� 814
+ �� 815 (defvar ediff-even-diff-face-B
+ �� 816 (progn
+ �� 817 (make-face 'ediff-even-diff-face-B)
+ �� 818 (or (face-differs-from-default-p 'ediff-even-diff-face-B)
+ �� 819 (cond ((ediff-display-color-p)
+ �� 820 (ediff-set-face
+ �� 821 'foreground 'ediff-even-diff-face-B "White")
+ �� 822 (ediff-set-face
+ �� 823 'background 'ediff-even-diff-face-B "Gray"))
+ �� 824 (t
+ �� 825 (copy-face 'italic 'ediff-even-diff-face-B))))
+ �� 826 'ediff-even-diff-face-B)
+ �� 827 "Face used to highlight even-numbered differences in buffer B.")
+ �� 828
+ �� 829 (defvar ediff-even-diff-face-C
+ �� 830 (progn
+ �� 831 (make-face 'ediff-even-diff-face-C)
+ �� 832 (copy-face 'ediff-even-diff-face-A 'ediff-even-diff-face-C)
+ �� 833 'ediff-even-diff-face-C)
+ �� 834 "Face used to highlight even-numbered differences in buffer C.")
+ �� 835
+ �� 836 (defvar ediff-odd-diff-face-A
+ �� 837 (progn
+ �� 838 (make-face 'ediff-odd-diff-face-A)
+ �� 839 (or (face-differs-from-default-p 'ediff-odd-diff-face-A)
+ �� 840 (cond ((ediff-display-color-p)
+ �� 841 (ediff-set-face
+ �� 842 'foreground 'ediff-odd-diff-face-A "White")
+ �� 843 (ediff-set-face
+ �� 844 'background 'ediff-odd-diff-face-A "Gray"))
+ �� 845 (t
+ �� 846 (copy-face 'italic 'ediff-odd-diff-face-A))))
+ �� 847 'ediff-odd-diff-face-A)
+ �� 848 "Face used to highlight odd-numbered differences in buffer A.")
+ �� 849
+ �� 850 (defvar ediff-odd-diff-face-B
+ �� 851 (progn
+ �� 852 (make-face 'ediff-odd-diff-face-B)
+ �� 853 (or (face-differs-from-default-p 'ediff-odd-diff-face-B)
+ �� 854 (cond ((ediff-display-color-p)
+ �� 855 (ediff-set-face
+ �� 856 'foreground 'ediff-odd-diff-face-B "Black")
+ �� 857 (ediff-set-face
+ �� 858 'background 'ediff-odd-diff-face-B "light grey"))
+ �� 859 (t
+ �� 860 (copy-face 'italic 'ediff-odd-diff-face-B))))
+ �� 861 'ediff-odd-diff-face-B)
+ �� 862 "Face used to highlight odd-numbered differences in buffer B.")
+ �� 863
+ �� 864 (defvar ediff-odd-diff-face-C
+ �� 865 (progn
+ �� 866 (make-face 'ediff-odd-diff-face-C)
+ �� 867 (copy-face 'ediff-odd-diff-face-A 'ediff-odd-diff-face-C)
+ �� 868 'ediff-odd-diff-face-C)
+ �� 869 "Face used to highlight odd-numbered differences in buffer C.")
+ �� 870
+ �� 871 ;; Create *-var faces. These are the actual faces used to highlight
+ �� 872 ;; odd-numbered difference regions.
+ �� 873 ;; They are used as follows: when highlighting is turned on,
+ �� 874 ;; ediff-odd/even-diff-face-A/B/C are copied
+ �� 875 ;; into ediff-odd/even-diff-face-A/B/C-var, and all odd/even overlays become
+ �� 876 ;; highlighted. When highlighting is turned off, then the face 'default is
+ �� 877 ;; copied into ediff-odd/even-diff-face-A/B/C-var, thereby unhighlighting all
+ �� 878 ;; difference regions.
+ �� 879 (make-face 'ediff-even-diff-face-A-var)
+ �� 880 (make-face 'ediff-even-diff-face-B-var)
+ �� 881 (make-face 'ediff-even-diff-face-C-var)
+ �� 882 (make-face 'ediff-odd-diff-face-A-var)
+ �� 883 (make-face 'ediff-odd-diff-face-B-var)
+ �� 884 (make-face 'ediff-odd-diff-face-C-var)
+ �� 885
+ �� 886 ;; initialize *-var faces
+ �� 887 (defun ediff-init-var-faces ()
+ �� 888 (copy-face (if (and ediff-use-faces ediff-highlight-all-diffs)
+ �� 889 ediff-even-diff-face-A 'default)
+ �� 890 'ediff-even-diff-face-A-var)
+ �� 891 (copy-face (if (and ediff-use-faces ediff-highlight-all-diffs)
+ �� 892 ediff-even-diff-face-B 'default)
+ �� 893 'ediff-even-diff-face-B-var)
+ �� 894 (copy-face (if (and ediff-use-faces ediff-highlight-all-diffs)
+ �� 895 ediff-even-diff-face-C 'default)
+ �� 896 'ediff-even-diff-face-C-var)
+ �� 897 (copy-face (if (and ediff-use-faces ediff-highlight-all-diffs)
+ �� 898 ediff-odd-diff-face-A 'default)
+ �� 899 'ediff-odd-diff-face-A-var)
+ �� 900 (copy-face (if (and ediff-use-faces ediff-highlight-all-diffs)
+ �� 901 ediff-odd-diff-face-B 'default)
+ �� 902 'ediff-odd-diff-face-B-var)
+ �� 903 (copy-face (if (and ediff-use-faces ediff-highlight-all-diffs)
+ �� 904 ediff-odd-diff-face-C 'default)
+ �� 905 'ediff-odd-diff-face-C-var)
+ �� 906 )
+ �� 907
+ �� 908
+ �� 909 ;;; Overlays
+ �� 910
+ �� 911 (ediff-defvar-local ediff-current-diff-overlay-A nil
+ �� 912 "Overlay for the current difference region in buffer A.")
+ �� 913 (ediff-defvar-local ediff-current-diff-overlay-B nil
+ �� 914 "Overlay for the current difference region in buffer B.")
+ �� 915 (ediff-defvar-local ediff-current-diff-overlay-C nil
+ �� 916 "Overlay for the current difference region in buffer C.")
+ �� 917
+ �� 918 (defun ediff-make-current-diff-overlay (type)
+ �� 919 (let ((overlay (intern (format "ediff-current-diff-overlay-%S" type)))
+ �� 920 (buffer (ediff-get-buffer type))
+ �� 921 (face (face-name
+ �� 922 (symbol-value
+ �� 923 (intern (format "ediff-current-diff-face-%S" type))))))
+ �� 924 (set overlay
+ �� 925 (ediff-make-bullet-proof-overlay (point-max) (point-max) buffer))
+ �� 926 (ediff-overlay-put (symbol-value overlay) 'face face)
+ �� 927 (ediff-overlay-put (symbol-value overlay) 'ediff ediff-control-buffer)
+ �� 928 ))
+ �� 929
+ �� 930 ;; Compute priority of ediff overlay.
+ �� 931 (defun ediff-highest-priority (start end buffer)
+ �� 932 (let ((pos (max 1 (1- start)))
+ �� 933 ovr-list)
+ �� 934 (if ediff-xemacs-p
+ �� 935 (1+ ediff-shadow-overlay-priority)
+ �� 936 (ediff-eval-in-buffer buffer
+ �� 937 (while (< pos (min (point-max) (1+ end)))
+ �� 938 (setq ovr-list (append (overlays-at pos) ovr-list))
+ �� 939 (setq pos (next-overlay-change pos)))
+ �� 940 (1+ (apply '+
+ �� 941 (mapcar (function
+ �� 942 (lambda (ovr)
+ �� 943 (if ovr
+ �� 944 (or (ediff-overlay-get ovr 'priority) 0)
+ �� 945 0)))
+ �� 946 ovr-list)
+ �� 947 ))
+ �� 948 ))))
+ �� 949
+ �� 950 ) ; end of window-system-only code.
+ �� 951
+ �� 952
+ �� 953 (defvar ediff-toggle-read-only-function nil
+ �� 954 "*Specifies the function to be used to toggle read-only.
+ �� 955 If nil, Ediff tries to deduce the function from the binding of C-x C-q.
+ �� 956 Normally, this is the `toggle-read-only' function, but, if version
+ �� 957 control is used, it could be `vc-toggle-read-only' or `rcs-toggle-read-only'.")
+ �� 958
+ �� 959 (ediff-defvar-local ediff-file-checked-out-flag nil
+ �� 960 "If t, indicates that buffer has been already checked out.")
+ �� 961
+ �� 962
+ �� 963
+ �� 964 ;;; Misc
+ �� 965
+ �� 966 ;; when emacs will have before/after-string in overlays, this variable will
+ �� 967 ;; be deleted
+ �� 968 (defconst ediff-saved-variables
+ �� 969 '(;;buffer-read-only
+ �� 970 buffer-auto-save-file-name)
+ �� 971 "Buffer-local variables saved and restored during an Ediff session.")
+ �� 972
+ �� 973 ;; to be deleted in due time
+ �� 974 (defconst ediff-working-values '(nil)
+ �� 975 "Values to be assigned to `ediff-saved-variables' during diff.")
+ �� 976
+ �� 977 ;; if nil, this silences some messages
+ �� 978 (defconst ediff-verbose-p t)
+ �� 979
+ �� 980 (defvar ediff-no-emacs-help-in-control-buffer nil
+ �� 981 "*Non-nil means C-h should not invoke Emacs help in control buffer.
+ �� 982 Instead, C-h jumps to previous difference.")
+ �� 983
+ �� 984 (defvar ediff-temp-file-prefix
+ �� 985 (let ((env (or (getenv "TMPDIR")
+ �� 986 (getenv "TMP")
+ �� 987 (getenv "TEMP")))
+ �� 988 d)
+ �� 989 (setq d (if (and env (> (length env) 0))
+ �� 990 env
+ �� 991 (if (memq system-type '(vax-vms axp-vms))
+ �� 992 "SYS$SCRATCH:"
+ �� 993 "/tmp")))
+ �� 994 ;; The following is to make sure we get something to which we can
+ �� 995 ;; add directory levels on VMS.
+ �� 996 (setq d (file-name-as-directory (directory-file-name d)))
+ �� 997 ;;(concat d "ediff")
+ �� 998 )
+ �� 999 "*Prefix to put on Ediff temporary file names.
+ �� 1000 Do not start with `~/' or `~user-name/'.")
+ �� 1001
+ �� 1002 (defvar ediff-temp-file-mode 384 ; u=rw only
+ �� 1003 "*Mode for Ediff temporary files.")
+ �� 1004
+ �� 1005 ;; Metacharacters that have to be protected from the shell when executing
+ �� 1006 ;; a diff/diff3 command.
+ �� 1007 (defvar ediff-metachars "[ \t\n!\"#$&'()*;<=>?[\\^`{|~]"
+ �� 1008 "Characters that must be quoted with \\ when used in a shell command line.
+ �� 1009 More precisely, a regexp to match any one such character.")
+ �� 1010
+ �� 1011
+ �� 1012 (ediff-defvar-local ediff-temp-file-A nil
+ �� 1013 "Temporary file used for refining difference regions in buffer A.")
+ �� 1014 (ediff-defvar-local ediff-temp-file-B nil
+ �� 1015 "Temporary file used for refining difference regions in buffer B.")
+ �� 1016 (ediff-defvar-local ediff-temp-file-C nil
+ �� 1017 "Temporary file used for refining difference regions in buffer C.")
+ �� 1018
+ �� 1019 ;;; In-line functions
+ �� 1020
+ �� 1021 (defsubst ediff-file-remote-p (file-name)
+ �� 1022 (if (fboundp ediff-ange-ftp-ftp-name)
+ �� 1023 (funcall ediff-ange-ftp-ftp-name file-name)))
+ �� 1024
+ �� 1025 (defsubst ediff-frame-has-menubar ()
+ �� 1026 (and window-system
+ �� 1027 (if ediff-xemacs-p
+ �� 1028 current-menubar
+ �� 1029 (let ((lines (cdr (assq 'menu-bar-lines
+ �� 1030 (frame-parameters (ediff-selected-frame))))))
+ �� 1031 (or (eq lines t) (and (numberp lines) (< 0 lines))))
+ �� 1032 )))
+ �� 1033
+ �� 1034 (defsubst ediff-frame-unsplittable-p (frame)
+ �� 1035 (cdr (assq 'unsplittable (ediff-frame-parameters frame))))
+ �� 1036
+ �� 1037 (defsubst ediff-get-next-window (wind prev-wind)
+ �� 1038 (or (window-live-p wind)
+ �� 1039 (setq wind (if prev-wind
+ �� 1040 (next-window wind)
+ �� 1041 (selected-window)))))
+ �� 1042
+ �� 1043 (defsubst ediff-convert-diffs-to-overlays (diff-list)
+ �� 1044 (ediff-set-diff-overlays-in-one-buffer 'A diff-list)
+ �� 1045 (ediff-set-diff-overlays-in-one-buffer 'B diff-list)
+ �� 1046 (if ediff-3way-job
+ �� 1047 (ediff-set-diff-overlays-in-one-buffer 'C diff-list))
+ �� 1048 (message "Processing difference regions ... done"))
+ �� 1049
+ �� 1050
+ �� 1051 (defsubst ediff-kill-buffer-carefully (buf)
+ �� 1052 "Kill buffer BUF if it exists."
+ �� 1053 (if (ediff-buffer-live-p buf)
+ �� 1054 (kill-buffer (get-buffer buf))))
+ �� 1055
+ �� 1056
+ �� 1057 (defsubst ediff-highlight-diff (n)
+ �� 1058 "Put face on diff N. Invoked for X displays only."
+ �� 1059 (ediff-highlight-diff-in-one-buffer n 'A)
+ �� 1060 (ediff-highlight-diff-in-one-buffer n 'B)
+ �� 1061 (ediff-highlight-diff-in-one-buffer n 'C))
+ �� 1062
+ �� 1063
+ �� 1064 (defsubst ediff-unhighlight-diff ()
+ �� 1065 "Remove overlays from buffers A, B, and C."
+ �� 1066 (ediff-unhighlight-diff-in-one-buffer 'A)
+ �� 1067 (ediff-unhighlight-diff-in-one-buffer 'B)
+ �� 1068 (ediff-unhighlight-diff-in-one-buffer 'C))
+ �� 1069
+ �� 1070 ;; delete highlighting overlays, restore faces to their original form
+ �� 1071 (defsubst ediff-unhighlight-diffs-totally ()
+ �� 1072 (ediff-unhighlight-diffs-totally-in-one-buffer 'A)
+ �� 1073 (ediff-unhighlight-diffs-totally-in-one-buffer 'B)
+ �� 1074 (ediff-unhighlight-diffs-totally-in-one-buffer 'C))
+ �� 1075
+ �� 1076
+ �� 1077 ;; arg is a record for a given diff in a difference vector
+ �� 1078 ;; this record is itself a vector
+ �� 1079 (defsubst ediff-clear-fine-diff-vector (diff-record)
+ �� 1080 (if diff-record
+ �� 1081 (mapcar 'ediff-delete-overlay
+ �� 1082 (ediff-get-fine-diff-vector-from-diff-record diff-record))))
+ �� 1083
+ �� 1084 (defsubst ediff-clear-fine-differences-in-one-buffer (n buf-type)
+ �� 1085 (ediff-clear-fine-diff-vector (ediff-get-difference n buf-type))
+ �� 1086 (ediff-set-fine-diff-vector n buf-type nil))
+ �� 1087
+ �� 1088 (defsubst ediff-clear-fine-differences (n)
+ �� 1089 (ediff-clear-fine-differences-in-one-buffer n 'A)
+ �� 1090 (ediff-clear-fine-differences-in-one-buffer n 'B)
+ �� 1091 (if ediff-3way-job
+ �� 1092 (ediff-clear-fine-differences-in-one-buffer n 'C)))
+ �� 1093
+ �� 1094
+ �� 1095 (defsubst ediff-convert-fine-diffs-to-overlays (diff-list region-num)
+ �� 1096 (ediff-set-fine-overlays-in-one-buffer 'A diff-list region-num)
+ �� 1097 (ediff-set-fine-overlays-in-one-buffer 'B diff-list region-num)
+ �� 1098 (if ediff-3way-job
+ �� 1099 (ediff-set-fine-overlays-in-one-buffer 'C diff-list region-num)
+ �� 1100 ))
+ �� 1101
+ �� 1102 (defsubst ediff-mouse-event-p (event)
+ �� 1103 (if ediff-xemacs-p
+ �� 1104 (button-event-p event)
+ �� 1105 (string-match "mouse" (format "%S" (event-basic-type event)))
+ �� 1106 ))
+ �� 1107
+ �� 1108 (defsubst ediff-frame-iconified-p (frame)
+ �� 1109 (if (and window-system (ediff-frame-live-p frame))
+ �� 1110 (if ediff-xemacs-p
+ �� 1111 (screen-iconified-p frame)
+ �� 1112 (eq (frame-visible-p frame) 'icon))))
+ �� 1113
+ �� 1114 (defsubst ediff-window-visible-p (wind)
+ �� 1115 (and (window-live-p wind)
+ �� 1116 ;; under non-wondow system, window-live-p also means window is visible
+ �� 1117 (or (not window-system)
+ �� 1118 (ediff-frame-visible-p (ediff-window-frame wind)))))
+ �� 1119
+ �� 1120
+ �� 1121 (defsubst ediff-frame-char-width (frame)
+ �� 1122 (if ediff-xemacs-p
+ �� 1123 (/ (screen-pixel-width frame) (screen-width frame))
+ �� 1124 (frame-char-width frame)))
+ �� 1125
+ �� 1126 (defsubst ediff-frame-char-height (frame)
+ �� 1127 (if ediff-xemacs-p
+ �� 1128 (/ (screen-pixel-height frame) (screen-height frame))
+ �� 1129 (frame-char-height frame)))
+ �� 1130
+ �� 1131
+ �� 1132 (defsubst ediff-empty-overlay-p (overl)
+ �� 1133 (= (ediff-overlay-start overl) (ediff-overlay-end overl)))
+ �� 1134
+ �� 1135 ;; t if diff region is empty.
+ �� 1136 ;; In case of buffer C, t also if it is not a 3way
+ �� 1137 ;; comparison job (merging jobs return t as well).
+ �� 1138 (defun ediff-empty-diff-region-p (n buf-type)
+ �� 1139 (if (eq buf-type 'C)
+ �� 1140 (or (not ediff-3way-comparison-job)
+ �� 1141 (= (ediff-get-diff-posn 'C 'beg n)
+ �� 1142 (ediff-get-diff-posn 'C 'end n)))
+ �� 1143 (= (ediff-get-diff-posn buf-type 'beg n)
+ �� 1144 (ediff-get-diff-posn buf-type 'end n))))
+ �� 1145
+ �� 1146 ;; Test if diff region is white space only.
+ �� 1147 ;; If 2-way job and buf-type = C, then returns t.
+ �� 1148 (defun ediff-whitespace-diff-region-p (n buf-type)
+ �� 1149 (or (and (eq buf-type 'C) (not ediff-3way-job))
+ �� 1150 (let ((beg (ediff-get-diff-posn buf-type 'beg n))
+ �� 1151 (end (ediff-get-diff-posn buf-type 'end n)))
+ �� 1152 (ediff-eval-in-buffer (ediff-get-buffer buf-type)
+ �� 1153 (save-excursion
+ �� 1154 (goto-char beg)
+ �� 1155 (skip-chars-forward ediff-whitespace)
+ �� 1156 (>= (point) end))))))
+ �� 1157
+ �� 1158 ;; temporarily uses DIR to abbreviate file name
+ �� 1159 ;; if DIR is nil, use default-directory
+ �� 1160 (defsubst ediff-abbreviate-filename (file dir)
+ �� 1161 (let* ((dir (or dir default-directory))
+ �� 1162 (directory-abbrev-alist (list (cons dir ""))))
+ �� 1163 (abbreviate-file-name file)))
+ �� 1164
+ �� 1165 (defsubst ediff-get-region-contents (n buf-type ctrl-buf &optional start end)
+ �� 1166 (ediff-eval-in-buffer
+ �� 1167 (ediff-eval-in-buffer ctrl-buf (ediff-get-buffer buf-type))
+ �� 1168 (buffer-substring
+ �� 1169 (or start (ediff-get-diff-posn buf-type 'beg n ctrl-buf))
+ �� 1170 (or end (ediff-get-diff-posn buf-type 'end n ctrl-buf)))))
+ �� 1171
+ �� 1172 ;; If ediff modified mode line, strip the modification
+ �� 1173 (defsubst ediff-strip-mode-line-format ()
+ �� 1174 (if (member (car mode-line-format) '(" A: " " B: " " C: "))
+ �� 1175 (setq mode-line-format (nth 2 mode-line-format))))
+ �� 1176
+ �� 1177 ;; Verify that we have a difference selected.
+ �� 1178 (defsubst ediff-valid-difference-p (&optional n)
+ �� 1179 (or n (setq n ediff-current-difference))
+ �� 1180 (and (>= n 0) (< n ediff-number-of-differences)))
+ �� 1181
+ �� 1182 (defsubst ediff-show-all-diffs (n)
+ �� 1183 "Don't skip difference regions."
+ �� 1184 nil)
+ �� 1185
+ �� 1186 (provide 'ediff-init)
+ �� 1187
+ �� 1188
+ �� 1189 ;;; ediff-init.el ends here