diff options
| author | Michael Kifer | 1995-10-06 00:55:57 +0000 |
|---|---|---|
| committer | Michael Kifer | 1995-10-06 00:55:57 +0000 |
| commit | 8343426b70389bf284b13bc44a39bce1dd46b2e7 (patch) | |
| tree | c08ae1fe726373c3c7805256b9813545bf34d139 | |
| parent | 4ad42cb56dd46bf0a951550825057021e2c6af77 (diff) | |
| download | emacs-8343426b70389bf284b13bc44a39bce1dd46b2e7.tar.gz emacs-8343426b70389bf284b13bc44a39bce1dd46b2e7.zip | |
(ediff-abbreviate-file-name): function modified.
(ediff-truncate-string-left): new function.
(ediff-strip-last-dir,ediff-key-press-event-p,ediff-event-point,
ediff-event-buffer): new functions.
(ediff-frame-has-menubar,ediff-protect-meta-chars): functions deleted.
| -rw-r--r-- | lisp/ediff-init.el | 914 |
1 files changed, 601 insertions, 313 deletions
diff --git a/lisp/ediff-init.el b/lisp/ediff-init.el index 855227abc9b..2e2079c5003 100644 --- a/lisp/ediff-init.el +++ b/lisp/ediff-init.el | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | ;;; ediff-init.el --- Macros, variables and defsubsts used by Ediff | 1 | ;;; ediff-init.el --- Macros, variables, and defsubsts used by Ediff |
| 2 | ;;; Copyright (C) 1994, 1995 Free Software Foundation, Inc. | 2 | ;;; Copyright (C) 1994, 1995 Free Software Foundation, Inc. |
| 3 | 3 | ||
| 4 | ;; Author: Michael Kifer <kifer@cs.sunysb.edu> | 4 | ;; Author: Michael Kifer <kifer@cs.sunysb.edu> |
| @@ -21,7 +21,7 @@ | |||
| 21 | 21 | ||
| 22 | 22 | ||
| 23 | ;; Is it XEmacs? | 23 | ;; Is it XEmacs? |
| 24 | (defconst ediff-xemacs-p (string-match "\\(Lucid\\|Xemacs\\)" emacs-version)) | 24 | (defconst ediff-xemacs-p (string-match "XEmacs" emacs-version)) |
| 25 | ;; Is it Emacs? | 25 | ;; Is it Emacs? |
| 26 | (defconst ediff-emacs-p (not ediff-xemacs-p)) | 26 | (defconst ediff-emacs-p (not ediff-xemacs-p)) |
| 27 | ;; Are we running as a window application or on a TTY? | 27 | ;; Are we running as a window application or on a TTY? |
| @@ -44,6 +44,7 @@ | |||
| 44 | (` (cond ((eq (, arg) 'A) ediff-buffer-A) | 44 | (` (cond ((eq (, arg) 'A) ediff-buffer-A) |
| 45 | ((eq (, arg) 'B) ediff-buffer-B) | 45 | ((eq (, arg) 'B) ediff-buffer-B) |
| 46 | ((eq (, arg) 'C) ediff-buffer-C) | 46 | ((eq (, arg) 'C) ediff-buffer-C) |
| 47 | ((eq (, arg) 'Ancestor) ediff-ancestor-buffer) | ||
| 47 | ) | 48 | ) |
| 48 | )) | 49 | )) |
| 49 | 50 | ||
| @@ -96,10 +97,14 @@ | |||
| 96 | (defmacro ediff-set-state-of-diff (n buf-type val) | 97 | (defmacro ediff-set-state-of-diff (n buf-type val) |
| 97 | (` (aset (ediff-get-difference (, n) (, buf-type)) 3 (, val)))) | 98 | (` (aset (ediff-get-difference (, n) (, buf-type)) 3 (, val)))) |
| 98 | (defmacro ediff-get-state-of-merge (n) | 99 | (defmacro ediff-get-state-of-merge (n) |
| 99 | (` (if (ediff-buffer-live-p ediff-buffer-C) | 100 | (` (if ediff-state-of-merge |
| 100 | (aref (ediff-get-difference (, n) 'C) 4)))) | 101 | (aref (aref ediff-state-of-merge (, n)) 0)))) |
| 102 | (defmacro ediff-get-state-of-ancestor (n) | ||
| 103 | (` (if ediff-state-of-merge | ||
| 104 | (aref (aref ediff-state-of-merge (, n)) 1)))) | ||
| 101 | (defmacro ediff-set-state-of-merge (n val) | 105 | (defmacro ediff-set-state-of-merge (n val) |
| 102 | (` (aset (ediff-get-difference (, n) 'C) 4 (, val)))) | 106 | (` (if ediff-state-of-merge |
| 107 | (aset (aref ediff-state-of-merge (, n)) 0 (, val))))) | ||
| 103 | 108 | ||
| 104 | ;; if flag is t, puts a mark on diff region saying that | 109 | ;; if flag is t, puts a mark on diff region saying that |
| 105 | ;; the differences are in white space only. If flag is nil, | 110 | ;; the differences are in white space only. If flag is nil, |
| @@ -143,8 +148,8 @@ | |||
| 143 | )))) | 148 | )))) |
| 144 | 149 | ||
| 145 | 150 | ||
| 146 | (defmacro ediff-multiframe-setup-p () | 151 | (defsubst ediff-multiframe-setup-p () |
| 147 | (` (and (ediff-window-display-p) ediff-multiframe))) | 152 | (and (ediff-window-display-p) ediff-multiframe)) |
| 148 | 153 | ||
| 149 | (defmacro ediff-narrow-control-frame-p () | 154 | (defmacro ediff-narrow-control-frame-p () |
| 150 | (` (and (ediff-multiframe-setup-p) | 155 | (` (and (ediff-multiframe-setup-p) |
| @@ -201,49 +206,87 @@ | |||
| 201 | ediff-regions-linewise)))) | 206 | ediff-regions-linewise)))) |
| 202 | (ediff-defvar-local ediff-narrow-job nil "") | 207 | (ediff-defvar-local ediff-narrow-job nil "") |
| 203 | 208 | ||
| 209 | ;; Note: ediff-merge-directory-revisions-with-ancestor is not treated as an | ||
| 210 | ;; ancestor metajob, since it behaves differently. | ||
| 211 | (defsubst ediff-ancestor-metajob (&optional metajob) | ||
| 212 | (memq (or metajob ediff-metajob-name) | ||
| 213 | '(ediff-merge-directories-with-ancestor | ||
| 214 | ediff-merge-filegroups-with-ancestor))) | ||
| 215 | (defsubst ediff-revision-metajob (&optional metajob) | ||
| 216 | (memq (or metajob ediff-metajob-name) | ||
| 217 | '(ediff-directory-revisions | ||
| 218 | ediff-merge-directory-revisions | ||
| 219 | ediff-merge-directory-revisions-with-ancestor))) | ||
| 220 | ;; metajob involving only one directory | ||
| 221 | (defsubst ediff-dir1-metajob (&optional metajob) | ||
| 222 | (or (ediff-revision-metajob metajob) | ||
| 223 | ;; add more here | ||
| 224 | )) | ||
| 225 | (defsubst ediff-collect-diffs-metajob (&optional metajob) | ||
| 226 | (or (ediff-revision-metajob metajob) | ||
| 227 | (memq ediff-metajob-name | ||
| 228 | '(ediff-directories | ||
| 229 | ;; add more here | ||
| 230 | ediff-directory-revisions)))) | ||
| 231 | (defsubst ediff-metajob3 (&optional metajob) | ||
| 232 | (memq (or metajob ediff-metajob-name) | ||
| 233 | '(ediff-merge-directories-with-ancestor | ||
| 234 | ediff-merge-filegroups-with-ancestor | ||
| 235 | ediff-directories3 | ||
| 236 | ediff-filegroups3))) | ||
| 237 | (defsubst ediff-comparison-metajob3 (&optional metajob) | ||
| 238 | (memq (or metajob ediff-metajob-name) | ||
| 239 | '(ediff-directories3 ediff-filegroups3))) | ||
| 240 | |||
| 241 | (defsubst ediff-barf-if-not-control-buffer (&optional meta-buf) | ||
| 242 | (or (eq (if meta-buf ediff-meta-buffer ediff-control-buffer) | ||
| 243 | (current-buffer)) | ||
| 244 | (error "%S: This command runs in Ediff Control Buffer only!" | ||
| 245 | this-command))) | ||
| 246 | |||
| 204 | 247 | ||
| 205 | ;; Hook variables | 248 | ;; Hook variables |
| 206 | 249 | ||
| 207 | (defvar ediff-before-setup-windows-hooks nil | 250 | (defvar ediff-before-setup-windows-hook nil |
| 208 | "*Hooks to run before Ediff sets its own window config. | 251 | "*Hooks to run before Ediff sets its window configuration. |
| 209 | This can be used to save the previous window config, which can be restored | 252 | This can be used to save the previous window config, which can be restored |
| 210 | on ediff-quit or ediff-suspend.") | 253 | on ediff-quit or ediff-suspend.") |
| 211 | (defvar ediff-after-setup-windows-hooks nil | 254 | (defvar ediff-after-setup-windows-hook nil |
| 212 | "*Hooks to run after Ediff sets its own window config. | 255 | "*Hooks to run after Ediff sets its window configuration. |
| 213 | This can be used to set up control window or icon in a desired place.") | 256 | This can be used to set up control window or icon in a desired place.") |
| 214 | (defvar ediff-before-setup-control-frame-hooks nil | 257 | (defvar ediff-before-setup-control-frame-hook nil |
| 215 | "*Hooks run before setting up the frame to display Ediff Control Panel. | 258 | "*Hooks run before setting up the frame to display Ediff Control Panel. |
| 216 | Can be used to change control frame parameters to position it where it | 259 | Can be used to change control frame parameters to position it where it |
| 217 | is desirable.") | 260 | is desirable.") |
| 218 | (defvar ediff-after-setup-control-frame-hooks nil | 261 | (defvar ediff-after-setup-control-frame-hook nil |
| 219 | "*Hooks run after setting up the frame to display Ediff Control Panel. | 262 | "*Hooks run after setting up the frame to display Ediff Control Panel. |
| 220 | Can be used to move the frame where it is desired.") | 263 | Can be used to move the frame where it is desired.") |
| 221 | (defvar ediff-startup-hooks nil | 264 | (defvar ediff-startup-hook nil |
| 222 | "*Hooks to run in the control buffer after Ediff has been set up.") | 265 | "*Hooks to run in the control buffer after Ediff has been set up.") |
| 223 | (defvar ediff-select-hooks nil | 266 | (defvar ediff-select-hook nil |
| 224 | "*Hooks to run after a difference has been selected.") | 267 | "*Hooks to run after a difference has been selected.") |
| 225 | (defvar ediff-unselect-hooks nil | 268 | (defvar ediff-unselect-hook nil |
| 226 | "*Hooks to run after a difference has been unselected.") | 269 | "*Hooks to run after a difference has been unselected.") |
| 227 | (defvar ediff-prepare-buffer-hooks nil | 270 | (defvar ediff-prepare-buffer-hook nil |
| 228 | "*Hooks called after buffers A, B, and C are set up.") | 271 | "*Hooks called after buffers A, B, and C are set up.") |
| 229 | (defvar ediff-load-hooks nil | 272 | (defvar ediff-load-hook nil |
| 230 | "*Hook run after Ediff is loaded. Can be used to change defaults.") | 273 | "*Hook run after Ediff is loaded. Can be used to change defaults.") |
| 231 | 274 | ||
| 232 | (defvar ediff-mode-hooks nil | 275 | (defvar ediff-mode-hook nil |
| 233 | "*Hook run just after ediff-mode is set up in the control buffer. | 276 | "*Hook run just after ediff-mode is set up in the control buffer. |
| 234 | This is done before any windows or frames are created. One can use it to | 277 | This is done before any windows or frames are created. One can use it to |
| 235 | set local variables that determine how the display looks like.") | 278 | set local variables that determine how the display looks like.") |
| 236 | (defvar ediff-keymap-setup-hooks nil | 279 | (defvar ediff-keymap-setup-hook nil |
| 237 | "*Hook run just after the default bindings in Ediff keymap are set up.") | 280 | "*Hook run just after the default bindings in Ediff keymap are set up.") |
| 238 | 281 | ||
| 239 | (defvar ediff-display-help-hooks nil | 282 | (defvar ediff-display-help-hook nil |
| 240 | "*Hooks run after preparing the help message.") | 283 | "*Hooks run after preparing the help message.") |
| 241 | 284 | ||
| 242 | (defvar ediff-suspend-hooks (list 'ediff-default-suspend-hook) | 285 | (defvar ediff-suspend-hook (list 'ediff-default-suspend-function) |
| 243 | "*Hooks to run in the Ediff control buffer when Ediff is suspended.") | 286 | "*Hooks to run in the Ediff control buffer when Ediff is suspended.") |
| 244 | (defvar ediff-quit-hooks (list 'ediff-cleanup-mess) | 287 | (defvar ediff-quit-hook (list 'ediff-cleanup-mess) |
| 245 | "*Hooks to run in the Ediff control buffer after finishing Ediff.") | 288 | "*Hooks to run in the Ediff control buffer after finishing Ediff.") |
| 246 | (defvar ediff-cleanup-hooks nil | 289 | (defvar ediff-cleanup-hook nil |
| 247 | "*Hooks to run on exiting Ediff but before killing the control buffer. | 290 | "*Hooks to run on exiting Ediff but before killing the control buffer. |
| 248 | This is a place to do various cleanups, such as deleting the variant buffers. | 291 | This is a place to do various cleanups, such as deleting the variant buffers. |
| 249 | Ediff provides a function, `ediff-janitor', as one such possible hook.") | 292 | Ediff provides a function, `ediff-janitor', as one such possible hook.") |
| @@ -257,8 +300,9 @@ Ediff provides a function, `ediff-janitor', as one such possible hook.") | |||
| 257 | "The head of the full help message.") | 300 | "The head of the full help message.") |
| 258 | (defconst ediff-long-help-message-tail | 301 | (defconst ediff-long-help-message-tail |
| 259 | "=====================|===========================|============================= | 302 | "=====================|===========================|============================= |
| 260 | | D -on-line manual | | 303 | R -show registry | | M -show session group |
| 261 | i -status info | ? -help off | G -send bug report | 304 | D -diff output | E -browse Ediff manual| G -send bug report |
| 305 | i -status info | ? -help off | z/q -suspend/quit | ||
| 262 | ------------------------------------------------------------------------------- | 306 | ------------------------------------------------------------------------------- |
| 263 | X,Y (x,y) on the left are meta-symbols for the keys A,B,C (a,b,c). | 307 | X,Y (x,y) on the left are meta-symbols for the keys A,B,C (a,b,c). |
| 264 | X,Y on the right are meta-symbols for buffers A,B,C. | 308 | X,Y on the right are meta-symbols for buffers A,B,C. |
| @@ -274,7 +318,7 @@ n,SPC -next diff | h -hiliting | rx -restore buf X's old diff | |||
| 274 | C-l -recenter | ## -ignore whitespace | | 318 | C-l -recenter | ## -ignore whitespace | |
| 275 | v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X | 319 | v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X |
| 276 | </> -scroll lt/rt | X -read-only in buf X | wd -save diff output | 320 | </> -scroll lt/rt | X -read-only in buf X | wd -save diff output |
| 277 | z/q -suspend/quit | m -wide display | ~ -rotate buffers | 321 | | m -wide display | ~ -rotate buffers |
| 278 | " | 322 | " |
| 279 | "Help message usually used for 3-way comparison. | 323 | "Help message usually used for 3-way comparison. |
| 280 | Normally, not a user option. See `ediff-help-message' for details.") | 324 | Normally, not a user option. See `ediff-help-message' for details.") |
| @@ -288,7 +332,7 @@ n,SPC -next diff | h -hiliting | rx -restore buf X's old diff | |||
| 288 | C-l -recenter | ## -ignore whitespace | | 332 | C-l -recenter | ## -ignore whitespace | |
| 289 | v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X | 333 | v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X |
| 290 | </> -scroll lt/rt | X -read-only in buf X | wd -save diff output | 334 | </> -scroll lt/rt | X -read-only in buf X | wd -save diff output |
| 291 | z/q -suspend/quit | m -wide display | ~ -swap buffers | 335 | | m -wide display | ~ -swap buffers |
| 292 | " | 336 | " |
| 293 | "Help message usually used for 2-way comparison. | 337 | "Help message usually used for 2-way comparison. |
| 294 | Normally, not a user option. See `ediff-help-message' for details.") | 338 | Normally, not a user option. See `ediff-help-message' for details.") |
| @@ -302,7 +346,7 @@ n,SPC -next diff | h -hiliting | rx -restore buf X's old diff | |||
| 302 | C-l -recenter | ## -ignore whitespace | | 346 | C-l -recenter | ## -ignore whitespace | |
| 303 | v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X | 347 | v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X |
| 304 | </> -scroll lt/rt | X -read-only in buf X | wd -save diff output | 348 | </> -scroll lt/rt | X -read-only in buf X | wd -save diff output |
| 305 | z/q -suspend/quit | m -wide display | ~ -swap buffers | 349 | | m -wide display | ~ -swap buffers |
| 306 | " | 350 | " |
| 307 | "Help message when comparing windows or regions line-by-line. | 351 | "Help message when comparing windows or regions line-by-line. |
| 308 | Normally, not a user option. See `ediff-help-message' for details.") | 352 | Normally, not a user option. See `ediff-help-message' for details.") |
| @@ -316,7 +360,7 @@ n,SPC -next diff | h -hiliting | rx -restore buf X's old diff | |||
| 316 | C-l -recenter | | | 360 | C-l -recenter | | |
| 317 | v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X | 361 | v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X |
| 318 | </> -scroll lt/rt | X -read-only in buf X | wd -save diff output | 362 | </> -scroll lt/rt | X -read-only in buf X | wd -save diff output |
| 319 | z/q -suspend/quit | m -wide display | ~ -swap buffers | 363 | | m -wide display | ~ -swap buffers |
| 320 | " | 364 | " |
| 321 | "Help message when comparing windows or regions word-by-word. | 365 | "Help message when comparing windows or regions word-by-word. |
| 322 | Normally, not a user option. See `ediff-help-message' for details.") | 366 | Normally, not a user option. See `ediff-help-message' for details.") |
| @@ -330,7 +374,7 @@ n,SPC -next diff | h -hiliting | r -restore buf C's old diff | |||
| 330 | C-l -recenter | #f/#h -focus/hide regions | + -combine diff regions | 374 | C-l -recenter | #f/#h -focus/hide regions | + -combine diff regions |
| 331 | v/V -scroll up/dn | X -read-only in buf X | wx -save buf X | 375 | v/V -scroll up/dn | X -read-only in buf X | wx -save buf X |
| 332 | </> -scroll lt/rt | m -wide display | wd -save diff output | 376 | </> -scroll lt/rt | m -wide display | wd -save diff output |
| 333 | z/q -suspend/quit | s -shrink window C | ~ -swap buffers | 377 | / -ancestor buff | s -shrink window C | ~ -swap buffers |
| 334 | | $ -show clashes only | & -merge w/new default | 378 | | $ -show clashes only | & -merge w/new default |
| 335 | " | 379 | " |
| 336 | "Help message during merging. | 380 | "Help message during merging. |
| @@ -347,13 +391,13 @@ Normally, not a user option. See `ediff-help-message' for details.") | |||
| 347 | (ediff-defvar-local ediff-brief-help-message "" | 391 | (ediff-defvar-local ediff-brief-help-message "" |
| 348 | "Normally, not a user option. See `ediff-help-message' for details.") | 392 | "Normally, not a user option. See `ediff-help-message' for details.") |
| 349 | 393 | ||
| 350 | (ediff-defvar-local ediff-brief-help-message-custom nil | 394 | (ediff-defvar-local ediff-brief-help-message-function nil |
| 351 | "The brief help message that the user can customize. | 395 | "The brief help message that the user can customize. |
| 352 | If the user sets this to a parameter-less function, Ediff will use it to | 396 | If the user sets this to a parameter-less function, Ediff will use it to |
| 353 | produce the brief help message. This function must return a string.") | 397 | produce the brief help message. This function must return a string.") |
| 354 | (ediff-defvar-local ediff-long-help-message-custom nil | 398 | (ediff-defvar-local ediff-long-help-message-function nil |
| 355 | "The long help message that the user can customize. | 399 | "The long help message that the user can customize. |
| 356 | See `ediff-brief-help-message-custom' for more.") | 400 | See `ediff-brief-help-message-function' for more.") |
| 357 | 401 | ||
| 358 | (defvar ediff-prefer-long-help-message nil | 402 | (defvar ediff-prefer-long-help-message nil |
| 359 | "*If t, Ediff starts with a long help message. Short help msg otherwise.") | 403 | "*If t, Ediff starts with a long help message. Short help msg otherwise.") |
| @@ -364,7 +408,7 @@ See `ediff-brief-help-message-custom' for more.") | |||
| 364 | Normally, the user shouldn't touch this. However, if you want Ediff to | 408 | Normally, the user shouldn't touch this. However, if you want Ediff to |
| 365 | start up with different help messages for different jobs, you can change | 409 | start up with different help messages for different jobs, you can change |
| 366 | the value of this variable and the variables `ediff-help-message-*' in | 410 | the value of this variable and the variables `ediff-help-message-*' in |
| 367 | `ediff-startup-hooks'.") | 411 | `ediff-startup-hook'.") |
| 368 | 412 | ||
| 369 | ;; Selective browsing | 413 | ;; Selective browsing |
| 370 | 414 | ||
| @@ -375,6 +419,15 @@ This function gets a region number as an argument. The region number | |||
| 375 | is the one used internally by Ediff. It is 1 less than the number seen | 419 | is the one used internally by Ediff. It is 1 less than the number seen |
| 376 | by the user.") | 420 | by the user.") |
| 377 | 421 | ||
| 422 | (ediff-defvar-local ediff-hide-regexp-matches-function | ||
| 423 | 'ediff-hide-regexp-matches | ||
| 424 | "Function to use in determining which regions to hide. | ||
| 425 | See the documentation string of `ediff-hide-regexp-matches' for details.") | ||
| 426 | (ediff-defvar-local ediff-focus-on-regexp-matches-function | ||
| 427 | 'ediff-focus-on-regexp-matches | ||
| 428 | "Function to use in determining which regions to focus on. | ||
| 429 | See the documentation string of `ediff-focus-on-regexp-matches' for details.") | ||
| 430 | |||
| 378 | ;; Regexp that determines buf A regions to focus on when skipping to diff | 431 | ;; Regexp that determines buf A regions to focus on when skipping to diff |
| 379 | (ediff-defvar-local ediff-regexp-focus-A "" "") | 432 | (ediff-defvar-local ediff-regexp-focus-A "" "") |
| 380 | ;; Regexp that determines buf B regions to focus on when skipping to diff | 433 | ;; Regexp that determines buf B regions to focus on when skipping to diff |
| @@ -439,7 +492,7 @@ Use `setq-default' if setting it in .emacs") | |||
| 439 | ;; this indicates that diff regions are word-size, so fine diffs are | 492 | ;; this indicates that diff regions are word-size, so fine diffs are |
| 440 | ;; permanently nixed; used in ediff-windows-wordwise and ediff-regions-wordwise | 493 | ;; permanently nixed; used in ediff-windows-wordwise and ediff-regions-wordwise |
| 441 | (ediff-defvar-local ediff-word-mode nil "") | 494 | (ediff-defvar-local ediff-word-mode nil "") |
| 442 | ;; Name of the job (ediff-files, ediff-windows, etc. | 495 | ;; Name of the job (ediff-files, ediff-windows, etc.) |
| 443 | (ediff-defvar-local ediff-job-name nil "") | 496 | (ediff-defvar-local ediff-job-name nil "") |
| 444 | 497 | ||
| 445 | ;; Narrowing and ediff-region/windows support | 498 | ;; Narrowing and ediff-region/windows support |
| @@ -463,6 +516,11 @@ Use `setq-default' if setting it in .emacs") | |||
| 463 | (ediff-defvar-local ediff-quit-widened t | 516 | (ediff-defvar-local ediff-quit-widened t |
| 464 | "*Non-nil means: when finished, Ediff widens buffers A/B. | 517 | "*Non-nil means: when finished, Ediff widens buffers A/B. |
| 465 | Actually, Ediff restores the scope of visibility that existed at startup.") | 518 | Actually, Ediff restores the scope of visibility that existed at startup.") |
| 519 | (defvar ediff-keep-variants t | ||
| 520 | "*Nil means that non-modified variant buffers should be removed after some | ||
| 521 | interrogation. | ||
| 522 | Supplying a prefix agument to the quit command `q' temporarily reverses the | ||
| 523 | meaning of this variable.") | ||
| 466 | 524 | ||
| 467 | (ediff-defvar-local ediff-highlight-all-diffs t | 525 | (ediff-defvar-local ediff-highlight-all-diffs t |
| 468 | "If nil, only the selected differences are highlighted. | 526 | "If nil, only the selected differences are highlighted. |
| @@ -504,8 +562,12 @@ ediff-toggle-hilit. Use `setq-default' to set it.") | |||
| 504 | (ediff-defvar-local ediff-buffer-values-orig-B nil "") | 562 | (ediff-defvar-local ediff-buffer-values-orig-B nil "") |
| 505 | ;; The original values of ediff-protected-variables for buffer C | 563 | ;; The original values of ediff-protected-variables for buffer C |
| 506 | (ediff-defvar-local ediff-buffer-values-orig-C nil "") | 564 | (ediff-defvar-local ediff-buffer-values-orig-C nil "") |
| 565 | ;; The original values of ediff-protected-variables for buffer Ancestor | ||
| 566 | (ediff-defvar-local ediff-buffer-values-orig-Ancestor nil "") | ||
| 567 | ;; Buffer-local variables to be saved then restored during Ediff sessions | ||
| 507 | ;; Buffer-local variables to be saved then restored during Ediff sessions | 568 | ;; Buffer-local variables to be saved then restored during Ediff sessions |
| 508 | (defconst ediff-protected-variables '(buffer-read-only | 569 | (defconst ediff-protected-variables '(buffer-read-only |
| 570 | synchronize-minibuffers | ||
| 509 | mode-line-format)) | 571 | mode-line-format)) |
| 510 | 572 | ||
| 511 | ;; Vector of differences between the variants. Each difference is | 573 | ;; Vector of differences between the variants. Each difference is |
| @@ -518,17 +580,23 @@ ediff-toggle-hilit. Use `setq-default' to set it.") | |||
| 518 | ;; The precise form of a difference vector for one buffer is: | 580 | ;; The precise form of a difference vector for one buffer is: |
| 519 | ;; [diff diff diff ...] | 581 | ;; [diff diff diff ...] |
| 520 | ;; where each diff has the form: | 582 | ;; where each diff has the form: |
| 521 | ;; [diff-overlay fine-diff-vector no-fine-diffs-flag state-of-difference | 583 | ;; [diff-overlay fine-diff-vector no-fine-diffs-flag state-of-difference] |
| 522 | ;; state-of-merge] | ||
| 523 | ;; fine-diff-vector is a vector [fine-diff-overlay fine-diff-overlay ...] | 584 | ;; fine-diff-vector is a vector [fine-diff-overlay fine-diff-overlay ...] |
| 524 | ;; no-fine-diffs-flag says if there are fine differences. | 585 | ;; no-fine-diffs-flag says if there are fine differences. |
| 525 | ;; state-of-difference is A, B, C, or nil, indicating which buffer is | 586 | ;; state-of-difference is A, B, C, or nil, indicating which buffer is |
| 526 | ;; different from the other two (used only in 3-way jobs. | 587 | ;; different from the other two (used only in 3-way jobs. |
| 527 | ;; state-of-merge is default-A, default-B, prefer-A, or prefer-B. It | ||
| 528 | ;; indicates the way a diff region was created in buffer C. | ||
| 529 | (ediff-defvar-local ediff-difference-vector-A nil "") | 588 | (ediff-defvar-local ediff-difference-vector-A nil "") |
| 530 | (ediff-defvar-local ediff-difference-vector-B nil "") | 589 | (ediff-defvar-local ediff-difference-vector-B nil "") |
| 531 | (ediff-defvar-local ediff-difference-vector-C nil "") | 590 | (ediff-defvar-local ediff-difference-vector-C nil "") |
| 591 | (ediff-defvar-local ediff-difference-vector-Ancestor nil "") | ||
| 592 | |||
| 593 | ;; [ status status status ...] | ||
| 594 | ;; Each status: [state-of-merge state-of-ancestor] | ||
| 595 | ;; state-of-merge is default-A, default-B, prefer-A, or prefer-B. It | ||
| 596 | ;; indicates the way a diff region was created in buffer C. | ||
| 597 | ;; state-of-ancestor says if the corresponding region in ancestor buffer is | ||
| 598 | ;; empty. | ||
| 599 | (ediff-defvar-local ediff-state-of-merge nil "") | ||
| 532 | 600 | ||
| 533 | ;; The difference that is currently selected. | 601 | ;; The difference that is currently selected. |
| 534 | (ediff-defvar-local ediff-current-difference -1 "") | 602 | (ediff-defvar-local ediff-current-difference -1 "") |
| @@ -552,9 +620,9 @@ ediff-toggle-hilit. Use `setq-default' to set it.") | |||
| 552 | ;; Buffer to display debug info | 620 | ;; Buffer to display debug info |
| 553 | (ediff-defvar-local ediff-debug-buffer "*ediff-debug*" "") | 621 | (ediff-defvar-local ediff-debug-buffer "*ediff-debug*" "") |
| 554 | 622 | ||
| 555 | ;; List of ediff control panels associated with each buffer A/B. | 623 | ;; List of ediff control panels associated with each buffer A/B/C/Ancestor. |
| 556 | ;; Not used any more, but may be needed in the future | 624 | ;; Not used any more, but may be needed in the future. |
| 557 | (ediff-defvar-local ediff-this-buffer-control-sessions nil "") | 625 | (ediff-defvar-local ediff-this-buffer-ediff-sessions nil "") |
| 558 | 626 | ||
| 559 | ;; to be deleted in due time | 627 | ;; to be deleted in due time |
| 560 | ;; List of difference overlays disturbed by working with the current diff. | 628 | ;; List of difference overlays disturbed by working with the current diff. |
| @@ -563,6 +631,13 @@ ediff-toggle-hilit. Use `setq-default' to set it.") | |||
| 563 | ;; Priority of non-selected overlays. | 631 | ;; Priority of non-selected overlays. |
| 564 | (defvar ediff-shadow-overlay-priority 100 "") | 632 | (defvar ediff-shadow-overlay-priority 100 "") |
| 565 | 633 | ||
| 634 | (defvar ediff-version-control-package 'vc | ||
| 635 | "Version control package used. | ||
| 636 | Currently, Ediff supports vc.el, rcs.el, and generic-sc.el. The standard Emacs | ||
| 637 | interface to RCS, CVS, SCCS, etc., is vc.el. However, some people find the | ||
| 638 | other two packages more convenient. Set this variable `rcs' or `generic-sc' if | ||
| 639 | you are such a person.") | ||
| 640 | |||
| 566 | 641 | ||
| 567 | (if ediff-xemacs-p | 642 | (if ediff-xemacs-p |
| 568 | (progn | 643 | (progn |
| @@ -607,6 +682,32 @@ ediff-toggle-hilit. Use `setq-default' to set it.") | |||
| 607 | (cond ((memq op '(= > >=)) nil) | 682 | (cond ((memq op '(= > >=)) nil) |
| 608 | ((memq op '(< <=)) t)))) | 683 | ((memq op '(< <=)) t)))) |
| 609 | 684 | ||
| 685 | |||
| 686 | ;;;; warn if it is a wrong version of emacs | ||
| 687 | ;;(if (or (ediff-check-version '< 19 29 'emacs) | ||
| 688 | ;; (ediff-check-version '< 19 12 'xemacs)) | ||
| 689 | ;; (progn | ||
| 690 | ;; (with-output-to-temp-buffer ediff-msg-buffer | ||
| 691 | ;; (switch-to-buffer ediff-msg-buffer) | ||
| 692 | ;; (insert | ||
| 693 | ;; (format " | ||
| 694 | ;; | ||
| 695 | ;;This version of Ediff requires | ||
| 696 | ;; | ||
| 697 | ;;\t Emacs 19.29 and higher | ||
| 698 | ;;\t OR | ||
| 699 | ;;\t XEmacs 19.12 and higher | ||
| 700 | ;; | ||
| 701 | ;;It is unlikely to work under Emacs version %s | ||
| 702 | ;;that you are using... " emacs-version)) | ||
| 703 | ;; (if noninteractive | ||
| 704 | ;; () | ||
| 705 | ;; (beep 1) | ||
| 706 | ;; (beep 1) | ||
| 707 | ;; (insert "\n\nType any key to continue...") | ||
| 708 | ;; (ediff-read-event))) | ||
| 709 | ;; (kill-buffer ediff-msg-buffer))) | ||
| 710 | |||
| 610 | ;; A fix for NeXT Step | 711 | ;; A fix for NeXT Step |
| 611 | ;; Should probably be eliminated in later versions. | 712 | ;; Should probably be eliminated in later versions. |
| 612 | (if (and (ediff-window-display-p) (eq (ediff-device-type) 'ns)) | 713 | (if (and (ediff-window-display-p) (eq (ediff-device-type) 'ns)) |
| @@ -617,10 +718,12 @@ ediff-toggle-hilit. Use `setq-default' to set it.") | |||
| 617 | (fset 'x-display-pixel-width (symbol-function 'ns-display-pixel-width)) | 718 | (fset 'x-display-pixel-width (symbol-function 'ns-display-pixel-width)) |
| 618 | )) | 719 | )) |
| 619 | 720 | ||
| 721 | |||
| 620 | (defsubst ediff-color-display-p () | 722 | (defsubst ediff-color-display-p () |
| 621 | (if ediff-emacs-p | 723 | (if ediff-emacs-p |
| 622 | (x-display-color-p) | 724 | (x-display-color-p) |
| 623 | (eq (device-class (selected-device)) 'color))) | 725 | (eq (device-class (selected-device)) 'color))) |
| 726 | |||
| 624 | 727 | ||
| 625 | (if (ediff-window-display-p) | 728 | (if (ediff-window-display-p) |
| 626 | (if ediff-xemacs-p | 729 | (if ediff-xemacs-p |
| @@ -644,269 +747,322 @@ ediff-toggle-hilit. Use `setq-default' to set it.") | |||
| 644 | (fset 'ediff-get-face (symbol-function 'internal-get-face)))) | 747 | (fset 'ediff-get-face (symbol-function 'internal-get-face)))) |
| 645 | 748 | ||
| 646 | 749 | ||
| 647 | (if (not (ediff-window-display-p)) | 750 | (defun ediff-make-current-diff-overlay (type) |
| 648 | (fset 'ediff-make-current-diff-overlay (function (lambda (type) nil))) | 751 | (if (ediff-window-display-p) |
| 649 | ;; window system | 752 | (let ((overlay (intern (format "ediff-current-diff-overlay-%S" type))) |
| 650 | (defun ediff-set-face (ground face color) | 753 | (buffer (ediff-get-buffer type)) |
| 651 | "Sets face foreground/background." | 754 | (face (face-name |
| 652 | (if (ediff-valid-color-p color) | 755 | (symbol-value |
| 653 | (if (eq ground 'foreground) | 756 | (intern (format "ediff-current-diff-face-%S" type)))))) |
| 654 | (set-face-foreground face color) | 757 | (set overlay |
| 655 | (set-face-background face color)) | 758 | (ediff-make-bullet-proof-overlay (point-max) (point-max) buffer)) |
| 656 | (cond ((memq face | 759 | (ediff-set-overlay-face (symbol-value overlay) face) |
| 657 | '(ediff-current-diff-face-A | 760 | (ediff-overlay-put (symbol-value overlay) 'ediff ediff-control-buffer)) |
| 658 | ediff-current-diff-face-B | 761 | )) |
| 659 | ediff-current-diff-face-C)) | 762 | |
| 660 | (copy-face 'highlight face)) | 763 | (defun ediff-set-overlay-face (extent face) |
| 661 | ((memq face | 764 | (ediff-overlay-put extent 'face face) |
| 662 | '(ediff-fine-diff-face-A | 765 | (ediff-overlay-put extent 'help-echo 'ediff-region-help-echo)) |
| 663 | ediff-fine-diff-face-B | 766 | |
| 664 | ediff-fine-diff-face-C)) | 767 | ;; This does nothing in Emacs, since overlays there have no help-echo property |
| 665 | (copy-face 'secondary-selection face) | 768 | (defun ediff-region-help-echo (extent) |
| 666 | (set-face-underline-p face t)) | 769 | (let ((is-current (ediff-overlay-get extent 'ediff)) |
| 667 | ((memq face | 770 | (face (ediff-overlay-get extent 'face)) |
| 668 | '(ediff-even-diff-face-A ediff-odd-diff-face-A | 771 | (diff-num (ediff-overlay-get extent 'ediff-diff-num)) |
| 669 | ediff-even-diff-face-B ediff-odd-diff-face-B | 772 | face-help help-msg) |
| 670 | ediff-even-diff-face-C ediff-odd-diff-face-C)) | 773 | |
| 671 | (copy-face 'secondary-selection face))))) | 774 | ;; This happens only for refinement overlays |
| 775 | (setq face-help (and face (get face 'ediff-help-echo))) | ||
| 776 | |||
| 777 | (setq help-msg | ||
| 778 | (cond ((and is-current diff-num) ; current diff region | ||
| 779 | (format "Difference region %S -- current" (1+ diff-num))) | ||
| 780 | (face-help) ; refinement of current diff region | ||
| 781 | (diff-num ; non-current | ||
| 782 | (format "Difference region %S -- non-current" (1+ diff-num))) | ||
| 783 | (t ""))))) ; none | ||
| 784 | |||
| 785 | (defun ediff-set-face (ground face color) | ||
| 786 | "Set face foreground/background." | ||
| 787 | (if (ediff-window-display-p) | ||
| 788 | (if (ediff-valid-color-p color) | ||
| 789 | (if (eq ground 'foreground) | ||
| 790 | (set-face-foreground face color) | ||
| 791 | (set-face-background face color)) | ||
| 792 | (cond ((memq face | ||
| 793 | '(ediff-current-diff-face-A | ||
| 794 | ediff-current-diff-face-B | ||
| 795 | ediff-current-diff-face-C | ||
| 796 | ediff-current-diff-face-Ancestor)) | ||
| 797 | (copy-face 'highlight face)) | ||
| 798 | ((memq face | ||
| 799 | '(ediff-fine-diff-face-A | ||
| 800 | ediff-fine-diff-face-B | ||
| 801 | ediff-fine-diff-face-C | ||
| 802 | ediff-fine-diff-face-Ancestor)) | ||
| 803 | (copy-face 'secondary-selection face) | ||
| 804 | (set-face-underline-p face t)) | ||
| 805 | ((memq face | ||
| 806 | '(ediff-even-diff-face-A | ||
| 807 | ediff-odd-diff-face-A | ||
| 808 | ediff-even-diff-face-B ediff-odd-diff-face-B | ||
| 809 | ediff-even-diff-face-C ediff-odd-diff-face-C | ||
| 810 | ediff-even-diff-face-Ancestor | ||
| 811 | ediff-odd-diff-face-Ancestor)) | ||
| 812 | (copy-face 'secondary-selection face)))) | ||
| 813 | )) | ||
| 672 | 814 | ||
| 673 | (defvar ediff-current-diff-face-A | 815 | (defvar ediff-current-diff-face-A |
| 674 | (progn | 816 | (if (ediff-window-display-p) |
| 675 | (make-face 'ediff-current-diff-face-A) | 817 | (progn |
| 676 | (or (face-differs-from-default-p 'ediff-current-diff-face-A) | 818 | (make-face 'ediff-current-diff-face-A) |
| 677 | (cond ((ediff-color-display-p) | 819 | (or (face-differs-from-default-p 'ediff-current-diff-face-A) |
| 678 | (ediff-set-face | 820 | (cond ((ediff-color-display-p) |
| 679 | 'foreground 'ediff-current-diff-face-A "firebrick") | 821 | (ediff-set-face |
| 680 | (ediff-set-face | 822 | 'foreground 'ediff-current-diff-face-A "firebrick") |
| 681 | 'background 'ediff-current-diff-face-A "pale green")) | 823 | (ediff-set-face |
| 682 | (t | 824 | 'background 'ediff-current-diff-face-A "pale green")) |
| 683 | (if ediff-xemacs-p | 825 | (t |
| 684 | (copy-face 'modeline 'ediff-current-diff-face-A) | 826 | (if ediff-xemacs-p |
| 685 | (copy-face 'highlight 'ediff-current-diff-face-A)) | 827 | (copy-face 'modeline 'ediff-current-diff-face-A) |
| 686 | ))) | 828 | (copy-face 'highlight 'ediff-current-diff-face-A)) |
| 687 | 'ediff-current-diff-face-A) | 829 | ))) |
| 688 | "Face for highlighting the selected difference in buffer A.") | 830 | 'ediff-current-diff-face-A)) |
| 689 | 831 | "Face for highlighting the selected difference in buffer A.") | |
| 690 | (defvar ediff-current-diff-face-B | 832 | |
| 691 | (progn | 833 | (defvar ediff-current-diff-face-B |
| 692 | (make-face 'ediff-current-diff-face-B) | 834 | (if (ediff-window-display-p) |
| 693 | (or (face-differs-from-default-p 'ediff-current-diff-face-B) | 835 | (progn |
| 694 | (cond ((ediff-color-display-p) | 836 | (make-face 'ediff-current-diff-face-B) |
| 695 | (ediff-set-face | 837 | (or (face-differs-from-default-p 'ediff-current-diff-face-B) |
| 696 | 'foreground 'ediff-current-diff-face-B "DarkOrchid") | 838 | (cond ((ediff-color-display-p) |
| 697 | (ediff-set-face | 839 | (ediff-set-face |
| 698 | 'background 'ediff-current-diff-face-B "Yellow")) | 840 | 'foreground 'ediff-current-diff-face-B "DarkOrchid") |
| 699 | (t | 841 | (ediff-set-face |
| 700 | (if ediff-xemacs-p | 842 | 'background 'ediff-current-diff-face-B "Yellow")) |
| 701 | (copy-face 'modeline 'ediff-current-diff-face-B) | 843 | (t |
| 702 | (copy-face 'highlight 'ediff-current-diff-face-B)) | 844 | (if ediff-xemacs-p |
| 703 | ))) | 845 | (copy-face 'modeline 'ediff-current-diff-face-B) |
| 704 | 'ediff-current-diff-face-B) | 846 | (copy-face 'highlight 'ediff-current-diff-face-B)) |
| 705 | "Face for highlighting the selected difference in buffer B.") | 847 | ))) |
| 848 | 'ediff-current-diff-face-B)) | ||
| 849 | "Face for highlighting the selected difference in buffer B.") | ||
| 706 | 850 | ||
| 707 | 851 | ||
| 708 | (defvar ediff-current-diff-face-C | 852 | (defvar ediff-current-diff-face-C |
| 709 | (progn | 853 | (if (ediff-window-display-p) |
| 710 | (make-face 'ediff-current-diff-face-C) | 854 | (progn |
| 711 | (or (face-differs-from-default-p 'ediff-current-diff-face-C) | 855 | (make-face 'ediff-current-diff-face-C) |
| 712 | (cond ((ediff-color-display-p) | 856 | (or (face-differs-from-default-p 'ediff-current-diff-face-C) |
| 713 | (ediff-set-face | 857 | (cond ((ediff-color-display-p) |
| 714 | 'foreground 'ediff-current-diff-face-C "Navy") | 858 | (ediff-set-face |
| 715 | (ediff-set-face | 859 | 'foreground 'ediff-current-diff-face-C "Navy") |
| 716 | 'background 'ediff-current-diff-face-C "Pink")) | 860 | (ediff-set-face |
| 717 | (t | 861 | 'background 'ediff-current-diff-face-C "Pink")) |
| 718 | (if ediff-xemacs-p | 862 | (t |
| 719 | (copy-face 'modeline 'ediff-current-diff-face-C) | 863 | (if ediff-xemacs-p |
| 720 | (copy-face 'highlight 'ediff-current-diff-face-C)) | 864 | (copy-face 'modeline 'ediff-current-diff-face-C) |
| 721 | ))) | 865 | (copy-face 'highlight 'ediff-current-diff-face-C)) |
| 722 | 'ediff-current-diff-face-C) | 866 | ))) |
| 723 | "Face for highlighting the selected difference in buffer C.") | 867 | 'ediff-current-diff-face-C)) |
| 724 | 868 | "Face for highlighting the selected difference in buffer C.") | |
| 725 | (defvar ediff-fine-diff-face-A | 869 | |
| 726 | (progn | 870 | (defvar ediff-current-diff-face-Ancestor |
| 727 | (make-face 'ediff-fine-diff-face-A) | 871 | (if (ediff-window-display-p) |
| 728 | (or (face-differs-from-default-p 'ediff-fine-diff-face-A) | 872 | (progn |
| 729 | (cond ((ediff-color-display-p) | 873 | (make-face 'ediff-current-diff-face-Ancestor) |
| 730 | (ediff-set-face 'foreground 'ediff-fine-diff-face-A | 874 | (or (face-differs-from-default-p 'ediff-current-diff-face-Ancestor) |
| 731 | "Navy") | 875 | (copy-face |
| 732 | (ediff-set-face 'background 'ediff-fine-diff-face-A | 876 | 'ediff-current-diff-face-C 'ediff-current-diff-face-Ancestor)))) |
| 733 | "sky blue")) | 877 | "Face for highlighting the selected difference in the ancestor buffer.") |
| 734 | (t (set-face-underline-p 'ediff-fine-diff-face-A t)))) | 878 | |
| 735 | 'ediff-fine-diff-face-A) | 879 | (defvar ediff-fine-diff-face-A |
| 736 | "Face for highlighting the refinement of the selected diff in buffer A.") | 880 | (if (ediff-window-display-p) |
| 737 | 881 | (progn | |
| 738 | (defvar ediff-fine-diff-face-B | 882 | (make-face 'ediff-fine-diff-face-A) |
| 739 | (progn | 883 | (or (face-differs-from-default-p 'ediff-fine-diff-face-A) |
| 740 | (make-face 'ediff-fine-diff-face-B) | 884 | (cond ((ediff-color-display-p) |
| 741 | (or (face-differs-from-default-p 'ediff-fine-diff-face-B) | 885 | (ediff-set-face 'foreground 'ediff-fine-diff-face-A |
| 742 | (cond ((ediff-color-display-p) | 886 | "Navy") |
| 743 | (ediff-set-face 'foreground 'ediff-fine-diff-face-B "Black") | 887 | (ediff-set-face 'background 'ediff-fine-diff-face-A |
| 744 | (ediff-set-face 'background 'ediff-fine-diff-face-B "cyan")) | 888 | "sky blue")) |
| 745 | (t (set-face-underline-p 'ediff-fine-diff-face-B t)))) | 889 | (t (set-face-underline-p 'ediff-fine-diff-face-A t)))) |
| 746 | 'ediff-fine-diff-face-B) | 890 | 'ediff-fine-diff-face-A)) |
| 747 | "Face for highlighting the refinement of the selected diff in buffer B.") | 891 | "Face for highlighting the refinement of the selected diff in buffer A.") |
| 892 | |||
| 893 | (defvar ediff-fine-diff-face-B | ||
| 894 | (if (ediff-window-display-p) | ||
| 895 | (progn | ||
| 896 | (make-face 'ediff-fine-diff-face-B) | ||
| 897 | (or (face-differs-from-default-p 'ediff-fine-diff-face-B) | ||
| 898 | (cond ((ediff-color-display-p) | ||
| 899 | (ediff-set-face 'foreground 'ediff-fine-diff-face-B "Black") | ||
| 900 | (ediff-set-face 'background 'ediff-fine-diff-face-B "cyan")) | ||
| 901 | (t (set-face-underline-p 'ediff-fine-diff-face-B t)))) | ||
| 902 | 'ediff-fine-diff-face-B)) | ||
| 903 | "Face for highlighting the refinement of the selected diff in buffer B.") | ||
| 748 | 904 | ||
| 749 | (defvar ediff-fine-diff-face-C | 905 | (defvar ediff-fine-diff-face-C |
| 750 | (progn | 906 | (if (ediff-window-display-p) |
| 751 | (make-face 'ediff-fine-diff-face-C) | 907 | (progn |
| 752 | (or (face-differs-from-default-p 'ediff-fine-diff-face-C) | 908 | (make-face 'ediff-fine-diff-face-C) |
| 753 | (cond ((ediff-color-display-p) | 909 | (or (face-differs-from-default-p 'ediff-fine-diff-face-C) |
| 754 | (ediff-set-face 'foreground 'ediff-fine-diff-face-C "black") | 910 | (cond ((ediff-color-display-p) |
| 755 | (ediff-set-face | 911 | (ediff-set-face 'foreground 'ediff-fine-diff-face-C "black") |
| 756 | 'background 'ediff-fine-diff-face-C "Turquoise")) | 912 | (ediff-set-face |
| 757 | (t (set-face-underline-p 'ediff-fine-diff-face-C t)))) | 913 | 'background 'ediff-fine-diff-face-C "Turquoise")) |
| 758 | 'ediff-fine-diff-face-C) | 914 | (t (set-face-underline-p 'ediff-fine-diff-face-C t)))) |
| 759 | "Face for highlighting the refinement of the selected diff in buffer C.") | 915 | 'ediff-fine-diff-face-C)) |
| 916 | "Face for highlighting the refinement of the selected diff in buffer C.") | ||
| 917 | |||
| 918 | (defvar ediff-fine-diff-face-Ancestor | ||
| 919 | (if (ediff-window-display-p) | ||
| 920 | (progn | ||
| 921 | (make-face 'ediff-fine-diff-face-Ancestor) | ||
| 922 | (or (face-differs-from-default-p 'ediff-fine-diff-face-Ancestor) | ||
| 923 | (copy-face | ||
| 924 | 'ediff-fine-diff-face-C 'ediff-fine-diff-face-Ancestor)))) | ||
| 925 | "Face highlighting refinements of the selected diff in ancestor buffer. | ||
| 926 | Presently, this is not used, as difference regions are not refined in the | ||
| 927 | ancestor buffer.") | ||
| 760 | 928 | ||
| 761 | (defvar ediff-even-diff-face-A | 929 | (defvar ediff-even-diff-face-A |
| 762 | (progn | 930 | (if (ediff-window-display-p) |
| 763 | (make-face 'ediff-even-diff-face-A) | 931 | (progn |
| 764 | (or (face-differs-from-default-p 'ediff-even-diff-face-A) | 932 | (make-face 'ediff-even-diff-face-A) |
| 765 | (cond ((ediff-color-display-p) | 933 | (or (face-differs-from-default-p 'ediff-even-diff-face-A) |
| 766 | (ediff-set-face | 934 | (cond ((ediff-color-display-p) |
| 767 | 'foreground 'ediff-even-diff-face-A "black") | 935 | (ediff-set-face |
| 768 | (ediff-set-face | 936 | 'foreground 'ediff-even-diff-face-A "black") |
| 769 | 'background 'ediff-even-diff-face-A "light grey")) | 937 | (ediff-set-face |
| 770 | (t | 938 | 'background 'ediff-even-diff-face-A "light grey")) |
| 771 | (copy-face 'italic 'ediff-even-diff-face-A)))) | 939 | (t |
| 772 | 'ediff-even-diff-face-A) | 940 | (copy-face 'italic 'ediff-even-diff-face-A)))) |
| 773 | "Face used to highlight even-numbered differences in buffer A.") | 941 | 'ediff-even-diff-face-A)) |
| 942 | "Face used to highlight even-numbered differences in buffer A.") | ||
| 774 | 943 | ||
| 775 | (defvar ediff-even-diff-face-B | 944 | (defvar ediff-even-diff-face-B |
| 776 | (progn | 945 | (if (ediff-window-display-p) |
| 777 | (make-face 'ediff-even-diff-face-B) | 946 | (progn |
| 778 | (or (face-differs-from-default-p 'ediff-even-diff-face-B) | 947 | (make-face 'ediff-even-diff-face-B) |
| 779 | (cond ((ediff-color-display-p) | 948 | (or (face-differs-from-default-p 'ediff-even-diff-face-B) |
| 780 | (ediff-set-face | 949 | (cond ((ediff-color-display-p) |
| 781 | 'foreground 'ediff-even-diff-face-B "White") | 950 | (ediff-set-face |
| 782 | (ediff-set-face | 951 | 'foreground 'ediff-even-diff-face-B "White") |
| 783 | 'background 'ediff-even-diff-face-B "Gray")) | 952 | (ediff-set-face |
| 784 | (t | 953 | 'background 'ediff-even-diff-face-B "Gray")) |
| 785 | (copy-face 'italic 'ediff-even-diff-face-B)))) | 954 | (t |
| 786 | 'ediff-even-diff-face-B) | 955 | (copy-face 'italic 'ediff-even-diff-face-B)))) |
| 787 | "Face used to highlight even-numbered differences in buffer B.") | 956 | 'ediff-even-diff-face-B)) |
| 957 | "Face used to highlight even-numbered differences in buffer B.") | ||
| 788 | 958 | ||
| 789 | (defvar ediff-even-diff-face-C | 959 | (defvar ediff-even-diff-face-C |
| 790 | (progn | 960 | (if (ediff-window-display-p) |
| 791 | (make-face 'ediff-even-diff-face-C) | 961 | (progn |
| 792 | (copy-face 'ediff-even-diff-face-A 'ediff-even-diff-face-C) | 962 | (make-face 'ediff-even-diff-face-C) |
| 793 | 'ediff-even-diff-face-C) | 963 | (or (face-differs-from-default-p 'ediff-even-diff-face-C) |
| 794 | "Face used to highlight even-numbered differences in buffer C.") | 964 | (copy-face 'ediff-even-diff-face-A 'ediff-even-diff-face-C)) |
| 965 | 'ediff-even-diff-face-C)) | ||
| 966 | "Face used to highlight even-numbered differences in buffer C.") | ||
| 967 | |||
| 968 | (defvar ediff-even-diff-face-Ancestor | ||
| 969 | (if (ediff-window-display-p) | ||
| 970 | (progn | ||
| 971 | (make-face 'ediff-even-diff-face-Ancestor) | ||
| 972 | (or (face-differs-from-default-p 'ediff-even-diff-face-Ancestor) | ||
| 973 | (copy-face 'ediff-even-diff-face-C 'ediff-even-diff-face-Ancestor)) | ||
| 974 | 'ediff-even-diff-face-Ancestor)) | ||
| 975 | "Face highlighting even-numbered differences in the ancestor buffer.") | ||
| 795 | 976 | ||
| 796 | (defvar ediff-odd-diff-face-A | 977 | (defvar ediff-odd-diff-face-A |
| 797 | (progn | 978 | (if (ediff-window-display-p) |
| 798 | (make-face 'ediff-odd-diff-face-A) | 979 | (progn |
| 799 | (or (face-differs-from-default-p 'ediff-odd-diff-face-A) | 980 | (make-face 'ediff-odd-diff-face-A) |
| 800 | (cond ((ediff-color-display-p) | 981 | (or (face-differs-from-default-p 'ediff-odd-diff-face-A) |
| 801 | (ediff-set-face | 982 | (cond ((ediff-color-display-p) |
| 802 | 'foreground 'ediff-odd-diff-face-A "White") | 983 | (ediff-set-face |
| 803 | (ediff-set-face | 984 | 'foreground 'ediff-odd-diff-face-A "White") |
| 804 | 'background 'ediff-odd-diff-face-A "Gray")) | 985 | (ediff-set-face |
| 805 | (t | 986 | 'background 'ediff-odd-diff-face-A "Gray")) |
| 806 | (copy-face 'italic 'ediff-odd-diff-face-A)))) | 987 | (t |
| 807 | 'ediff-odd-diff-face-A) | 988 | (copy-face 'italic 'ediff-odd-diff-face-A)))) |
| 808 | "Face used to highlight odd-numbered differences in buffer A.") | 989 | 'ediff-odd-diff-face-A)) |
| 990 | "Face used to highlight odd-numbered differences in buffer A.") | ||
| 809 | 991 | ||
| 810 | (defvar ediff-odd-diff-face-B | 992 | (defvar ediff-odd-diff-face-B |
| 811 | (progn | 993 | (if (ediff-window-display-p) |
| 812 | (make-face 'ediff-odd-diff-face-B) | 994 | (progn |
| 813 | (or (face-differs-from-default-p 'ediff-odd-diff-face-B) | 995 | (make-face 'ediff-odd-diff-face-B) |
| 814 | (cond ((ediff-color-display-p) | 996 | (or (face-differs-from-default-p 'ediff-odd-diff-face-B) |
| 815 | (ediff-set-face | 997 | (cond ((ediff-color-display-p) |
| 816 | 'foreground 'ediff-odd-diff-face-B "Black") | 998 | (ediff-set-face |
| 817 | (ediff-set-face | 999 | 'foreground 'ediff-odd-diff-face-B "Black") |
| 818 | 'background 'ediff-odd-diff-face-B "light grey")) | 1000 | (ediff-set-face |
| 819 | (t | 1001 | 'background 'ediff-odd-diff-face-B "light grey")) |
| 820 | (copy-face 'italic 'ediff-odd-diff-face-B)))) | 1002 | (t |
| 821 | 'ediff-odd-diff-face-B) | 1003 | (copy-face 'italic 'ediff-odd-diff-face-B)))) |
| 822 | "Face used to highlight odd-numbered differences in buffer B.") | 1004 | 'ediff-odd-diff-face-B)) |
| 1005 | "Face used to highlight odd-numbered differences in buffer B.") | ||
| 823 | 1006 | ||
| 824 | (defvar ediff-odd-diff-face-C | 1007 | (defvar ediff-odd-diff-face-C |
| 825 | (progn | 1008 | (if (ediff-window-display-p) |
| 826 | (make-face 'ediff-odd-diff-face-C) | 1009 | (progn |
| 827 | (copy-face 'ediff-odd-diff-face-A 'ediff-odd-diff-face-C) | 1010 | (make-face 'ediff-odd-diff-face-C) |
| 828 | 'ediff-odd-diff-face-C) | 1011 | (or (face-differs-from-default-p 'ediff-odd-diff-face-C) |
| 829 | "Face used to highlight odd-numbered differences in buffer C.") | 1012 | (copy-face 'ediff-odd-diff-face-A 'ediff-odd-diff-face-C)) |
| 830 | 1013 | 'ediff-odd-diff-face-C)) | |
| 831 | ;; Create *-var faces. These are the actual faces used to highlight | 1014 | "Face used to highlight odd-numbered differences in buffer C.") |
| 832 | ;; odd-numbered difference regions. | 1015 | |
| 833 | ;; They are used as follows: when highlighting is turned on, | 1016 | (defvar ediff-odd-diff-face-Ancestor |
| 834 | ;; ediff-odd/even-diff-face-A/B/C are copied | 1017 | (if (ediff-window-display-p) |
| 835 | ;; into ediff-odd/even-diff-face-A/B/C-var, and all odd/even overlays become | 1018 | (progn |
| 836 | ;; highlighted. When highlighting is turned off, then the face 'default is | 1019 | (make-face 'ediff-odd-diff-face-Ancestor) |
| 837 | ;; copied into ediff-odd/even-diff-face-A/B/C-var, thereby unhighlighting all | 1020 | (or (face-differs-from-default-p 'ediff-odd-diff-face-Ancestor) |
| 838 | ;; difference regions. | 1021 | (copy-face 'ediff-odd-diff-face-C 'ediff-odd-diff-face-Ancestor)) |
| 839 | (make-face 'ediff-even-diff-face-A-var) | 1022 | 'ediff-odd-diff-face-Ancestor)) |
| 840 | (make-face 'ediff-even-diff-face-B-var) | 1023 | "Face used to highlight even-numbered differences in the ancestor buffer.") |
| 841 | (make-face 'ediff-even-diff-face-C-var) | 1024 | |
| 842 | (make-face 'ediff-odd-diff-face-A-var) | 1025 | ;; Help echo |
| 843 | (make-face 'ediff-odd-diff-face-B-var) | 1026 | (put 'ediff-fine-diff-face-A 'ediff-help-echo |
| 844 | (make-face 'ediff-odd-diff-face-C-var) | 1027 | "A `refinement' of the current difference region") |
| 845 | 1028 | (put 'ediff-fine-diff-face-B 'ediff-help-echo | |
| 846 | ;; initialize *-var faces | 1029 | "A `refinement' of the current difference region") |
| 847 | (defun ediff-init-var-faces () | 1030 | (put 'ediff-fine-diff-face-C 'ediff-help-echo |
| 848 | (copy-face (if (and ediff-use-faces ediff-highlight-all-diffs) | 1031 | "A `refinement' of the current difference region") |
| 849 | ediff-even-diff-face-A 'default) | 1032 | (put 'ediff-fine-diff-face-Ancestor 'ediff-help-echo |
| 850 | 'ediff-even-diff-face-A-var) | 1033 | "A `refinement' of the current difference region") |
| 851 | (copy-face (if (and ediff-use-faces ediff-highlight-all-diffs) | 1034 | |
| 852 | ediff-even-diff-face-B 'default) | ||
| 853 | 'ediff-even-diff-face-B-var) | ||
| 854 | (copy-face (if (and ediff-use-faces ediff-highlight-all-diffs) | ||
| 855 | ediff-even-diff-face-C 'default) | ||
| 856 | 'ediff-even-diff-face-C-var) | ||
| 857 | (copy-face (if (and ediff-use-faces ediff-highlight-all-diffs) | ||
| 858 | ediff-odd-diff-face-A 'default) | ||
| 859 | 'ediff-odd-diff-face-A-var) | ||
| 860 | (copy-face (if (and ediff-use-faces ediff-highlight-all-diffs) | ||
| 861 | ediff-odd-diff-face-B 'default) | ||
| 862 | 'ediff-odd-diff-face-B-var) | ||
| 863 | (copy-face (if (and ediff-use-faces ediff-highlight-all-diffs) | ||
| 864 | ediff-odd-diff-face-C 'default) | ||
| 865 | 'ediff-odd-diff-face-C-var) | ||
| 866 | ) | ||
| 867 | |||
| 868 | 1035 | ||
| 869 | ;;; Overlays | 1036 | ;;; Overlays |
| 870 | 1037 | ||
| 871 | (ediff-defvar-local ediff-current-diff-overlay-A nil | 1038 | (ediff-defvar-local ediff-current-diff-overlay-A nil |
| 872 | "Overlay for the current difference region in buffer A.") | 1039 | "Overlay for the current difference region in buffer A.") |
| 873 | (ediff-defvar-local ediff-current-diff-overlay-B nil | 1040 | (ediff-defvar-local ediff-current-diff-overlay-B nil |
| 874 | "Overlay for the current difference region in buffer B.") | 1041 | "Overlay for the current difference region in buffer B.") |
| 875 | (ediff-defvar-local ediff-current-diff-overlay-C nil | 1042 | (ediff-defvar-local ediff-current-diff-overlay-C nil |
| 876 | "Overlay for the current difference region in buffer C.") | 1043 | "Overlay for the current difference region in buffer C.") |
| 1044 | (ediff-defvar-local ediff-current-diff-overlay-Ancestor nil | ||
| 1045 | "Overlay for the current difference region in the ancestor buffer.") | ||
| 877 | 1046 | ||
| 878 | (defun ediff-make-current-diff-overlay (type) | 1047 | ;; Compute priority of ediff overlay. |
| 879 | (let ((overlay (intern (format "ediff-current-diff-overlay-%S" type))) | 1048 | (defun ediff-highest-priority (start end buffer) |
| 880 | (buffer (ediff-get-buffer type)) | 1049 | (let ((pos (max 1 (1- start))) |
| 881 | (face (face-name | 1050 | ovr-list) |
| 882 | (symbol-value | 1051 | (if ediff-xemacs-p |
| 883 | (intern (format "ediff-current-diff-face-%S" type)))))) | 1052 | (1+ ediff-shadow-overlay-priority) |
| 884 | (set overlay | 1053 | (ediff-eval-in-buffer buffer |
| 885 | (ediff-make-bullet-proof-overlay (point-max) (point-max) buffer)) | 1054 | (while (< pos (min (point-max) (1+ end))) |
| 886 | (ediff-overlay-put (symbol-value overlay) 'face face) | 1055 | (setq ovr-list (append (overlays-at pos) ovr-list)) |
| 887 | (ediff-overlay-put (symbol-value overlay) 'ediff ediff-control-buffer) | 1056 | (setq pos (next-overlay-change pos))) |
| 888 | )) | 1057 | (1+ (apply '+ |
| 889 | 1058 | (mapcar (function | |
| 890 | ;; Compute priority of ediff overlay. | 1059 | (lambda (ovr) |
| 891 | (defun ediff-highest-priority (start end buffer) | 1060 | (if ovr |
| 892 | (let ((pos (max 1 (1- start))) | 1061 | (or (ediff-overlay-get ovr 'priority) 0) |
| 893 | ovr-list) | 1062 | 0))) |
| 894 | (if ediff-xemacs-p | 1063 | ovr-list) |
| 895 | (1+ ediff-shadow-overlay-priority) | 1064 | )) |
| 896 | (ediff-eval-in-buffer buffer | 1065 | )))) |
| 897 | (while (< pos (min (point-max) (1+ end))) | ||
| 898 | (setq ovr-list (append (overlays-at pos) ovr-list)) | ||
| 899 | (setq pos (next-overlay-change pos))) | ||
| 900 | (1+ (apply '+ | ||
| 901 | (mapcar (function | ||
| 902 | (lambda (ovr) | ||
| 903 | (if ovr | ||
| 904 | (or (ediff-overlay-get ovr 'priority) 0) | ||
| 905 | 0))) | ||
| 906 | ovr-list) | ||
| 907 | )) | ||
| 908 | )))) | ||
| 909 | ) | ||
| 910 | 1066 | ||
| 911 | 1067 | ||
| 912 | (defvar ediff-toggle-read-only-function nil | 1068 | (defvar ediff-toggle-read-only-function nil |
| @@ -983,13 +1139,6 @@ More precisely, a regexp to match any one such character.") | |||
| 983 | (next-window wind) | 1139 | (next-window wind) |
| 984 | (selected-window))))) | 1140 | (selected-window))))) |
| 985 | 1141 | ||
| 986 | (defsubst ediff-convert-diffs-to-overlays (diff-list) | ||
| 987 | (ediff-set-diff-overlays-in-one-buffer 'A diff-list) | ||
| 988 | (ediff-set-diff-overlays-in-one-buffer 'B diff-list) | ||
| 989 | (if ediff-3way-job | ||
| 990 | (ediff-set-diff-overlays-in-one-buffer 'C diff-list)) | ||
| 991 | (message "Processing difference regions ... done")) | ||
| 992 | |||
| 993 | 1142 | ||
| 994 | (defsubst ediff-kill-buffer-carefully (buf) | 1143 | (defsubst ediff-kill-buffer-carefully (buf) |
| 995 | "Kill buffer BUF if it exists." | 1144 | "Kill buffer BUF if it exists." |
| @@ -1001,20 +1150,34 @@ More precisely, a regexp to match any one such character.") | |||
| 1001 | "Put face on diff N. Invoked for X displays only." | 1150 | "Put face on diff N. Invoked for X displays only." |
| 1002 | (ediff-highlight-diff-in-one-buffer n 'A) | 1151 | (ediff-highlight-diff-in-one-buffer n 'A) |
| 1003 | (ediff-highlight-diff-in-one-buffer n 'B) | 1152 | (ediff-highlight-diff-in-one-buffer n 'B) |
| 1004 | (ediff-highlight-diff-in-one-buffer n 'C)) | 1153 | (ediff-highlight-diff-in-one-buffer n 'C) |
| 1154 | (ediff-highlight-diff-in-one-buffer n 'Ancestor) | ||
| 1155 | ) | ||
| 1005 | 1156 | ||
| 1006 | 1157 | ||
| 1007 | (defsubst ediff-unhighlight-diff () | 1158 | (defsubst ediff-unhighlight-diff () |
| 1008 | "Remove overlays from buffers A, B, and C." | 1159 | "Remove overlays from buffers A, B, and C." |
| 1009 | (ediff-unhighlight-diff-in-one-buffer 'A) | 1160 | (ediff-unhighlight-diff-in-one-buffer 'A) |
| 1010 | (ediff-unhighlight-diff-in-one-buffer 'B) | 1161 | (ediff-unhighlight-diff-in-one-buffer 'B) |
| 1011 | (ediff-unhighlight-diff-in-one-buffer 'C)) | 1162 | (ediff-unhighlight-diff-in-one-buffer 'C) |
| 1163 | (ediff-unhighlight-diff-in-one-buffer 'Ancestor) | ||
| 1164 | ) | ||
| 1012 | 1165 | ||
| 1013 | ;; delete highlighting overlays, restore faces to their original form | 1166 | ;; delete highlighting overlays, restore faces to their original form |
| 1014 | (defsubst ediff-unhighlight-diffs-totally () | 1167 | (defsubst ediff-unhighlight-diffs-totally () |
| 1015 | (ediff-unhighlight-diffs-totally-in-one-buffer 'A) | 1168 | (ediff-unhighlight-diffs-totally-in-one-buffer 'A) |
| 1016 | (ediff-unhighlight-diffs-totally-in-one-buffer 'B) | 1169 | (ediff-unhighlight-diffs-totally-in-one-buffer 'B) |
| 1017 | (ediff-unhighlight-diffs-totally-in-one-buffer 'C)) | 1170 | (ediff-unhighlight-diffs-totally-in-one-buffer 'C) |
| 1171 | (ediff-unhighlight-diffs-totally-in-one-buffer 'Ancestor) | ||
| 1172 | ) | ||
| 1173 | |||
| 1174 | (defsubst ediff-background-face (buf-type dif-num) | ||
| 1175 | ;; The value of dif-num is always 1- the one that user sees. | ||
| 1176 | ;; This is why even face is used when dif-num is odd. | ||
| 1177 | (intern (format (if (ediff-odd-p dif-num) | ||
| 1178 | "ediff-even-diff-face-%S" | ||
| 1179 | "ediff-odd-diff-face-%S") | ||
| 1180 | buf-type))) | ||
| 1018 | 1181 | ||
| 1019 | 1182 | ||
| 1020 | ;; arg is a record for a given diff in a difference vector | 1183 | ;; arg is a record for a given diff in a difference vector |
| @@ -1047,6 +1210,31 @@ More precisely, a regexp to match any one such character.") | |||
| 1047 | (button-event-p event) | 1210 | (button-event-p event) |
| 1048 | (string-match "mouse" (format "%S" (event-basic-type event))) | 1211 | (string-match "mouse" (format "%S" (event-basic-type event))) |
| 1049 | )) | 1212 | )) |
| 1213 | |||
| 1214 | |||
| 1215 | (defsubst ediff-key-press-event-p (event) | ||
| 1216 | (if ediff-xemacs-p | ||
| 1217 | (key-press-event-p event) | ||
| 1218 | (or (char-or-string-p event) (symbolp event)))) | ||
| 1219 | |||
| 1220 | (defun ediff-event-point (event) | ||
| 1221 | (cond ((ediff-mouse-event-p event) | ||
| 1222 | (if ediff-xemacs-p | ||
| 1223 | (event-point event) | ||
| 1224 | (posn-point (event-start event)))) | ||
| 1225 | ((ediff-key-press-event-p event) | ||
| 1226 | (point)) | ||
| 1227 | (t (error)))) | ||
| 1228 | |||
| 1229 | (defun ediff-event-buffer (event) | ||
| 1230 | (cond ((ediff-mouse-event-p event) | ||
| 1231 | (if ediff-xemacs-p | ||
| 1232 | (event-buffer event) | ||
| 1233 | (window-buffer (posn-window (event-start event))))) | ||
| 1234 | ((ediff-key-press-event-p event) | ||
| 1235 | (current-buffer)) | ||
| 1236 | (t (error)))) | ||
| 1237 | |||
| 1050 | 1238 | ||
| 1051 | (defsubst ediff-frame-iconified-p (frame) | 1239 | (defsubst ediff-frame-iconified-p (frame) |
| 1052 | (if (and (ediff-window-display-p) (frame-live-p frame)) | 1240 | (if (and (ediff-window-display-p) (frame-live-p frame)) |
| @@ -1066,13 +1254,48 @@ More precisely, a regexp to match any one such character.") | |||
| 1066 | (/ (frame-pixel-width frame) (frame-width frame)) | 1254 | (/ (frame-pixel-width frame) (frame-width frame)) |
| 1067 | (frame-char-width frame))) | 1255 | (frame-char-width frame))) |
| 1068 | 1256 | ||
| 1069 | (defsubst ediff-reset-mouse (&optional frame) | 1257 | (defun ediff-reset-mouse (&optional frame do-not-grab-mouse) |
| 1070 | (setq frame | 1258 | (or frame (setq frame (selected-frame))) |
| 1071 | (if ediff-xemacs-p | ||
| 1072 | (frame-selected-window (or frame (selected-frame))) | ||
| 1073 | (or frame (selected-frame)))) | ||
| 1074 | (if (ediff-window-display-p) | 1259 | (if (ediff-window-display-p) |
| 1075 | (set-mouse-position frame 1 0))) | 1260 | (let ((frame-or-wind frame)) |
| 1261 | (if ediff-xemacs-p | ||
| 1262 | (setq frame-or-wind (frame-selected-window frame))) | ||
| 1263 | (or do-not-grab-mouse | ||
| 1264 | ;; don't set mouse if the user said to never do this | ||
| 1265 | (not ediff-grab-mouse) | ||
| 1266 | ;; Don't grab on quit, if the user doesn't want to. | ||
| 1267 | ;; If ediff-grab-mouse = t, then mouse won't be grabbed for | ||
| 1268 | ;; sessions that are not part of a group (this is done in | ||
| 1269 | ;; ediff-recenter). The condition below affects only terminating | ||
| 1270 | ;; sessions in session groups (in whhich case mouse is warped into | ||
| 1271 | ;; a meta buffer). | ||
| 1272 | (and (eq ediff-grab-mouse 'maybe) | ||
| 1273 | (memq this-command '(ediff-quit ediff-update-diffs))) | ||
| 1274 | (set-mouse-position frame-or-wind 1 0)) | ||
| 1275 | ))) | ||
| 1276 | |||
| 1277 | (defsubst ediff-spy-after-mouse () | ||
| 1278 | (setq ediff-mouse-pixel-position (mouse-pixel-position))) | ||
| 1279 | |||
| 1280 | ;; This is actually not easy to find out since emacs and xemacs behave | ||
| 1281 | ;; differently when mouse is not in any frame. Also, this is sensitive to | ||
| 1282 | ;; when the user grabbed mouse. | ||
| 1283 | ;; Not used for now. | ||
| 1284 | (defun ediff-user-grabbed-mouse () | ||
| 1285 | (if ediff-mouse-pixel-position | ||
| 1286 | (cond ((not (eq (car ediff-mouse-pixel-position) | ||
| 1287 | (car (mouse-pixel-position))))) | ||
| 1288 | ((and (car (cdr ediff-mouse-pixel-position)) | ||
| 1289 | (car (cdr (mouse-pixel-position))) | ||
| 1290 | (cdr (cdr ediff-mouse-pixel-position)) | ||
| 1291 | (cdr (cdr (mouse-pixel-position)))) | ||
| 1292 | (not (and (< (abs (- (car (cdr ediff-mouse-pixel-position)) | ||
| 1293 | (car (cdr (mouse-pixel-position))))) | ||
| 1294 | ediff-mouse-pixel-threshhold) | ||
| 1295 | (< (abs (- (cdr (cdr ediff-mouse-pixel-position)) | ||
| 1296 | (cdr (cdr (mouse-pixel-position))))) | ||
| 1297 | ediff-mouse-pixel-threshhold)))) | ||
| 1298 | (t nil)))) | ||
| 1076 | 1299 | ||
| 1077 | (defsubst ediff-frame-char-height (frame) | 1300 | (defsubst ediff-frame-char-height (frame) |
| 1078 | (if ediff-xemacs-p | 1301 | (if ediff-xemacs-p |
| @@ -1098,6 +1321,7 @@ More precisely, a regexp to match any one such character.") | |||
| 1098 | ;; If 2-way job and buf-type = C, then returns t. | 1321 | ;; If 2-way job and buf-type = C, then returns t. |
| 1099 | (defun ediff-whitespace-diff-region-p (n buf-type) | 1322 | (defun ediff-whitespace-diff-region-p (n buf-type) |
| 1100 | (or (and (eq buf-type 'C) (not ediff-3way-job)) | 1323 | (or (and (eq buf-type 'C) (not ediff-3way-job)) |
| 1324 | (ediff-empty-diff-region-p n buf-type) | ||
| 1101 | (let ((beg (ediff-get-diff-posn buf-type 'beg n)) | 1325 | (let ((beg (ediff-get-diff-posn buf-type 'beg n)) |
| 1102 | (end (ediff-get-diff-posn buf-type 'end n))) | 1326 | (end (ediff-get-diff-posn buf-type 'end n))) |
| 1103 | (ediff-eval-in-buffer (ediff-get-buffer buf-type) | 1327 | (ediff-eval-in-buffer (ediff-get-buffer buf-type) |
| @@ -1108,10 +1332,71 @@ More precisely, a regexp to match any one such character.") | |||
| 1108 | 1332 | ||
| 1109 | ;; temporarily uses DIR to abbreviate file name | 1333 | ;; temporarily uses DIR to abbreviate file name |
| 1110 | ;; if DIR is nil, use default-directory | 1334 | ;; if DIR is nil, use default-directory |
| 1111 | (defsubst ediff-abbreviate-filename (file dir) | 1335 | (defsubst ediff-abbreviate-file-name (file &optional dir) |
| 1112 | (let* ((dir (or dir default-directory)) | 1336 | (cond ((stringp dir) |
| 1113 | (directory-abbrev-alist (list (cons dir "")))) | 1337 | (let ((directory-abbrev-alist (list (cons dir "")))) |
| 1114 | (abbreviate-file-name file))) | 1338 | (abbreviate-file-name file))) |
| 1339 | (ediff-emacs-p (abbreviate-file-name file)) | ||
| 1340 | (t ; XEmacs requires addl argument | ||
| 1341 | (abbreviate-file-name file t)))) | ||
| 1342 | |||
| 1343 | ;; Takes a directory and returns the parent directory. | ||
| 1344 | ;; does nothing to `/'. If the ARG is a regular file, | ||
| 1345 | ;; strip the file AND the last dir. | ||
| 1346 | (defun ediff-strip-last-dir (dir) | ||
| 1347 | (if (not (stringp dir)) (setq dir default-directory)) | ||
| 1348 | (setq dir (expand-file-name dir)) | ||
| 1349 | (or (file-directory-p dir) (setq dir (file-name-directory dir))) | ||
| 1350 | (let* ((pos (1- (length dir))) | ||
| 1351 | (last-char (aref dir pos))) | ||
| 1352 | (if (and (> pos 0) (= last-char ?/)) | ||
| 1353 | (setq dir (substring dir 0 pos))) | ||
| 1354 | (ediff-abbreviate-file-name (file-name-directory dir)))) | ||
| 1355 | |||
| 1356 | (defun ediff-truncate-string-left (str newlen) | ||
| 1357 | ;; leave space for ... on the left | ||
| 1358 | (let ((len (length str)) | ||
| 1359 | substr) | ||
| 1360 | (if (<= len newlen) | ||
| 1361 | str | ||
| 1362 | (setq newlen (max 0 (- newlen 3))) | ||
| 1363 | (setq substr (substring str (max 0 (- len 1 newlen)))) | ||
| 1364 | (concat "..." substr)))) | ||
| 1365 | |||
| 1366 | (defun ediff-abbrev-jobname (jobname) | ||
| 1367 | (cond ((eq jobname 'ediff-directories) | ||
| 1368 | "Compare two directories") | ||
| 1369 | ((eq jobname 'ediff-files) | ||
| 1370 | "Compare two files") | ||
| 1371 | ((eq jobname 'ediff-buffers) | ||
| 1372 | "Compare two buffers") | ||
| 1373 | ((eq jobname 'ediff-directories3) | ||
| 1374 | "Compare three directories") | ||
| 1375 | ((eq jobname 'ediff-files3) | ||
| 1376 | "Compare three files") | ||
| 1377 | ((eq jobname 'ediff-buffers3) | ||
| 1378 | "Compare three buffers") | ||
| 1379 | ((eq jobname 'ediff-revision) | ||
| 1380 | "Compare file with a version") | ||
| 1381 | ((eq jobname 'ediff-directory-revisions) | ||
| 1382 | "Compare dir files with versions") | ||
| 1383 | ((eq jobname 'ediff-merge-directory-revisions) | ||
| 1384 | "Merge dir files with versions") | ||
| 1385 | ((eq jobname 'ediff-merge-directory-revisions-with-ancestor) | ||
| 1386 | "Merge dir versions via ancestors") | ||
| 1387 | (t | ||
| 1388 | (let* ((str (substring (symbol-name jobname) 6)) | ||
| 1389 | (len (length str)) | ||
| 1390 | (pos 0)) | ||
| 1391 | (while (< pos len) | ||
| 1392 | (if (= pos 0) | ||
| 1393 | (aset str pos (upcase (aref str pos)))) | ||
| 1394 | (if (= (aref str pos) ?-) | ||
| 1395 | (aset str pos ?\ )) | ||
| 1396 | (setq pos (1+ pos))) | ||
| 1397 | str)))) | ||
| 1398 | |||
| 1399 | |||
| 1115 | 1400 | ||
| 1116 | (defsubst ediff-get-region-contents (n buf-type ctrl-buf &optional start end) | 1401 | (defsubst ediff-get-region-contents (n buf-type ctrl-buf &optional start end) |
| 1117 | (ediff-eval-in-buffer | 1402 | (ediff-eval-in-buffer |
| @@ -1122,7 +1407,7 @@ More precisely, a regexp to match any one such character.") | |||
| 1122 | 1407 | ||
| 1123 | ;; If ediff modified mode line, strip the modification | 1408 | ;; If ediff modified mode line, strip the modification |
| 1124 | (defsubst ediff-strip-mode-line-format () | 1409 | (defsubst ediff-strip-mode-line-format () |
| 1125 | (if (member (car mode-line-format) '(" A: " " B: " " C: ")) | 1410 | (if (member (car mode-line-format) '(" A: " " B: " " C: " " Ancestor: ")) |
| 1126 | (setq mode-line-format (nth 2 mode-line-format)))) | 1411 | (setq mode-line-format (nth 2 mode-line-format)))) |
| 1127 | 1412 | ||
| 1128 | ;; Verify that we have a difference selected. | 1413 | ;; Verify that we have a difference selected. |
| @@ -1133,6 +1418,9 @@ More precisely, a regexp to match any one such character.") | |||
| 1133 | (defsubst ediff-show-all-diffs (n) | 1418 | (defsubst ediff-show-all-diffs (n) |
| 1134 | "Don't skip difference regions." | 1419 | "Don't skip difference regions." |
| 1135 | nil) | 1420 | nil) |
| 1421 | |||
| 1422 | (defsubst Xor (a b) | ||
| 1423 | (or (and a (not b)) (and (not a) b))) | ||
| 1136 | 1424 | ||
| 1137 | (provide 'ediff-init) | 1425 | (provide 'ediff-init) |
| 1138 | 1426 | ||