1 ;;; ediff-init.el --- Macros, variables and defsubsts used by Ediff
2 ;;; Copyright (C) 1994 Free Software Foundation, Inc.
4 ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
6 ;; This file is part of GNU Emacs.
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)
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.
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.
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.")
29 (defmacro ediff-odd-p (arg)
30 (` (eq (logand (, arg) 1) 1)))
32 (defmacro ediff-buffer-live-p (buf)
33 (` (and (, buf) (get-buffer (, buf)) (buffer-name (get-buffer (, buf))))))
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)
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))))))
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)
54 (defmacro ediff-get-difference (n buf-type)
57 (intern (format "ediff-difference-vector-%S" (, buf-type)))) (, n))))
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.
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)))
72 (defmacro ediff-get-diff-overlay-from-diff-record (diff-rec)
73 (` (aref (, diff-rec) 0)))
75 (defmacro ediff-get-diff-overlay (n buf-type)
76 (` (ediff-get-diff-overlay-from-diff-record
77 (ediff-get-difference (, n) (, buf-type)))))
79 (defmacro ediff-get-fine-diff-vector-from-diff-record (diff-rec)
80 (` (aref (, diff-rec) 1)))
82 (defmacro ediff-set-fine-diff-vector (n buf-type fine-vec)
83 (` (aset (ediff-get-difference (, n) (, buf-type)) 1 (, fine-vec))))
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))))
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))))
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)))))
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.
114 ;; Plagiarised from `emerge-defvar-local' for XEmacs.
115 (defmacro ediff-defvar-local (var value doc)
117 (defvar (, var) (, value) (, doc))
118 (make-variable-buffer-local '(, var))
119 (put '(, var) 'permanent-local t))))
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))
129 (set-buffer (, buffer))
131 (set-buffer StartBuffer))
132 (or (eq this-command 'ediff-quit)
134 "You've killed an essential Ediff buffer---Please quit Ediff"))
138 (defmacro ediff-multiframe-setup-p ()
139 (` (and window-system ediff-multiframe)))
141 (defmacro ediff-narrow-control-frame-p ()
142 (` (and (ediff-multiframe-setup-p)
143 (equal ediff-help-message ediff-brief-message-string))))
145 (defmacro ediff-3way-comparison-job ()
148 '(ediff-files3 ediff-buffers3))))
149 (ediff-defvar-local ediff-3way-comparison-job nil "")
151 (defmacro ediff-merge-job ()
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 "")
162 (defmacro ediff-merge-with-ancestor-job ()
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 "")
170 (defmacro ediff-3way-job ()
171 (` (or ediff-3way-comparison-job ediff-merge-job)))
172 (ediff-defvar-local ediff-3way-job nil "")
174 ;; A diff3 job is like a 3way job, but ediff-merge doesn't require the use
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 "")
181 (defmacro ediff-word-mode-job ()
184 '(ediff-windows ediff-small-regions ediff-large-regions))))
185 (ediff-defvar-local ediff-word-mode-job nil "")
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
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.")
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.")
222 (defvar ediff-display-help-hooks nil
223 "*Hooks run after preparing the help message.")
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.")
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)
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.")
250 (defconst ediff-long-help-message-compare3
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
261 "Normally, not a user option. See `ediff-help-message' for details.")
263 (defconst ediff-long-help-message-compare2
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
274 "Normally, not a user option. See `ediff-help-message' for details.")
276 (defconst ediff-long-help-message-word-mode
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
281 gx -goto X's point| % -narrow/widen buffs | ! -recompute diffs
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
287 "Normally, not a user option. See `ediff-help-message' for details.")
289 (defconst ediff-long-help-message-merge
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
301 "Normally, not a user option. See `ediff-help-message' for details.")
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.")
307 (defconst ediff-brief-message-string
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.")
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.")
322 (defvar ediff-prefer-long-help-message nil
323 "*If t, Ediff starts with a long help message. Short help msg otherwise.")
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'.")
333 ;; Selective browsing
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
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 "")
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 "")
363 (defvar ediff-ange-ftp-ftp-name (if ediff-xemacs-p
366 "Function ange-ftp uses to find out if file is remote.")
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.")
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.")
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.")
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.")
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.")
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.")
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")
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 "")
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 "")
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 "")
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.
454 (ediff-defvar-local ediff-visible-bounds nil "")
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.")
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.")
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 "")
474 ;; Variables that control each Ediff session. They are local to the
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 "")
485 (ediff-defvar-local ediff-ancestor-buffer nil "")
486 ;; The control buffer of ediff.
487 (ediff-defvar-local ediff-control-buffer nil "")
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 "")
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 "")
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
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 "")
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.
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
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 "")
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 "")
550 ;; Buffer containing the output of diff, which is used by Ediff to step
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*" "")
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 "")
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 "")
575 ;; Priority of non-selected overlays.
576 (defvar ediff-shadow-overlay-priority 100 "")
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)))
596 ;; A fix for NeXT Step
597 ;; Should probably be eliminated in later versions.
598 (if (and window-system (eq window-system 'ns))
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))
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))
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)))))
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))
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)))
663 (fset 'ediff-get-face (symbol-function 'internal-get-face))))
666 ;; not a window system
667 (if (not window-system)
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)))))
674 (if (not window-system)
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))
683 '(ediff-current-diff-face-A
684 ediff-current-diff-face-B
685 ediff-current-diff-face-C))
686 (copy-face 'highlight face))
688 '(ediff-fine-diff-face-A
689 ediff-fine-diff-face-B
690 ediff-fine-diff-face-C
691 ;; ediff-combined-diff-face
693 (copy-face 'secondary-selection face)
694 (set-face-underline-p face t))
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)))))
701 (defvar ediff-current-diff-face-A
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)
707 'foreground 'ediff-current-diff-face-A "firebrick")
709 'background 'ediff-current-diff-face-A "pale green"))
712 (copy-face 'modeline 'ediff-current-diff-face-A)
713 (copy-face 'highlight 'ediff-current-diff-face-A))
715 'ediff-current-diff-face-A)
716 "Face for highlighting the selected difference in buffer A.")
718 (defvar ediff-current-diff-face-B
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)
724 'foreground 'ediff-current-diff-face-B "DarkOrchid")
726 'background 'ediff-current-diff-face-B "Yellow"))
729 (copy-face 'modeline 'ediff-current-diff-face-B)
730 (copy-face 'highlight 'ediff-current-diff-face-B))
732 'ediff-current-diff-face-B)
733 "Face for highlighting the selected difference in buffer B.")
736 (defvar ediff-current-diff-face-C
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)
742 'foreground 'ediff-current-diff-face-C "Navy")
744 'background 'ediff-current-diff-face-C "Pink"))
747 (copy-face 'modeline 'ediff-current-diff-face-C)
748 (copy-face 'highlight 'ediff-current-diff-face-C))
750 'ediff-current-diff-face-C)
751 "Face for highlighting the selected difference in buffer C.")
753 (defvar ediff-fine-diff-face-A
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
760 (ediff-set-face 'background 'ediff-fine-diff-face-A
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.")
766 (defvar ediff-fine-diff-face-B
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.")
777 (defvar ediff-fine-diff-face-C
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")
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.")
789 ;; (defvar ediff-combined-diff-face
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")
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.")
801 (defvar ediff-even-diff-face-A
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)
807 'foreground 'ediff-even-diff-face-A "black")
809 'background 'ediff-even-diff-face-A "light grey"))
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.")
815 (defvar ediff-even-diff-face-B
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)
821 'foreground 'ediff-even-diff-face-B "White")
823 'background 'ediff-even-diff-face-B "Gray"))
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.")
829 (defvar ediff-even-diff-face-C
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.")
836 (defvar ediff-odd-diff-face-A
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)
842 'foreground 'ediff-odd-diff-face-A "White")
844 'background 'ediff-odd-diff-face-A "Gray"))
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.")
850 (defvar ediff-odd-diff-face-B
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)
856 'foreground 'ediff-odd-diff-face-B "Black")
858 'background 'ediff-odd-diff-face-B "light grey"))
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.")
864 (defvar ediff-odd-diff-face-C
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.")
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)
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)
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.")
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))
923 (intern (format "ediff-current-diff-face-%S" type))))))
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)
930 ;; Compute priority of ediff overlay.
931 (defun ediff-highest-priority (start end buffer)
932 (let ((pos (max 1 (1- start)))
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)))
944 (or (ediff-overlay-get ovr 'priority) 0)
950 ) ; end of window-system-only code.
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'.")
959 (ediff-defvar-local ediff-file-checked-out-flag nil
960 "If t, indicates that buffer has been already checked out.")
966 ;; when emacs will have before/after-string in overlays, this variable will
968 (defconst ediff-saved-variables
970 buffer-auto-save-file-name)
971 "Buffer-local variables saved and restored during an Ediff session.")
973 ;; to be deleted in due time
974 (defconst ediff-working-values '(nil)
975 "Values to be assigned to `ediff-saved-variables' during diff.")
977 ;; if nil, this silences some messages
978 (defconst ediff-verbose-p t)
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.")
984 (defvar ediff-temp-file-prefix
985 (let ((env (or (getenv "TMPDIR")
989 (setq d (if (and env (> (length env) 0))
991 (if (memq system-type '(vax-vms axp-vms))
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)))
999 "*Prefix to put on Ediff temporary file names.
1000 Do not start with `~/' or `~user-name/'.")
1002 (defvar ediff-temp-file-mode 384 ; u=rw only
1003 "*Mode for Ediff temporary files.")
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.")
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.")
1019 ;;; In-line functions
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)))
1025 (defsubst ediff-frame-has-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))))
1034 (defsubst ediff-frame-unsplittable-p (frame)
1035 (cdr (assq 'unsplittable (ediff-frame-parameters frame))))
1037 (defsubst ediff-get-next-window (wind prev-wind)
1038 (or (window-live-p wind)
1039 (setq wind (if prev-wind
1041 (selected-window)))))
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)
1047 (ediff-set-diff-overlays-in-one-buffer 'C diff-list))
1048 (message "Processing difference regions ... done"))
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))))
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))
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))
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))
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)
1081 (mapcar 'ediff-delete-overlay
1082 (ediff-get-fine-diff-vector-from-diff-record diff-record))))
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))
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)
1092 (ediff-clear-fine-differences-in-one-buffer n 'C)))
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)
1099 (ediff-set-fine-overlays-in-one-buffer 'C diff-list region-num)
1102 (defsubst ediff-mouse-event-p (event)
1104 (button-event-p event)
1105 (string-match "mouse" (format "%S" (event-basic-type event)))
1108 (defsubst ediff-frame-iconified-p (frame)
1109 (if (and window-system (ediff-frame-live-p frame))
1111 (screen-iconified-p frame)
1112 (eq (frame-visible-p frame) 'icon))))
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)))))
1121 (defsubst ediff-frame-char-width (frame)
1123 (/ (screen-pixel-width frame) (screen-width frame))
1124 (frame-char-width frame)))
1126 (defsubst ediff-frame-char-height (frame)
1128 (/ (screen-pixel-height frame) (screen-height frame))
1129 (frame-char-height frame)))
1132 (defsubst ediff-empty-overlay-p (overl)
1133 (= (ediff-overlay-start overl) (ediff-overlay-end overl)))
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))))
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)
1155 (skip-chars-forward ediff-whitespace)
1156 (>= (point) end))))))
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)))
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))
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)))))
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))))
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)))
1182 (defsubst ediff-show-all-diffs (n)
1183 "Don't skip difference regions."
1186 (provide 'ediff-init)
1189 ;;; ediff-init.el ends here