comparison lisp/ediff-util.el @ 12085:589a32fa67a9

Converted xemacs *screen* nomenclature to *frame*. Incorporated overlay strings. Ediff no longer runs under emacs 19.28 and earlier and XEmacs 19.11 and earlier.
author Karl Heuer <kwzh@gnu.org>
date Mon, 05 Jun 1995 23:43:51 +0000
parents 4b293ac1eef6
children 3999c7e35227
comparison
equal deleted inserted replaced
12084:4a13777b153b 12085:589a32fa67a9
41 `ediff-merge-files-with-ancestor' 41 `ediff-merge-files-with-ancestor'
42 `ediff-merge-buffers' 42 `ediff-merge-buffers'
43 `ediff-merge-buffers-with-ancestor' 43 `ediff-merge-buffers-with-ancestor'
44 `ediff-merge-revisions' 44 `ediff-merge-revisions'
45 `ediff-merge-revisions-with-ancestor' 45 `ediff-merge-revisions-with-ancestor'
46 `ediff-windows' 46 `ediff-windows-wordwise'
47 `ediff-small-regions' 47 `ediff-windows-linewise'
48 `ediff-large-regions' 48 `ediff-regions-wordwise'
49 `ediff-regions-linewise'
49 `epatch' 50 `epatch'
50 `ediff-patch-file' 51 `ediff-patch-file'
51 `ediff-patch-buffer' 52 `ediff-patch-buffer'
52 `epatch-buffer' 53 `epatch-buffer'
53 `ediff-revision' 54 `ediff-revision'
115 (define-key ediff-mode-map "\C-l" 'ediff-recenter) 116 (define-key ediff-mode-map "\C-l" 'ediff-recenter)
116 (define-key ediff-mode-map "|" 'ediff-toggle-split) 117 (define-key ediff-mode-map "|" 'ediff-toggle-split)
117 (define-key ediff-mode-map "h" 'ediff-toggle-hilit) 118 (define-key ediff-mode-map "h" 'ediff-toggle-hilit)
118 (or ediff-word-mode 119 (or ediff-word-mode
119 (define-key ediff-mode-map "@" 'ediff-toggle-autorefine)) 120 (define-key ediff-mode-map "@" 'ediff-toggle-autorefine))
120 (if ediff-word-mode-job 121 (if ediff-narrow-job
121 (define-key ediff-mode-map "%" 'ediff-toggle-narrow-region)) 122 (define-key ediff-mode-map "%" 'ediff-toggle-narrow-region))
122 (define-key ediff-mode-map "~" 'ediff-swap-buffers) 123 (define-key ediff-mode-map "~" 'ediff-swap-buffers)
123 (define-key ediff-mode-map "v" 'ediff-scroll-vertically) 124 (define-key ediff-mode-map "v" 'ediff-scroll-vertically)
124 (define-key ediff-mode-map "\C-v" 'ediff-scroll-vertically) 125 (define-key ediff-mode-map "\C-v" 'ediff-scroll-vertically)
125 (define-key ediff-mode-map "^" 'ediff-scroll-vertically) 126 (define-key ediff-mode-map "^" 'ediff-scroll-vertically)
126 (define-key ediff-mode-map "\M-v" 'ediff-scroll-vertically) 127 (define-key ediff-mode-map "\M-v" 'ediff-scroll-vertically)
127 (define-key ediff-mode-map "V" 'ediff-scroll-vertically) 128 (define-key ediff-mode-map "V" 'ediff-scroll-vertically)
128 (define-key ediff-mode-map "<" 'ediff-scroll-horizontally) 129 (define-key ediff-mode-map "<" 'ediff-scroll-horizontally)
129 (define-key ediff-mode-map ">" 'ediff-scroll-horizontally) 130 (define-key ediff-mode-map ">" 'ediff-scroll-horizontally)
130 (define-key ediff-mode-map "i" 'ediff-status-info) 131 (define-key ediff-mode-map "i" 'ediff-status-info)
132 (define-key ediff-mode-map "D" 'ediff-documentation)
131 (define-key ediff-mode-map "?" 'ediff-toggle-help) 133 (define-key ediff-mode-map "?" 'ediff-toggle-help)
132 (define-key ediff-mode-map "!" 'ediff-update-diffs) 134 (define-key ediff-mode-map "!" 'ediff-update-diffs)
133 (or ediff-word-mode 135 (or ediff-word-mode
134 (define-key ediff-mode-map "*" 'ediff-make-or-kill-fine-diffs)) 136 (define-key ediff-mode-map "*" 'ediff-make-or-kill-fine-diffs))
135 (define-key ediff-mode-map "a" nil) 137 (define-key ediff-mode-map "a" nil)
209 ;;; Setup functions 211 ;;; Setup functions
210 212
211 (require 'ediff-wind) 213 (require 'ediff-wind)
212 214
213 ;; Common startup entry for all Ediff functions 215 ;; Common startup entry for all Ediff functions
216 ;; It now returns control buffer so other functions can do post-processing
214 (defun ediff-setup (buffer-A file-A buffer-B file-B buffer-C file-C 217 (defun ediff-setup (buffer-A file-A buffer-B file-B buffer-C file-C
215 startup-hooks setup-parameters) 218 startup-hooks setup-parameters)
216 (setq file-A (expand-file-name file-A)) 219 (setq file-A (expand-file-name file-A))
217 (setq file-B (expand-file-name file-B)) 220 (setq file-B (expand-file-name file-B))
218 (if (stringp file-C) 221 (if (stringp file-C)
233 (setq ediff-3way-comparison-job (ediff-3way-comparison-job) 236 (setq ediff-3way-comparison-job (ediff-3way-comparison-job)
234 ediff-merge-job (ediff-merge-job) 237 ediff-merge-job (ediff-merge-job)
235 ediff-merge-with-ancestor-job (ediff-merge-with-ancestor-job) 238 ediff-merge-with-ancestor-job (ediff-merge-with-ancestor-job)
236 ediff-3way-job (ediff-3way-job) 239 ediff-3way-job (ediff-3way-job)
237 ediff-diff3-job (ediff-diff3-job) 240 ediff-diff3-job (ediff-diff3-job)
241 ediff-narrow-job (ediff-narrow-job)
242 ediff-windows-job (ediff-windows-job)
238 ediff-word-mode-job (ediff-word-mode-job)) 243 ediff-word-mode-job (ediff-word-mode-job))
239 244
240 (make-local-variable 'ediff-prefer-long-help-message) 245 (make-local-variable 'ediff-prefer-long-help-message)
241 (make-local-variable 'ediff-prefer-iconified-control-frame) 246 (make-local-variable 'ediff-prefer-iconified-control-frame)
242 (make-local-variable 'ediff-split-window-function) 247 (make-local-variable 'ediff-split-window-function)
243 (make-local-variable 'ediff-default-variant) 248 (make-local-variable 'ediff-default-variant)
244 (make-local-variable 'ediff-merge-window-share) 249 (make-local-variable 'ediff-merge-window-share)
250 (make-local-variable 'ediff-window-setup-function)
245 251
246 ;; adjust for merge jobs 252 ;; adjust for merge jobs
247 (if ediff-merge-job 253 (if ediff-merge-job
248 (let ((buf 254 (let ((buf
249 ;; Use buf A even if `combined'. The right stuff is 255 ;; Use buf A even if `combined'. The right stuff is
259 (setq buffer-C 265 (setq buffer-C
260 (get-buffer-create 266 (get-buffer-create
261 (ediff-unique-buffer-name "*ediff-merge" "*"))) 267 (ediff-unique-buffer-name "*ediff-merge" "*")))
262 (save-excursion 268 (save-excursion
263 (set-buffer buffer-C) 269 (set-buffer buffer-C)
264 (insert-buffer buf)))) 270 (insert-buffer buf)
271 (funcall (ediff-eval-in-buffer buf major-mode))
272 ;; after Stig@hackvan.com
273 (add-hook 'local-write-file-hooks 'ediff-set-merge-mode)
274 )))
265 (setq buffer-read-only nil 275 (setq buffer-read-only nil
266 ediff-buffer-A buffer-A 276 ediff-buffer-A buffer-A
267 ediff-buffer-B buffer-B 277 ediff-buffer-B buffer-B
268 ediff-buffer-C buffer-C 278 ediff-buffer-C buffer-C
269 ediff-control-buffer control-buffer) 279 ediff-control-buffer control-buffer)
292 (if ediff-3way-job 302 (if ediff-3way-job
293 (ediff-eval-in-buffer buffer-C (ediff-strip-mode-line-format))) 303 (ediff-eval-in-buffer buffer-C (ediff-strip-mode-line-format)))
294 304
295 (ediff-save-protected-variables) ; save variables to be restored on exit 305 (ediff-save-protected-variables) ; save variables to be restored on exit
296 306
297 ;; This will be deleted when emacs gets before/after strings
298 (ediff-remember-buffer-characteristics t) ; remember at setup
299
300 ;; ediff-setup-diff-regions-function must be set after setup 307 ;; ediff-setup-diff-regions-function must be set after setup
301 ;; parameters are processed. 308 ;; parameters are processed.
302 (setq ediff-setup-diff-regions-function 309 (setq ediff-setup-diff-regions-function
303 (if ediff-diff3-job 310 (if ediff-diff3-job
304 'ediff-setup-diff-regions3 311 'ediff-setup-diff-regions3
305 'ediff-setup-diff-regions)) 312 'ediff-setup-diff-regions))
306 313
307 (setq ediff-wide-bounds 314 (setq ediff-wide-bounds
308 (list (ediff-make-bullet-proof-overlay 315 (list (ediff-make-bullet-proof-overlay
309 '(point-min) '(point-max) ediff-buffer-A) 316 '(point-min) '(point-max) ediff-buffer-A)
310 (ediff-make-bullet-proof-overlay 317 (ediff-make-bullet-proof-overlay
311 '(point-min) '(point-max) ediff-buffer-B) 318 '(point-min) '(point-max) ediff-buffer-B)
322 (ediff-set-keys) ; comes after parameter setup 329 (ediff-set-keys) ; comes after parameter setup
323 330
324 ;; set up ediff-narrow-bounds, if not set 331 ;; set up ediff-narrow-bounds, if not set
325 (or ediff-narrow-bounds 332 (or ediff-narrow-bounds
326 (setq ediff-narrow-bounds ediff-wide-bounds)) 333 (setq ediff-narrow-bounds ediff-wide-bounds))
327
328 ;; The following will go away once before/after-string overlay
329 ;; properties are added to emacs 19. The only thing that will remain
330 ;; are the calls to ediff-prepare-buffer-hooks, nuking the selective
331 ;; display, and setting files A/B r/o for merge.
332 334
333 ;; All these must be inside ediff-eval-in-buffer control-buffer, 335 ;; All these must be inside ediff-eval-in-buffer control-buffer,
334 ;; since these vars are local to control-buffer 336 ;; since these vars are local to control-buffer
335 ;; These won't run if there are errors in diff 337 ;; These won't run if there are errors in diff
336 (ediff-eval-in-buffer ediff-buffer-A 338 (ediff-eval-in-buffer ediff-buffer-A
337 (ediff-nuke-selective-display) 339 (ediff-nuke-selective-display)
338 (run-hooks 'ediff-prepare-buffer-hooks) 340 (run-hooks 'ediff-prepare-buffer-hooks)
339 (if (ediff-eval-in-buffer control-buffer ediff-merge-job) 341 (if (ediff-eval-in-buffer control-buffer ediff-merge-job)
340 (setq buffer-read-only t)) 342 (setq buffer-read-only t))
341 (add-hook 'local-write-file-hooks 'ediff-block-write-file) 343 ;; add control-buffer to the list of sessions--no longer used, but may
342 (setq before-change-function 'ediff-before-change-guard) 344 ;; be used again in the future
343 ;; add control-buffer to the list of sessions
344 (or (memq control-buffer ediff-this-buffer-control-sessions) 345 (or (memq control-buffer ediff-this-buffer-control-sessions)
345 (setq ediff-this-buffer-control-sessions 346 (setq ediff-this-buffer-control-sessions
346 (cons control-buffer ediff-this-buffer-control-sessions))) 347 (cons control-buffer ediff-this-buffer-control-sessions)))
347 ) 348 )
348 (ediff-eval-in-buffer ediff-buffer-B 349 (ediff-eval-in-buffer ediff-buffer-B
349 (ediff-nuke-selective-display) 350 (ediff-nuke-selective-display)
350 (run-hooks 'ediff-prepare-buffer-hooks) 351 (run-hooks 'ediff-prepare-buffer-hooks)
351 (if (ediff-eval-in-buffer control-buffer ediff-merge-job) 352 (if (ediff-eval-in-buffer control-buffer ediff-merge-job)
352 (setq buffer-read-only t)) 353 (setq buffer-read-only t))
353 (add-hook 'local-write-file-hooks 'ediff-block-write-file)
354 (setq before-change-function 'ediff-before-change-guard)
355 ;; add control-buffer to the list of sessions 354 ;; add control-buffer to the list of sessions
356 (or (memq control-buffer ediff-this-buffer-control-sessions) 355 (or (memq control-buffer ediff-this-buffer-control-sessions)
357 (setq ediff-this-buffer-control-sessions 356 (setq ediff-this-buffer-control-sessions
358 (cons control-buffer ediff-this-buffer-control-sessions))) 357 (cons control-buffer ediff-this-buffer-control-sessions)))
359 ) 358 )
360 (if ediff-3way-job 359 (if ediff-3way-job
361 (ediff-eval-in-buffer ediff-buffer-C 360 (ediff-eval-in-buffer ediff-buffer-C
362 (ediff-nuke-selective-display) 361 (ediff-nuke-selective-display)
363 (run-hooks 'ediff-prepare-buffer-hooks) 362 (run-hooks 'ediff-prepare-buffer-hooks)
364 (add-hook 'local-write-file-hooks 'ediff-block-write-file)
365 (setq before-change-function 'ediff-before-change-guard)
366 ;; add control-buffer to the list of sessions 363 ;; add control-buffer to the list of sessions
367 (or (memq control-buffer ediff-this-buffer-control-sessions) 364 (or (memq control-buffer ediff-this-buffer-control-sessions)
368 (setq ediff-this-buffer-control-sessions 365 (setq ediff-this-buffer-control-sessions
369 (cons control-buffer 366 (cons control-buffer
370 ediff-this-buffer-control-sessions))) 367 ediff-this-buffer-control-sessions)))
379 (ediff-make-current-diff-overlay 'A) 376 (ediff-make-current-diff-overlay 'A)
380 (ediff-make-current-diff-overlay 'B) 377 (ediff-make-current-diff-overlay 'B)
381 (if ediff-3way-job 378 (if ediff-3way-job
382 (ediff-make-current-diff-overlay 'C)) 379 (ediff-make-current-diff-overlay 'C))
383 380
384 (if window-system 381 (if (ediff-window-display-p)
385 (ediff-init-var-faces)) 382 (ediff-init-var-faces))
386 383
387 (ediff-setup-windows buffer-A buffer-B buffer-C control-buffer) 384 (ediff-setup-windows buffer-A buffer-B buffer-C control-buffer)
388 385
389 (let ((shift-A (ediff-overlay-start 386 (let ((shift-A (ediff-overlay-start
422 (ediff-eval-in-buffer ediff-custom-diff-buffer 419 (ediff-eval-in-buffer ediff-custom-diff-buffer
423 (let ((proc (get-buffer-process (current-buffer)))) 420 (let ((proc (get-buffer-process (current-buffer))))
424 (while (and (processp proc) 421 (while (and (processp proc)
425 (eq (process-status proc) 'run)) 422 (eq (process-status proc) 'run))
426 (message "Waiting for the diff program to quit") 423 (message "Waiting for the diff program to quit")
427 (sleep-for 1) 424 (sleep-for 1))
428 )
429 (message "") 425 (message "")
430 ))) 426 )))
431 427
432 (run-hooks 'startup-hooks 'ediff-startup-hooks) 428 (run-hooks 'startup-hooks 'ediff-startup-hooks)
433 (ediff-refresh-mode-lines) 429 (ediff-refresh-mode-lines)
434 (setq buffer-read-only t)))) 430 (setq buffer-read-only t))
431 control-buffer))
435 432
436 433
437 ;; This function assumes that we are in the window where control buffer is 434 ;; This function assumes that we are in the window where control buffer is
438 ;; to reside. 435 ;; to reside.
439 (defun ediff-setup-control-buffer (ctl-buf) 436 (defun ediff-setup-control-buffer (ctl-buf)
440 "Set up window for control buffer." 437 "Set up window for control buffer."
441 (if (window-dedicated-p (selected-window)) 438 (if (window-dedicated-p (selected-window))
442 (set-buffer ctl-buf) ; we are in control frame but just in case 439 (set-buffer ctl-buf) ; we are in control frame but just in case
443 (switch-to-buffer ctl-buf)) 440 (switch-to-buffer ctl-buf))
444 (let ((window-min-height 1)) 441 (let ((window-min-height 2))
445 (erase-buffer) 442 (erase-buffer)
446 (ediff-set-help-message) 443 (ediff-set-help-message)
447 (insert ediff-help-message) 444 (insert ediff-help-message)
448 (shrink-window-if-larger-than-buffer) 445 (shrink-window-if-larger-than-buffer)
449 (if (not ediff-multiframe) 446 (or (ediff-multiframe-setup-p)
450 (ediff-indent-help-message)) 447 (ediff-indent-help-message))
451 (set-buffer-modified-p nil) 448 (set-buffer-modified-p nil)
452 (ediff-refresh-mode-lines) 449 (ediff-refresh-mode-lines)
453 (setq ediff-control-window (selected-window)) 450 (setq ediff-control-window (selected-window))
454 (setq ediff-window-config-saved 451 (setq ediff-window-config-saved
455 (format "%S%S%S%S%S" 452 (format "%S%S%S%S%S%S%S"
456 ediff-control-window 453 ediff-control-window
457 ediff-window-A 454 ediff-window-A
458 ediff-window-B 455 ediff-window-B
459 ediff-window-C 456 ediff-window-C
460 ediff-split-window-function)) 457 ediff-split-window-function
458 (ediff-multiframe-setup-p)
459 ediff-wide-display-p))
461 (goto-char (point-min)) 460 (goto-char (point-min))
462 (skip-chars-forward ediff-whitespace))) 461 (skip-chars-forward ediff-whitespace)))
463 462
464 ;; assuming we are in control window, calculate length of the first line in 463 ;; assuming we are in control window, calculate length of the first line in
465 ;; help message 464 ;; help message
471 (end-of-line) 470 (end-of-line)
472 (current-column))) 471 (current-column)))
473 472
474 473
475 (defun ediff-indent-help-message () 474 (defun ediff-indent-help-message ()
476 (let* ((shift (/ (max 0 (- (ediff-frame-width (ediff-selected-frame)) 475 (let* ((shift (/ (max 0 (- (window-width (selected-window))
477 (ediff-help-message-line-length))) 476 (ediff-help-message-line-length)))
478 2)) 477 2))
479 (str (make-string shift ?\ ))) 478 (str (make-string shift ?\ )))
480 (save-excursion 479 (save-excursion
481 (goto-char (point-min)) 480 (goto-char (point-min))
492 (consp ediff-long-help-message-custom))) 491 (consp ediff-long-help-message-custom)))
493 (funcall ediff-long-help-message-custom)) 492 (funcall ediff-long-help-message-custom))
494 (ediff-word-mode 493 (ediff-word-mode
495 (concat ediff-long-help-message-head 494 (concat ediff-long-help-message-head
496 ediff-long-help-message-word-mode 495 ediff-long-help-message-word-mode
496 ediff-long-help-message-tail))
497 (ediff-narrow-job
498 (concat ediff-long-help-message-head
499 ediff-long-help-message-narrow2
497 ediff-long-help-message-tail)) 500 ediff-long-help-message-tail))
498 (ediff-merge-job 501 (ediff-merge-job
499 (concat ediff-long-help-message-head 502 (concat ediff-long-help-message-head
500 ediff-long-help-message-merge 503 ediff-long-help-message-merge
501 ediff-long-help-message-tail)) 504 ediff-long-help-message-tail))
657 "Bring the highlighted region of all buffers being compared into view. 660 "Bring the highlighted region of all buffers being compared into view.
658 Reestablish the default three-window display." 661 Reestablish the default three-window display."
659 (interactive) 662 (interactive)
660 663
661 ;; force all minibuffer to display ediff's messages. 664 ;; force all minibuffer to display ediff's messages.
662 ;; when xemacs implements minibufferless screens, this won't be necessary 665 ;; when xemacs implements minibufferless frames, this won't be necessary
663 (if ediff-xemacs-p (setq synchronize-minibuffers t)) 666 (if ediff-xemacs-p (setq synchronize-minibuffers t))
664 667
665 (setq ediff-disturbed-overlays nil) ; clear after use 668 (setq ediff-disturbed-overlays nil) ; clear after use
666 (let (buffer-read-only) 669 (let (buffer-read-only)
667 (if (and (ediff-buffer-live-p ediff-buffer-A) 670 (if (and (ediff-buffer-live-p ediff-buffer-A)
668 (ediff-buffer-live-p ediff-buffer-B) 671 (ediff-buffer-live-p ediff-buffer-B)
669 (or (not ediff-3way-job) 672 (or (not ediff-3way-job)
670 (ediff-buffer-live-p ediff-buffer-C)) 673 (ediff-buffer-live-p ediff-buffer-C)))
671 )
672 (ediff-setup-windows 674 (ediff-setup-windows
673 ediff-buffer-A ediff-buffer-B ediff-buffer-C ediff-control-buffer) 675 ediff-buffer-A ediff-buffer-B ediff-buffer-C ediff-control-buffer)
674 (or (eq this-command 'ediff-quit) 676 (or (eq this-command 'ediff-quit)
675 (message 677 (message
676 "You've killed an essential Ediff buffer---Please quit Ediff" 678 "You've killed an essential Ediff buffer---Please quit Ediff"
679 681
680 ;; set visibility range appropriate to this invocation of Ediff. 682 ;; set visibility range appropriate to this invocation of Ediff.
681 (ediff-visible-region) 683 (ediff-visible-region)
682 684
683 ;; raise 685 ;; raise
684 (if (and window-system 686 (if (and (ediff-window-display-p)
685 (symbolp this-command) 687 (symbolp this-command)
686 (symbolp last-command) 688 (symbolp last-command)
687 ;; Either one of the display-changing commands 689 ;; Either one of the display-changing commands
688 (or (memq this-command 690 (or (memq this-command
689 '(ediff-recenter 691 '(ediff-recenter
697 ediff-jump-to-difference-at-point)) 699 ediff-jump-to-difference-at-point))
698 (not (string-match "^ediff-" (symbol-name last-command))) 700 (not (string-match "^ediff-" (symbol-name last-command)))
699 ))) 701 )))
700 (progn 702 (progn
701 (if (window-live-p ediff-window-A) 703 (if (window-live-p ediff-window-A)
702 (ediff-raise-frame (ediff-window-frame ediff-window-A))) 704 (raise-frame (window-frame ediff-window-A)))
703 (if (window-live-p ediff-window-B) 705 (if (window-live-p ediff-window-B)
704 (ediff-raise-frame (ediff-window-frame ediff-window-B))) 706 (raise-frame (window-frame ediff-window-B)))
705 (if (window-live-p ediff-window-C) 707 (if (window-live-p ediff-window-C)
706 (ediff-raise-frame (ediff-window-frame ediff-window-C))))) 708 (raise-frame (window-frame ediff-window-C)))))
707 (if (and window-system 709 (if (and (ediff-window-display-p)
708 (ediff-frame-live-p ediff-control-frame) 710 (frame-live-p ediff-control-frame)
709 (not (ediff-frame-iconified-p ediff-control-frame))) 711 (not (ediff-frame-iconified-p ediff-control-frame)))
710 (ediff-raise-frame ediff-control-frame)) 712 (raise-frame ediff-control-frame))
711 713
712 ;; Redisplay whatever buffers are showing, if there is a selected difference 714 ;; Redisplay whatever buffers are showing, if there is a selected difference
713 (let* ((control-frame ediff-control-frame) 715 (let* ((control-frame ediff-control-frame)
714 (control-buf ediff-control-buffer)) 716 (control-buf ediff-control-buffer))
715 (if (and (ediff-buffer-live-p ediff-buffer-A) 717 (if (and (ediff-buffer-live-p ediff-buffer-A)
717 (or (not ediff-3way-job) 719 (or (not ediff-3way-job)
718 (ediff-buffer-live-p ediff-buffer-C)) 720 (ediff-buffer-live-p ediff-buffer-C))
719 (ediff-valid-difference-p)) 721 (ediff-valid-difference-p))
720 (progn 722 (progn
721 (or no-rehighlight 723 (or no-rehighlight
722 (ediff-operate-on-flags 'insert)) 724 (ediff-select-difference ediff-current-difference))
723 725
724 (ediff-recenter-one-window 'A) 726 (ediff-recenter-one-window 'A)
725 (ediff-recenter-one-window 'B) 727 (ediff-recenter-one-window 'B)
726 (if ediff-3way-job 728 (if ediff-3way-job
727 (ediff-recenter-one-window 'C)) 729 (ediff-recenter-one-window 'C))
728 730
729 (if (and (ediff-multiframe-setup-p) 731 (if (and (ediff-multiframe-setup-p)
730 (not (ediff-frame-iconified-p ediff-control-frame))) 732 (not (ediff-frame-iconified-p ediff-control-frame)))
731 (progn 733 (progn
732 (set-mouse-position control-frame 1 0) 734 (ediff-reset-mouse control-frame)
733 (if (ediff-check-version '< 19 11 'xemacs) (sit-for 0))
734 (or ediff-xemacs-p 735 (or ediff-xemacs-p
735 (cond ((eq window-system 'ns) 736 (cond ((eq (ediff-device-type) 'ns)
736 (unfocus-frame (selected-frame))) 737 (unfocus-frame (selected-frame)))
737 (t (unfocus-frame)))) 738 (t (unfocus-frame))))
738 )) 739 ))
739 )) 740 ))
740 (ediff-eval-in-buffer control-buf 741 (ediff-eval-in-buffer control-buf
749 (shift (ediff-overlay-start 750 (shift (ediff-overlay-start
750 (ediff-get-value-according-to-buffer-type 751 (ediff-get-value-according-to-buffer-type
751 buf-type ediff-narrow-bounds))) 752 buf-type ediff-narrow-bounds)))
752 (job-name ediff-job-name) 753 (job-name ediff-job-name)
753 (control-buf ediff-control-buffer) 754 (control-buf ediff-control-buffer)
754 (before-flag-shift
755 (if (eq ediff-highlighting-style 'ascii)
756 (1- (length
757 (symbol-value
758 (intern (format "ediff-before-flag-%S" buf-type)))))
759 0))
760 (after-flag-shift
761 (if (eq ediff-highlighting-style 'ascii)
762 (1- (length
763 (symbol-value
764 (intern (format "ediff-after-flag-%S" buf-type)))))
765 0))
766 (window-name (intern (format "ediff-window-%S" buf-type))) 755 (window-name (intern (format "ediff-window-%S" buf-type)))
767 (window (if (window-live-p (symbol-value window-name)) 756 (window (if (window-live-p (symbol-value window-name))
768 (symbol-value window-name)))) 757 (symbol-value window-name))))
769 758
770 (if (and window (eq job-name 'ediff-windows)) 759 (if (and window ediff-windows-job)
771 (set-window-start window 760 (set-window-start window shift))
772 (- shift before-flag-shift)))
773 (if window 761 (if window
774 (progn 762 (progn
775 (select-window window) 763 (select-window window)
776 (ediff-deactivate-mark) 764 (ediff-deactivate-mark)
777 (ediff-position-region 765 (ediff-position-region
778 (- (ediff-get-diff-posn buf-type 'beg nil control-buf) 766 (ediff-get-diff-posn buf-type 'beg nil control-buf)
779 before-flag-shift) 767 (ediff-get-diff-posn buf-type 'end nil control-buf)
780 (+ (ediff-get-diff-posn buf-type 'end nil control-buf)
781 after-flag-shift)
782 (ediff-get-diff-posn buf-type 'beg nil control-buf) 768 (ediff-get-diff-posn buf-type 'beg nil control-buf)
783 job-name 769 job-name
784 ))) 770 )))
785 (select-window ctl-wind) 771 (select-window ctl-wind)
786 )) 772 ))
792 Does nothing if file-A and file-B are in different frames." 778 Does nothing if file-A and file-B are in different frames."
793 (interactive) 779 (interactive)
794 (let* ((wind-A (if (window-live-p ediff-window-A) ediff-window-A)) 780 (let* ((wind-A (if (window-live-p ediff-window-A) ediff-window-A))
795 (wind-B (if (window-live-p ediff-window-B) ediff-window-B)) 781 (wind-B (if (window-live-p ediff-window-B) ediff-window-B))
796 (wind-C (if (window-live-p ediff-window-C) ediff-window-C)) 782 (wind-C (if (window-live-p ediff-window-C) ediff-window-C))
797 (frame-A (if wind-A (ediff-window-frame wind-A))) 783 (frame-A (if wind-A (window-frame wind-A)))
798 (frame-B (if wind-B (ediff-window-frame wind-B))) 784 (frame-B (if wind-B (window-frame wind-B)))
799 (frame-C (if wind-C (ediff-window-frame wind-C)))) 785 (frame-C (if wind-C (window-frame wind-C))))
800 (if (or (eq frame-A frame-B) 786 (if (or (eq frame-A frame-B)
801 (not (ediff-frame-live-p frame-A)) 787 (not (frame-live-p frame-A))
802 (not (ediff-frame-live-p frame-B)) 788 (not (frame-live-p frame-B))
803 (if ediff-3way-comparison-job 789 (if ediff-3way-comparison-job
804 (or (not (ediff-frame-live-p frame-C)) 790 (or (not (frame-live-p frame-C))
805 (eq frame-A frame-C) (eq frame-B frame-C)))) 791 (eq frame-A frame-C) (eq frame-B frame-C))))
806 (setq ediff-split-window-function 792 (setq ediff-split-window-function
807 (if (eq ediff-split-window-function 'split-window-vertically) 793 (if (eq ediff-split-window-function 'split-window-vertically)
808 'split-window-horizontally 794 'split-window-horizontally
809 'split-window-vertically)) 795 'split-window-vertically))
812 798
813 (defun ediff-toggle-hilit () 799 (defun ediff-toggle-hilit ()
814 "Switch between highlighting using ASCII flags and highlighting using faces. 800 "Switch between highlighting using ASCII flags and highlighting using faces.
815 On a dumb terminal, switches between ASCII highlighting and no highlighting." 801 On a dumb terminal, switches between ASCII highlighting and no highlighting."
816 (interactive) 802 (interactive)
817 (if (not window-system) 803 (if (not (ediff-window-display-p))
818 (if (eq ediff-highlighting-style 'ascii) 804 (if (eq ediff-highlighting-style 'ascii)
819 (progn 805 (progn
820 (message "ASCII highlighting flags removed") 806 (message "ASCII highlighting flags removed")
821 (ediff-unselect-and-select-difference ediff-current-difference 807 (ediff-unselect-and-select-difference ediff-current-difference
822 'unselect-only) 808 'unselect-only)
854 (copy-face 'default 'ediff-even-diff-face-B-var) 840 (copy-face 'default 'ediff-even-diff-face-B-var)
855 (copy-face 'default 'ediff-even-diff-face-C-var)) 841 (copy-face 'default 'ediff-even-diff-face-C-var))
856 842
857 (ediff-unselect-and-select-difference 843 (ediff-unselect-and-select-difference
858 ediff-current-difference 'select-only)) 844 ediff-current-difference 'select-only))
859 (ediff-operate-on-flags 'insert)
860 ) 845 )
861 846
862 (defun ediff-toggle-autorefine () 847 (defun ediff-toggle-autorefine ()
863 "Toggle auto-refine mode." 848 "Toggle auto-refine mode."
864 (interactive) 849 (interactive)
903 888
904 (setq ediff-window-config-saved "") ; force redisplay 889 (setq ediff-window-config-saved "") ; force redisplay
905 (ediff-recenter 'no-rehighlight)) 890 (ediff-recenter 'no-rehighlight))
906 891
907 892
908 ;; Optional argument, BUF, is passed only in a startup hook. 893 ;; If BUF, this is the buffer to toggle, not current buffer.
909 (defun ediff-toggle-read-only (&optional buff) 894 (defun ediff-toggle-read-only (&optional buf)
910 "Toggles read-only in buffers being compared. 895 "Toggle read-only in current buffer.
911 If buffer is under version control and locked, check it out first." 896 If buffer is under version control and locked, check it out first.
897 If optional argument BUF is specified, toggle read-only in that buffer instead
898 of the current buffer."
912 (interactive) 899 (interactive)
913 900 (let ((ctl-buf (if (null buf) (current-buffer))))
914 (or buff (ediff-recenter)) 901 (or buf (ediff-recenter))
915 902 (or buf
916 ;; eval in buf A/B/C 903 (setq buf
917 (ediff-eval-in-buffer 904 (ediff-get-buffer (ediff-char-to-buftype last-command-char))))
918 (or buff (ediff-get-buffer (ediff-char-to-buftype last-command-char))) 905
919 (let* ((file (buffer-file-name (current-buffer))) 906 (ediff-eval-in-buffer buf ; eval in buf A/B/C
920 (file-writable (and file (file-writable-p file))) 907 (let* ((file (buffer-file-name buf))
921 (toggle-ro-cmd (cond (ediff-toggle-read-only-function) 908 (file-writable (and file
922 (ediff-file-checked-out-flag 'toggle-read-only) 909 (file-exists-p file)
923 (file-writable 'toggle-read-only) 910 (file-writable-p file)))
924 (t (key-binding "\C-x\C-q"))))) 911 (toggle-ro-cmd (cond (ediff-toggle-read-only-function)
925 (if (and toggle-ro-cmd 912 ((ediff-file-checked-out-p file)
926 (string-match "toggle-read-only" (symbol-name toggle-ro-cmd))) 913 'toggle-read-only)
927 (save-excursion 914 (file-writable 'toggle-read-only)
928 (save-window-excursion 915 (t (key-binding "\C-x\C-q")))))
929 (setq ediff-file-checked-out-flag t) 916 ;; If the file is checked in, make sure we don't make buffer modifiable
930 (command-execute toggle-ro-cmd))) 917 ;; without warning the user. The user can fool our checks by making the
931 (error "Don't know how to toggle read-only in buffer %S" 918 ;; buffer non-RO without checking the file out. We regard this as a
932 (current-buffer))) 919 ;; user problem.
933 ;; Check if we made the current buffer updatable, but its file is RO. 920 (if (and (ediff-file-checked-in-p file)
934 ;; Signal a warning in this case. 921 ;; If ctl-buf is null, this means we called this
935 (if (and file (not buffer-read-only) 922 ;; non-interactively, in which case don't ask questions
936 (eq this-command 'ediff-toggle-read-only) 923 ctl-buf)
937 (not file-writable)) 924 (cond ((not buffer-read-only)
938 (message "Warning: file %s is read-only" 925 (setq toggle-ro-cmd 'toggle-read-only))
939 (abbreviate-file-name file) (beep 1))) 926 ((and (or (beep 1) t) ; always beep
940 ))) 927 (y-or-n-p
928 (format
929 "File %s is under version control. Check it out? "
930 (abbreviate-file-name file))))
931 ;; if we checked the file out, we should also change the
932 ;; original state of buffer-read-only to nil. If we don't
933 ;; do this, the mode line will show %%, since the file was
934 ;; RO before ediff started, so the user will think the file
935 ;; is checked in.
936 (ediff-eval-in-buffer ctl-buf
937 (ediff-change-saved-variable
938 'buffer-read-only nil
939 (ediff-char-to-buftype last-command-char))))
940 (t
941 (setq toggle-ro-cmd 'toggle-read-only)
942 (beep 1) (beep 1)
943 (message
944 "Boy, this is risky! Better don't change this file...")
945 (sit-for 3))))
946 (if (and toggle-ro-cmd
947 (string-match "toggle-read-only" (symbol-name toggle-ro-cmd)))
948 (save-excursion
949 (save-window-excursion
950 (command-execute toggle-ro-cmd)))
951 (error "Don't know how to toggle read-only in buffer %S" buf))
952
953 ;; Check if we made the current buffer updatable, but its file is RO.
954 ;; Signal a warning in this case.
955 (if (and file (not buffer-read-only)
956 (eq this-command 'ediff-toggle-read-only)
957 (file-exists-p file)
958 (not (file-writable-p file)))
959 (message "Warning: file %s is read-only"
960 (abbreviate-file-name file) (beep 1)))
961 ))))
962
963
964 ;; This is a simple-minded check for whether a file is under version control
965 ;; and is checked out.
966 ;; If file,v exists but file doesn't, this file is considered to be not checked
967 ;; in and not checked out for the purpose of patching (since patch won't be
968 ;; able to read such a file anyway).
969 ;; FILE is a string representing file name
970 (defsubst ediff-file-checked-out-p (file)
971 (and (stringp file)
972 (file-exists-p file)
973 (file-writable-p file)
974 (file-exists-p (concat file ",v"))))
975 (defsubst ediff-file-checked-in-p (file)
976 (and (stringp file)
977 (file-exists-p file)
978 (not (file-writable-p file))
979 (file-exists-p (concat file ",v"))))
941 980
942 (defun ediff-swap-buffers () 981 (defun ediff-swap-buffers ()
943 "Rotate the display of buffers A, B, and C." 982 "Rotate the display of buffers A, B, and C."
944 (interactive) 983 (interactive)
945 (if (and (window-live-p ediff-window-A) (window-live-p ediff-window-B)) 984 (if (and (window-live-p ediff-window-A) (window-live-p ediff-window-B))
946 (let ((buf ediff-buffer-A) 985 (let ((buf ediff-buffer-A)
947 (values ediff-buffer-A-values-orig) 986 (values ediff-buffer-values-orig-A)
948 (diff-vec ediff-difference-vector-A) 987 (diff-vec ediff-difference-vector-A)
949 (hide-regexp ediff-regexp-hide-A) 988 (hide-regexp ediff-regexp-hide-A)
950 (focus-regexp ediff-regexp-focus-A) 989 (focus-regexp ediff-regexp-focus-A)
951 (wide-visibility-p (eq ediff-visible-bounds ediff-wide-bounds)) 990 (wide-visibility-p (eq ediff-visible-bounds ediff-wide-bounds))
952 (overlay (if window-system ediff-current-diff-overlay-A)) 991 (overlay (if (ediff-window-display-p)
953 ) 992 ediff-current-diff-overlay-A)))
954 (if ediff-3way-comparison-job 993 (if ediff-3way-comparison-job
955 (progn 994 (progn
956 (set-window-buffer ediff-window-A ediff-buffer-C) 995 (set-window-buffer ediff-window-A ediff-buffer-C)
957 (set-window-buffer ediff-window-B ediff-buffer-A) 996 (set-window-buffer ediff-window-B ediff-buffer-A)
958 (set-window-buffer ediff-window-C ediff-buffer-B) 997 (set-window-buffer ediff-window-C ediff-buffer-B)
967 (setq ediff-buffer-A ediff-buffer-B 1006 (setq ediff-buffer-A ediff-buffer-B
968 ediff-buffer-B buf)) 1007 ediff-buffer-B buf))
969 1008
970 ;; swap saved buffer characteristics 1009 ;; swap saved buffer characteristics
971 (if ediff-3way-comparison-job 1010 (if ediff-3way-comparison-job
972 (setq ediff-buffer-A-values-orig ediff-buffer-C-values-orig 1011 (setq ediff-buffer-values-orig-A ediff-buffer-values-orig-C
973 ediff-buffer-C-values-orig ediff-buffer-B-values-orig 1012 ediff-buffer-values-orig-C ediff-buffer-values-orig-B
974 ediff-buffer-B-values-orig values) 1013 ediff-buffer-values-orig-B values)
975 (setq ediff-buffer-A-values-orig ediff-buffer-B-values-orig 1014 (setq ediff-buffer-values-orig-A ediff-buffer-values-orig-B
976 ediff-buffer-B-values-orig values)) 1015 ediff-buffer-values-orig-B values))
977 1016
978 ;; swap diff vectors 1017 ;; swap diff vectors
979 (if ediff-3way-comparison-job 1018 (if ediff-3way-comparison-job
980 (setq ediff-difference-vector-A ediff-difference-vector-C 1019 (setq ediff-difference-vector-A ediff-difference-vector-C
981 ediff-difference-vector-C ediff-difference-vector-B 1020 ediff-difference-vector-C ediff-difference-vector-B
996 ediff-regexp-focus-A ediff-regexp-focus-B 1035 ediff-regexp-focus-A ediff-regexp-focus-B
997 ediff-regexp-focus-B focus-regexp)) 1036 ediff-regexp-focus-B focus-regexp))
998 1037
999 ;; The following is needed for XEmacs, since there one can't move 1038 ;; The following is needed for XEmacs, since there one can't move
1000 ;; overlay to another buffer. In Emacs, this swap is redundant. 1039 ;; overlay to another buffer. In Emacs, this swap is redundant.
1001 (if window-system 1040 (if (ediff-window-display-p)
1002 (if ediff-3way-comparison-job 1041 (if ediff-3way-comparison-job
1003 (setq ediff-current-diff-overlay-A ediff-current-diff-overlay-C 1042 (setq ediff-current-diff-overlay-A ediff-current-diff-overlay-C
1004 ediff-current-diff-overlay-C ediff-current-diff-overlay-B 1043 ediff-current-diff-overlay-C ediff-current-diff-overlay-B
1005 ediff-current-diff-overlay-B overlay) 1044 ediff-current-diff-overlay-B overlay)
1006 (setq ediff-current-diff-overlay-A ediff-current-diff-overlay-B 1045 (setq ediff-current-diff-overlay-A ediff-current-diff-overlay-B
1044 1083
1045 (defun ediff-toggle-wide-display () 1084 (defun ediff-toggle-wide-display ()
1046 "Toggle wide/regular display. 1085 "Toggle wide/regular display.
1047 This is especially useful when comparing buffers side-by-side." 1086 This is especially useful when comparing buffers side-by-side."
1048 (interactive) 1087 (interactive)
1049 (or window-system 1088 (or (ediff-window-display-p)
1050 (error "Emacs is not running as a window application")) 1089 (error "%sEmacs is not running as a window application"
1090 (if ediff-emacs-p "" "X")))
1051 (ediff-recenter 'no-rehighlight) ; make sure buffs are displayed in windows 1091 (ediff-recenter 'no-rehighlight) ; make sure buffs are displayed in windows
1052 (let ((ctl-buf ediff-control-buffer)) 1092 (let ((ctl-buf ediff-control-buffer))
1053 (setq ediff-wide-display-p (not ediff-wide-display-p)) 1093 (setq ediff-wide-display-p (not ediff-wide-display-p))
1054 (if (not ediff-wide-display-p) 1094 (if (not ediff-wide-display-p)
1055 (ediff-eval-in-buffer ctl-buf 1095 (ediff-eval-in-buffer ctl-buf
1056 (ediff-modify-frame-parameters 1096 (modify-frame-parameters
1057 ediff-wide-display-frame ediff-wide-display-orig-parameters) 1097 ediff-wide-display-frame ediff-wide-display-orig-parameters)
1058 (sit-for (if ediff-xemacs-p 0.4 0)) 1098 (sit-for (if ediff-xemacs-p 0.4 0))
1059 ;; restore control buf, since ctl window may have been deleted 1099 ;; restore control buf, since ctl window may have been deleted
1060 ;; during resizing 1100 ;; during resizing
1061 (set-buffer ctl-buf) 1101 (set-buffer ctl-buf)
1070 1110
1071 (defun ediff-toggle-multiframe () 1111 (defun ediff-toggle-multiframe ()
1072 "Switch from the multiframe display to single-frame display and back. 1112 "Switch from the multiframe display to single-frame display and back.
1073 This is primarily for debugging, but one can use it for fun, too." 1113 This is primarily for debugging, but one can use it for fun, too."
1074 (interactive) 1114 (interactive)
1075 (if (ediff-check-version '< 19 12 'xemacs) 1115 (or (ediff-window-display-p)
1076 (error "This command doesn't work under XEmacs 19.11 and earlier")) 1116 (error "%sEmacs is not running as a window application"
1077 (or window-system 1117 (if ediff-emacs-p "" "X")))
1078 (error "Emacs is not running as a window application"))
1079 (cond ((eq ediff-window-setup-function 'ediff-setup-windows-multiframe) 1118 (cond ((eq ediff-window-setup-function 'ediff-setup-windows-multiframe)
1080 (setq ediff-window-setup-function 'ediff-setup-windows-plain)) 1119 (setq ediff-window-setup-function 'ediff-setup-windows-plain))
1081 ((eq ediff-window-setup-function 'ediff-setup-windows-plain) 1120 ((eq ediff-window-setup-function 'ediff-setup-windows-plain)
1082 (setq ediff-window-setup-function 'ediff-setup-windows-multiframe))) 1121 (setq ediff-window-setup-function 'ediff-setup-windows-multiframe)))
1083 (setq ediff-window-B nil) 1122 (setq ediff-window-B nil)
1109 (setq ediff-visible-bounds ediff-wide-bounds)) 1148 (setq ediff-visible-bounds ediff-wide-bounds))
1110 (ediff-recenter 'no-rehighlight)) 1149 (ediff-recenter 'no-rehighlight))
1111 1150
1112 ;; Narrow bufs A/B/C to ediff-visible-bounds. If this is currently set to 1151 ;; Narrow bufs A/B/C to ediff-visible-bounds. If this is currently set to
1113 ;; ediff-wide-bounds, then this actually widens. 1152 ;; ediff-wide-bounds, then this actually widens.
1114 ;; This function does nothing if job-name is not ediff-small/large-regions or 1153 ;; This function does nothing if job-name is not
1115 ;; ediff-windows. 1154 ;; ediff-regions-wordwise/linewise or ediff-windows-wordwise/linewise.
1116 ;; Does nothing if buffer-A = buffer-B since we can't narrow 1155 ;; Does nothing if buffer-A = buffer-B since we can't narrow
1117 ;; to two different regions in one buffer. 1156 ;; to two different regions in one buffer.
1118 (defun ediff-visible-region () 1157 (defun ediff-visible-region ()
1119 (if (or (eq ediff-buffer-A ediff-buffer-B) 1158 (if (or (eq ediff-buffer-A ediff-buffer-B)
1120 (eq ediff-buffer-A ediff-buffer-C) 1159 (eq ediff-buffer-A ediff-buffer-C)
1121 (eq ediff-buffer-C ediff-buffer-B)) 1160 (eq ediff-buffer-C ediff-buffer-B))
1122 () 1161 ()
1123 ;; If ediff-*-regions/windows, ediff-visible-bounds is already set 1162 ;; If ediff-*-regions/windows, ediff-visible-bounds is already set
1124 ;; Otherwise, always use full range. 1163 ;; Otherwise, always use full range.
1125 (if (not ediff-word-mode-job) 1164 (if (not ediff-narrow-job)
1126 (setq ediff-visible-bounds ediff-wide-bounds)) 1165 (setq ediff-visible-bounds ediff-wide-bounds))
1127 (let ((overl-A (ediff-get-value-according-to-buffer-type 1166 (let ((overl-A (ediff-get-value-according-to-buffer-type
1128 'A ediff-visible-bounds)) 1167 'A ediff-visible-bounds))
1129 (overl-B (ediff-get-value-according-to-buffer-type 1168 (overl-B (ediff-get-value-according-to-buffer-type
1130 'B ediff-visible-bounds)) 1169 'B ediff-visible-bounds))
1279 ;;JOB-NAME holds ediff-job-name. Ediff-windows job positions regions 1318 ;;JOB-NAME holds ediff-job-name. Ediff-windows job positions regions
1280 ;;differently. 1319 ;;differently.
1281 (defun ediff-position-region (beg end pos job-name) 1320 (defun ediff-position-region (beg end pos job-name)
1282 (if (> end (point-max)) 1321 (if (> end (point-max))
1283 (setq end (point-max))) 1322 (setq end (point-max)))
1284 (if (eq job-name 'ediff-windows) 1323 (if ediff-windows-job
1285 (if (pos-visible-in-window-p end) 1324 (if (pos-visible-in-window-p end)
1286 () ; do nothing, wind is already positioned 1325 () ; do nothing, wind is already positioned
1287 ;; at this point, windows are positioned at the beginning of the 1326 ;; at this point, windows are positioned at the beginning of the
1288 ;; file regions (not diff-regions) being compared. 1327 ;; file regions (not diff-regions) being compared.
1289 (save-excursion 1328 (save-excursion
1291 (let ((amount (+ 2 (count-lines (point) end)))) 1330 (let ((amount (+ 2 (count-lines (point) end))))
1292 (scroll-up amount)))) 1331 (scroll-up amount))))
1293 (set-window-start (selected-window) beg) 1332 (set-window-start (selected-window) beg)
1294 (if (pos-visible-in-window-p end) 1333 (if (pos-visible-in-window-p end)
1295 ;; Determine the number of lines that the region occupies 1334 ;; Determine the number of lines that the region occupies
1296 (let ((lines 0)) 1335 (let ((lines 0)
1297 (while (> end (progn 1336 (prev-point 0))
1298 (move-to-window-line lines) 1337 (while ( and (> end (progn
1299 (point))) 1338 (move-to-window-line lines)
1339 (point)))
1340 ;; `end' may be beyond the window bottom, so check
1341 ;; that we are making progres
1342 (< prev-point (point)))
1343 (setq prev-point (point))
1300 (setq lines (1+ lines))) 1344 (setq lines (1+ lines)))
1301 ;; And position the beginning on the right line 1345 ;; And position the beginning on the right line
1302 (goto-char beg) 1346 (goto-char beg)
1303 (recenter (/ (1+ (max (- (1- (window-height (selected-window))) 1347 (recenter (/ (1+ (max (- (1- (window-height (selected-window)))
1304 lines) 1348 lines)
1314 With a prefix argument, go back that many differences." 1358 With a prefix argument, go back that many differences."
1315 (interactive "P") 1359 (interactive "P")
1316 (if (< ediff-current-difference ediff-number-of-differences) 1360 (if (< ediff-current-difference ediff-number-of-differences)
1317 (let ((n (min ediff-number-of-differences 1361 (let ((n (min ediff-number-of-differences
1318 (+ ediff-current-difference (if arg arg 1)))) 1362 (+ ediff-current-difference (if arg arg 1))))
1319 regexp-skip buffer-read-only) 1363 regexp-skip)
1320 1364
1321 (or (>= n ediff-number-of-differences) 1365 (or (>= n ediff-number-of-differences)
1322 (setq regexp-skip (funcall ediff-skip-diff-region-function n)) 1366 (setq regexp-skip (funcall ediff-skip-diff-region-function n))
1323 (ediff-install-fine-diff-if-necessary n)) 1367 (ediff-install-fine-diff-if-necessary n))
1324 (while (and (< n ediff-number-of-differences) 1368 (while (and (< n ediff-number-of-differences)
1337 (message "Skipped over region %d and counting ..." n)) 1381 (message "Skipped over region %d and counting ..." n))
1338 (or (>= n ediff-number-of-differences) 1382 (or (>= n ediff-number-of-differences)
1339 (setq regexp-skip (funcall ediff-skip-diff-region-function n)) 1383 (setq regexp-skip (funcall ediff-skip-diff-region-function n))
1340 (ediff-install-fine-diff-if-necessary n)) 1384 (ediff-install-fine-diff-if-necessary n))
1341 ) 1385 )
1342 1386 (message "")
1343 (ediff-unselect-and-select-difference n) 1387 (ediff-unselect-and-select-difference n)
1344 ) ; let 1388 ) ; let
1345 (ediff-visible-region) 1389 (ediff-visible-region)
1346 (error "At end of the difference list"))) 1390 (error "At end of the difference list")))
1347 1391
1349 "Go to the previous difference. 1393 "Go to the previous difference.
1350 With a prefix argument, go back that many differences." 1394 With a prefix argument, go back that many differences."
1351 (interactive "P") 1395 (interactive "P")
1352 (if (> ediff-current-difference -1) 1396 (if (> ediff-current-difference -1)
1353 (let ((n (max -1 (- ediff-current-difference (if arg arg 1)))) 1397 (let ((n (max -1 (- ediff-current-difference (if arg arg 1))))
1354 regexp-skip buffer-read-only) 1398 regexp-skip)
1355 1399
1356 (or (< n 0) 1400 (or (< n 0)
1357 (setq regexp-skip (funcall ediff-skip-diff-region-function n)) 1401 (setq regexp-skip (funcall ediff-skip-diff-region-function n))
1358 (ediff-install-fine-diff-if-necessary n)) 1402 (ediff-install-fine-diff-if-necessary n))
1359 (while (and (> n -1) 1403 (while (and (> n -1)
1372 (setq n (1- n)) 1416 (setq n (1- n))
1373 (or (< n 0) 1417 (or (< n 0)
1374 (setq regexp-skip (funcall ediff-skip-diff-region-function n)) 1418 (setq regexp-skip (funcall ediff-skip-diff-region-function n))
1375 (ediff-install-fine-diff-if-necessary n)) 1419 (ediff-install-fine-diff-if-necessary n))
1376 ) 1420 )
1421 (message "")
1377 (ediff-unselect-and-select-difference n) 1422 (ediff-unselect-and-select-difference n)
1378 ) ; let 1423 ) ; let
1379 (ediff-visible-region) 1424 (ediff-visible-region)
1380 (error "At beginning of the difference list"))) 1425 (error "At beginning of the difference list")))
1381 1426
1382 (defun ediff-jump-to-difference (difference-number) 1427 (defun ediff-jump-to-difference (difference-number)
1383 "Go to the difference specified as a prefix argument." 1428 "Go to the difference specified as a prefix argument."
1384 (interactive "p") 1429 (interactive "p")
1385 (let (buffer-read-only) 1430 (setq difference-number (1- difference-number))
1386 (setq difference-number (1- difference-number)) 1431 (if (and (>= difference-number -1)
1387 (if (and (>= difference-number -1) 1432 (< difference-number (1+ ediff-number-of-differences)))
1388 (< difference-number (1+ ediff-number-of-differences))) 1433 (ediff-unselect-and-select-difference difference-number)
1389 (ediff-unselect-and-select-difference difference-number) 1434 (error "Bad difference number, %d" difference-number)))
1390 (error "Bad difference number, %d" difference-number))))
1391 1435
1392 (defun ediff-jump-to-difference-at-point () 1436 (defun ediff-jump-to-difference-at-point ()
1393 "Go to difference closest to the point in buffer A, B, or C. 1437 "Go to difference closest to the point in buffer A, B, or C.
1394 The type of buffer depends on last command character \(a, b, or c\) that 1438 The type of buffer depends on last command character \(a, b, or c\) that
1395 invoked this command." 1439 invoked this command."
1396 (interactive) 1440 (interactive)
1397 (let ((buf-type (ediff-char-to-buftype last-command-char)) 1441 (let ((buf-type (ediff-char-to-buftype last-command-char)))
1398 buffer-read-only)
1399 (ediff-jump-to-difference (ediff-diff-at-point buf-type)))) 1442 (ediff-jump-to-difference (ediff-diff-at-point buf-type))))
1400 1443
1401 1444
1402 ;; find region most related to the current point position (or POS, if given) 1445 ;; find region most related to the current point position (or POS, if given)
1403 (defun ediff-diff-at-point (buf-type &optional pos) 1446 (defun ediff-diff-at-point (buf-type &optional pos)
1468 (three-way ediff-3way-job) 1511 (three-way ediff-3way-job)
1469 messg 1512 messg
1470 ediff-verbose-p 1513 ediff-verbose-p
1471 reg-to-delete reg-to-delete-beg reg-to-delete-end) 1514 reg-to-delete reg-to-delete-beg reg-to-delete-end)
1472 1515
1473 (ediff-operate-on-flags 'remove)
1474 (setq reg-to-delete-beg 1516 (setq reg-to-delete-beg
1475 (ediff-get-diff-posn to-buf-type 'beg n ctrl-buf)) 1517 (ediff-get-diff-posn to-buf-type 'beg n ctrl-buf))
1476 (setq reg-to-delete-end 1518 (setq reg-to-delete-end
1477 (ediff-get-diff-posn to-buf-type 'end n ctrl-buf)) 1519 (ediff-get-diff-posn to-buf-type 'end n ctrl-buf))
1478 1520
1486 1528
1487 (setq ediff-disturbed-overlays nil) ; clear before use 1529 (setq ediff-disturbed-overlays nil) ; clear before use
1488 1530
1489 (if (string= reg-to-delete reg-to-copy) 1531 (if (string= reg-to-delete reg-to-copy)
1490 (setq saved-p nil) ; refuse to copy identical buffers 1532 (setq saved-p nil) ; refuse to copy identical buffers
1491 ;;; (progn ; refuse to copy identical buffers
1492 ;;; (setq saved-p nil)
1493 ;;; (or batch-invocation
1494 ;;; (message
1495 ;;; "Region %d in buffer %S is identical to that in buffer %S"
1496 ;;; (1+ n) from-buf-type to-buf-type (ding))))
1497 ;; seems ok to copy 1533 ;; seems ok to copy
1498 (if (or batch-invocation (ediff-test-save-region n to-buf-type)) 1534 (if (or batch-invocation (ediff-test-save-region n to-buf-type))
1499 (condition-case conds 1535 (condition-case conds
1500 (progn 1536 (progn
1501 (ediff-eval-in-buffer to-buf 1537 (ediff-eval-in-buffer to-buf
1502 ;; to prevent flags from interfering if buffer is writable 1538 ;; to prevent flags from interfering if buffer is writable
1503 (let ((inhibit-read-only (null buffer-read-only)) 1539 (let ((inhibit-read-only (null buffer-read-only)))
1504 before-change-function)
1505 ;; these two insert a dummy char to overcome a bug in 1540 ;; these two insert a dummy char to overcome a bug in
1506 ;; XEmacs, which sometimes prevents 0-length extents 1541 ;; XEmacs, which sometimes prevents 0-length extents
1507 ;; from sensing insertion at its end-points. 1542 ;; from sensing insertion at its end-points.
1508 (if ediff-xemacs-p 1543 (if ediff-xemacs-p
1509 (progn 1544 (progn
1516 ;; delete the dummy char "@" 1551 ;; delete the dummy char "@"
1517 (if ediff-xemacs-p 1552 (if ediff-xemacs-p
1518 (delete-char 1)) 1553 (delete-char 1))
1519 1554
1520 (if ediff-xemacs-p 1555 (if ediff-xemacs-p
1521 (progn 1556 (if (> reg-to-delete-end reg-to-delete-beg)
1522 (ediff-collect-extents-xemacs reg-to-delete-beg) 1557 (kill-region reg-to-delete-beg
1523 (if (> reg-to-delete-end reg-to-delete-beg) 1558 reg-to-delete-end))
1524 (progn
1525 (kill-region reg-to-delete-beg
1526 reg-to-delete-end)
1527 (if (string= reg-to-copy "")
1528 (ediff-adjust-disturbed-extents-xemacs
1529 reg-to-delete-beg)))))
1530 (if (> reg-to-delete-end reg-to-delete-beg) 1559 (if (> reg-to-delete-end reg-to-delete-beg)
1531 (kill-region reg-to-delete-beg reg-to-delete-end) 1560 (kill-region reg-to-delete-beg reg-to-delete-end)
1532 (ediff-move-disturbed-overlays reg-to-delete-beg) 1561 (ediff-move-disturbed-overlays reg-to-delete-beg)
1533 )) 1562 ))
1534 )) 1563 ))
1545 ))) 1574 )))
1546 ) 1575 )
1547 1576
1548 ;; adjust state of difference in case 3-way and diff was copied ok 1577 ;; adjust state of difference in case 3-way and diff was copied ok
1549 (if (and saved-p three-way) 1578 (if (and saved-p three-way)
1550 (ediff-set-state-of-all-diffs-in-all-buffers ctrl-buf)) 1579 (ediff-set-state-of-diff-in-all-buffers n ctrl-buf))
1551 1580
1552 (if batch-invocation 1581 (if batch-invocation
1553 (ediff-clear-fine-differences n) 1582 (ediff-clear-fine-differences n)
1554 ;; If diff3 job, we should recompute fine diffs so we clear them 1583 ;; If diff3 job, we should recompute fine diffs so we clear them
1555 ;; before reinserting flags (and thus before ediff-recenter). 1584 ;; before reinserting flags (and thus before ediff-recenter).
1556 (if (and saved-p three-way) 1585 (if (and saved-p three-way)
1557 (ediff-clear-fine-differences n)) 1586 (ediff-clear-fine-differences n))
1558 (ediff-operate-on-flags 'insert) 1587
1588 (ediff-refresh-mode-lines)
1589
1559 ;; For diff2 jobs, don't recompute fine diffs, since we know there 1590 ;; For diff2 jobs, don't recompute fine diffs, since we know there
1560 ;; aren't any. So we clear diffs after ediff-recenter. 1591 ;; aren't any. So we clear diffs after ediff-recenter.
1561 (if (and saved-p (not three-way)) 1592 (if (and saved-p (not three-way))
1562 (ediff-clear-fine-differences n)) 1593 (ediff-clear-fine-differences n))
1563 ;; Make sure that the message about saving and how to restore is seen 1594 ;; Make sure that the message about saving and how to restore is seen
1618 (setq saved-diff (cdr saved-rec)) 1649 (setq saved-diff (cdr saved-rec))
1619 (if (> ediff-number-of-differences 0) 1650 (if (> ediff-number-of-differences 0)
1620 (error "Nothing saved for diff %d in buffer %S" (1+ n) buf-type) 1651 (error "Nothing saved for diff %d in buffer %S" (1+ n) buf-type)
1621 (error "No differences found"))) 1652 (error "No differences found")))
1622 1653
1623 (ediff-operate-on-flags 'remove)
1624
1625 (setq reg-beg (ediff-get-diff-posn buf-type 'beg n ediff-control-buffer)) 1654 (setq reg-beg (ediff-get-diff-posn buf-type 'beg n ediff-control-buffer))
1626 (setq reg-end (ediff-get-diff-posn buf-type 'end n ediff-control-buffer)) 1655 (setq reg-end (ediff-get-diff-posn buf-type 'end n ediff-control-buffer))
1627 (setq ediff-disturbed-overlays nil) ; clear before use 1656 (setq ediff-disturbed-overlays nil) ; clear before use
1628 1657
1629 (condition-case conds 1658 (condition-case conds
1630 (ediff-eval-in-buffer buf 1659 (ediff-eval-in-buffer buf
1631 (let ((inhibit-read-only (null buffer-read-only)) 1660 (let ((inhibit-read-only (null buffer-read-only)))
1632 (before-change-function nil))
1633 ;; these two insert a dummy char to overcome a bug in XEmacs, 1661 ;; these two insert a dummy char to overcome a bug in XEmacs,
1634 ;; which sometimes prevents 0-length extents from sensing 1662 ;; which sometimes prevents 0-length extents from sensing
1635 ;; insertion at its end-points. 1663 ;; insertion at its end-points.
1636 (if ediff-xemacs-p 1664 (if ediff-xemacs-p
1637 (progn 1665 (progn
1644 ;; delete dummy char 1672 ;; delete dummy char
1645 (if ediff-xemacs-p 1673 (if ediff-xemacs-p
1646 (delete-char 1)) 1674 (delete-char 1))
1647 1675
1648 (if ediff-xemacs-p 1676 (if ediff-xemacs-p
1649 (progn 1677 (if (> reg-end reg-beg)
1650 (ediff-collect-extents-xemacs reg-beg) 1678 (kill-region reg-beg reg-end))
1651 (if (> reg-end reg-beg)
1652 (progn
1653 (kill-region reg-beg reg-end)
1654 (if (string= saved-diff "")
1655 (ediff-adjust-disturbed-extents-xemacs reg-beg)))))
1656 (if (> reg-end reg-beg) 1679 (if (> reg-end reg-beg)
1657 (kill-region reg-beg reg-end) 1680 (kill-region reg-beg reg-end)
1658 (ediff-move-disturbed-overlays reg-beg) 1681 (ediff-move-disturbed-overlays reg-beg)
1659 )) 1682 ))
1660 1683
1663 (error (message "ediff-pop-diff: %s %s" 1686 (error (message "ediff-pop-diff: %s %s"
1664 (car conds) 1687 (car conds)
1665 (mapconcat 'prin1-to-string (cdr conds) " ")) 1688 (mapconcat 'prin1-to-string (cdr conds) " "))
1666 (beep 1))) 1689 (beep 1)))
1667 1690
1668 ;; Clearing fine diffs is necessary in order for ediff-operate-on-flags 1691 ;; Clearing fine diffs is necessary for
1669 ;; to properly recompute them. We can't rely on ediff-copy-diff on 1692 ;; ediff-unselect-and-select-difference to properly recompute them. We
1670 ;; clearing this vector because the user might have modified diff 1693 ;; can't rely on ediff-copy-diff to clear this vector, as the user might
1671 ;; regions after copying and may have recomputed fine diffs. 1694 ;; have modified diff regions after copying and, thus, may have recomputed
1695 ;; fine diffs.
1672 (if recovered 1696 (if recovered
1673 (ediff-clear-fine-differences n)) 1697 (ediff-clear-fine-differences n))
1674 1698
1675 ;; adjust state of difference 1699 ;; adjust state of difference
1676 (if (and three-way recovered) 1700 (if (and three-way recovered)
1677 (ediff-set-state-of-diff-in-all-buffers n ctl-buf)) 1701 (ediff-set-state-of-diff-in-all-buffers n ctl-buf))
1678 1702
1679 (ediff-operate-on-flags 'insert) 1703 (ediff-refresh-mode-lines)
1704
1680 (if recovered 1705 (if recovered
1681 (progn 1706 (progn
1682 (setq n-th-record (delq saved-rec n-th-record)) 1707 (setq n-th-record (delq saved-rec n-th-record))
1683 (message "Diff region %d in buffer %S restored" (1+ n) buf-type) 1708 (message "Diff region %d in buffer %S restored" (1+ n) buf-type)
1684 )) 1709 ))
1898 (ediff-really-quit))) 1923 (ediff-really-quit)))
1899 1924
1900 1925
1901 ;; Perform the quit operations. 1926 ;; Perform the quit operations.
1902 (defun ediff-really-quit () 1927 (defun ediff-really-quit ()
1903 (ediff-restore-buffer-characteristics t) ; restore as they were at setup
1904 (ediff-unhighlight-diffs-totally) 1928 (ediff-unhighlight-diffs-totally)
1905 (ediff-clear-diff-vector 'ediff-difference-vector-A 'fine-diffs-also) 1929 (ediff-clear-diff-vector 'ediff-difference-vector-A 'fine-diffs-also)
1906 (ediff-clear-diff-vector 'ediff-difference-vector-B 'fine-diffs-also) 1930 (ediff-clear-diff-vector 'ediff-difference-vector-B 'fine-diffs-also)
1907 (ediff-clear-diff-vector 'ediff-difference-vector-C 'fine-diffs-also) 1931 (ediff-clear-diff-vector 'ediff-difference-vector-C 'fine-diffs-also)
1908 1932
1926 (if (ediff-overlayp overl) 1950 (if (ediff-overlayp overl)
1927 (ediff-delete-overlay overl)))) 1951 (ediff-delete-overlay overl))))
1928 ediff-narrow-bounds) 1952 ediff-narrow-bounds)
1929 1953
1930 ;; restore buffer mode line id's in buffer-A/B/C 1954 ;; restore buffer mode line id's in buffer-A/B/C
1931 ;; much of what is here, except for mode line, will be deleted when Emacs
1932 ;; acquires before/after-string overlay properties
1933 (let ((control-buffer ediff-control-buffer)) 1955 (let ((control-buffer ediff-control-buffer))
1934 (condition-case nil 1956 (condition-case nil
1935 (ediff-eval-in-buffer ediff-buffer-A 1957 (ediff-eval-in-buffer ediff-buffer-A
1936 (setq before-change-function nil)
1937 (setq ediff-this-buffer-control-sessions 1958 (setq ediff-this-buffer-control-sessions
1938 (delq control-buffer ediff-this-buffer-control-sessions)) 1959 (delq control-buffer ediff-this-buffer-control-sessions))
1939 (if (null ediff-this-buffer-control-sessions)
1940 (setq local-write-file-hooks
1941 (delq 'ediff-block-write-file local-write-file-hooks)))
1942 (kill-local-variable 'ediff-file-checked-out-flag)
1943 (kill-local-variable 'mode-line-buffer-identification) 1960 (kill-local-variable 'mode-line-buffer-identification)
1944 (kill-local-variable 'mode-line-format) 1961 (kill-local-variable 'mode-line-format)
1945 ) 1962 )
1946 (error)) 1963 (error))
1947 1964
1948 (condition-case nil 1965 (condition-case nil
1949 (ediff-eval-in-buffer ediff-buffer-B 1966 (ediff-eval-in-buffer ediff-buffer-B
1950 (setq ediff-this-buffer-control-sessions 1967 (setq ediff-this-buffer-control-sessions
1951 (delq control-buffer ediff-this-buffer-control-sessions)) 1968 (delq control-buffer ediff-this-buffer-control-sessions))
1952 (if (null ediff-this-buffer-control-sessions)
1953 (setq local-write-file-hooks
1954 (delq 'ediff-block-write-file local-write-file-hooks)))
1955 (setq before-change-function nil)
1956 (kill-local-variable 'ediff-file-checked-out-flag)
1957 (kill-local-variable 'mode-line-buffer-identification) 1969 (kill-local-variable 'mode-line-buffer-identification)
1958 (kill-local-variable 'mode-line-format) 1970 (kill-local-variable 'mode-line-format)
1959 ) 1971 )
1960 (error)) 1972 (error))
1961 1973
1962 (condition-case nil 1974 (condition-case nil
1963 (ediff-eval-in-buffer ediff-buffer-C 1975 (ediff-eval-in-buffer ediff-buffer-C
1964 (if (null ediff-this-buffer-control-sessions)
1965 (setq local-write-file-hooks
1966 (delq 'ediff-block-write-file local-write-file-hooks)))
1967 (setq before-change-function nil)
1968 (kill-local-variable 'ediff-file-checked-out-flag)
1969 (kill-local-variable 'mode-line-buffer-identification) 1976 (kill-local-variable 'mode-line-buffer-identification)
1970 (kill-local-variable 'mode-line-format) 1977 (kill-local-variable 'mode-line-format)
1971 ) 1978 )
1972 (error)) 1979 (error))
1973 ) 1980 )
1974 ;; restore state of buffers to what it was before ediff 1981 ;; restore state of buffers to what it was before ediff
1975 (ediff-restore-protected-variables) 1982 (ediff-restore-protected-variables)
1983 ;; good place to kill buffers A/B/C
1984 (run-hooks 'ediff-cleanup-hooks)
1976 (run-hooks 'ediff-quit-hooks)) 1985 (run-hooks 'ediff-quit-hooks))
1977 1986
1978 1987
1979 (defun ediff-delete-temp-files () 1988 (defun ediff-delete-temp-files ()
1980 (if (stringp ediff-temp-file-A) 1989 (if (stringp ediff-temp-file-A)
2002 (ediff-kill-buffer-carefully ediff-error-buffer) 2011 (ediff-kill-buffer-carefully ediff-error-buffer)
2003 (ediff-kill-buffer-carefully ediff-patch-diagnostics) 2012 (ediff-kill-buffer-carefully ediff-patch-diagnostics)
2004 (ediff-kill-buffer-carefully ediff-msg-buffer) 2013 (ediff-kill-buffer-carefully ediff-msg-buffer)
2005 (ediff-kill-buffer-carefully ediff-debug-buffer) 2014 (ediff-kill-buffer-carefully ediff-debug-buffer)
2006 2015
2007 ;; XEmacs 19.11 has a bug (?) that doesn't let us delete buffer in 2016 ;;(redraw-display)
2008 ;; dedicated window. So, we delete the frame first. 2017 (if (and (ediff-window-display-p) (frame-live-p ctl-frame))
2009 (redraw-display) 2018 (delete-frame ctl-frame))
2010 (if (and window-system (ediff-frame-live-p ctl-frame))
2011 (ediff-delete-frame ctl-frame))
2012 (ediff-kill-buffer-carefully ctl-buf) 2019 (ediff-kill-buffer-carefully ctl-buf)
2013 2020
2014 (delete-other-windows) 2021 (delete-other-windows)
2015 2022
2016 ;; display only if not visible 2023 ;; display only if not visible
2035 (switch-to-buffer buff-C) 2042 (switch-to-buffer buff-C)
2036 (balance-windows))) 2043 (balance-windows)))
2037 (error))) 2044 (error)))
2038 (message "") 2045 (message "")
2039 )) 2046 ))
2040 2047
2048 (defun ediff-janitor ()
2049 "Kill buffers A, B, and, possibly, C, if these buffers aren't modified.
2050 In merge jobs, buffer C is never deleted.
2051 However, the side effect of cleaning up may be that you cannot compare the same
2052 buffer in two separate Ediff sessions: quitting one of them will delete this
2053 buffer in another session as well."
2054 (or (not (ediff-buffer-live-p ediff-buffer-A))
2055 (buffer-modified-p ediff-buffer-A)
2056 (ediff-kill-buffer-carefully ediff-buffer-A))
2057 (or (not (ediff-buffer-live-p ediff-buffer-B))
2058 (buffer-modified-p ediff-buffer-B)
2059 (ediff-kill-buffer-carefully ediff-buffer-B))
2060 (if ediff-merge-job ; don't del buf C if merging--del ancestor buf instead
2061 (or (not (ediff-buffer-live-p ediff-ancestor-buffer))
2062 (buffer-modified-p ediff-ancestor-buffer)
2063 (ediff-kill-buffer-carefully ediff-ancestor-buffer))
2064 (or (not (ediff-buffer-live-p ediff-buffer-C))
2065 (buffer-modified-p ediff-buffer-C)
2066 (ediff-kill-buffer-carefully ediff-buffer-C))))
2067
2041 ;; The default way of suspending Ediff. 2068 ;; The default way of suspending Ediff.
2042 ;; Buries Ediff buffers, kills all windows. 2069 ;; Buries Ediff buffers, kills all windows.
2043 (defun ediff-default-suspend-hook () 2070 (defun ediff-default-suspend-hook ()
2044 (let* ((buf-A ediff-buffer-A) 2071 (let* ((buf-A ediff-buffer-A)
2045 (buf-B ediff-buffer-B) 2072 (buf-B ediff-buffer-B)
2053 (buf-diff ediff-diff-buffer) 2080 (buf-diff ediff-diff-buffer)
2054 (buf-custom-diff ediff-custom-diff-buffer) 2081 (buf-custom-diff ediff-custom-diff-buffer)
2055 (buf-fine-diff ediff-fine-diff-buffer)) 2082 (buf-fine-diff ediff-fine-diff-buffer))
2056 2083
2057 ;; hide the control panel 2084 ;; hide the control panel
2058 (if (and window-system (ediff-frame-live-p ediff-control-frame)) 2085 (if (and (ediff-window-display-p) (frame-live-p ediff-control-frame))
2059 (ediff-iconify-frame ediff-control-frame) 2086 (iconify-frame ediff-control-frame)
2060 (bury-buffer)) 2087 (bury-buffer))
2061 (if buf-err (bury-buffer buf-err)) 2088 (if buf-err (bury-buffer buf-err))
2062 (if buf-diff (bury-buffer buf-diff)) 2089 (if buf-diff (bury-buffer buf-diff))
2063 (if buf-custom-diff (bury-buffer buf-custom-diff)) 2090 (if buf-custom-diff (bury-buffer buf-custom-diff))
2064 (if buf-fine-diff (bury-buffer buf-fine-diff)) 2091 (if buf-fine-diff (bury-buffer buf-fine-diff))
2171 2198
2172 (princ 2199 (princ
2173 (format "\nBugs/suggestions: type `%s' while in Ediff Control Panel." 2200 (format "\nBugs/suggestions: type `%s' while in Ediff Control Panel."
2174 (substitute-command-keys "\\[ediff-submit-report]"))) 2201 (substitute-command-keys "\\[ediff-submit-report]")))
2175 )) 2202 ))
2176 2203
2204 (defun ediff-documentation ()
2205 "Jump to Ediff's Info file."
2206 (interactive)
2207 (let ((ctl-window ediff-control-window)
2208 (ctl-buf ediff-control-buffer))
2209
2210 (ediff-skip-unsuitable-frames)
2211 (condition-case nil
2212 (progn
2213 (pop-to-buffer (get-buffer-create "*info*"))
2214 (info "ediff")
2215 (message "Type `i' to search for a specific topic"))
2216 (error (beep 1)
2217 (with-output-to-temp-buffer " *ediff-info*"
2218 (princ (format "
2219 The Info file for Ediff does not seem to be installed.
2220
2221 This file is part of the distribution of %sEmacs.
2222 Please contact your system administrator. "
2223 (if ediff-xemacs-p "X" ""))))
2224 (if (window-live-p ctl-window)
2225 (progn
2226 (select-window ctl-window)
2227 (switch-to-buffer ctl-buf)))))))
2228
2177 2229
2178 2230
2179 2231
2180 ;;; Support routines 2232 ;;; Support routines
2181 2233
2185 (defun ediff-select-difference (n) 2237 (defun ediff-select-difference (n)
2186 (if (and (ediff-buffer-live-p ediff-buffer-A) 2238 (if (and (ediff-buffer-live-p ediff-buffer-A)
2187 (ediff-buffer-live-p ediff-buffer-B) 2239 (ediff-buffer-live-p ediff-buffer-B)
2188 (ediff-valid-difference-p n)) 2240 (ediff-valid-difference-p n))
2189 (progn 2241 (progn
2190 (ediff-remember-buffer-characteristics) 2242 (if (and (ediff-window-display-p) ediff-use-faces)
2191 (if (and window-system ediff-use-faces)
2192 (progn 2243 (progn
2193 (ediff-highlight-diff n) 2244 (ediff-highlight-diff n)
2194 (setq ediff-highlighting-style 'face)) 2245 (setq ediff-highlighting-style 'face))
2195 (setq ediff-highlighting-style 'ascii) 2246 (setq ediff-highlighting-style 'ascii)
2196 (ediff-place-flags-in-buffer 'A ediff-buffer-A 2247 (ediff-place-flags-in-buffer
2197 ediff-control-buffer n) 2248 'A ediff-buffer-A ediff-control-buffer n)
2198 (ediff-place-flags-in-buffer 'B ediff-buffer-B 2249 (ediff-place-flags-in-buffer
2199 ediff-control-buffer n) 2250 'B ediff-buffer-B ediff-control-buffer n)
2200 (if ediff-3way-job 2251 (if ediff-3way-job
2201 (ediff-place-flags-in-buffer 'C ediff-buffer-C 2252 (ediff-place-flags-in-buffer
2202 ediff-control-buffer n)) 2253 'C ediff-buffer-C ediff-control-buffer n))
2203 ) 2254 )
2204 2255
2205 (ediff-install-fine-diff-if-necessary n) 2256 (ediff-install-fine-diff-if-necessary n)
2206
2207 (ediff-restore-buffer-characteristics)
2208 (run-hooks 'ediff-select-hooks)))) 2257 (run-hooks 'ediff-select-hooks))))
2209 2258
2210 2259
2211 ;; Unselect a difference by removing the ASCII flags in the buffers. 2260 ;; Unselect a difference by removing the ASCII flags in the buffers.
2212 ;; This may have to be modified for buffer C, when it will be supported. 2261 ;; This may have to be modified for buffer C, when it will be supported.
2213 (defun ediff-unselect-difference (n) 2262 (defun ediff-unselect-difference (n)
2214 (if (ediff-valid-difference-p n) 2263 (if (ediff-valid-difference-p n)
2215 (progn 2264 (progn
2216 (ediff-remember-buffer-characteristics) 2265 (cond ((and (ediff-window-display-p) ediff-use-faces)
2217
2218 (cond ((and window-system ediff-use-faces)
2219 (ediff-unhighlight-diff)) 2266 (ediff-unhighlight-diff))
2220 ((eq ediff-highlighting-style 'ascii) 2267 ((eq ediff-highlighting-style 'ascii)
2221 (ediff-remove-flags-from-buffer 2268 (ediff-remove-flags-from-buffer
2222 ediff-buffer-A 2269 ediff-buffer-A
2223 (ediff-get-diff-overlay n 'A) 2270 (ediff-get-diff-overlay n 'A))
2224 (ediff-get-diff-posn 'A 'beg n)
2225 (ediff-get-diff-posn 'A 'end n)
2226 ediff-before-flag-A ediff-after-flag-A)
2227 (ediff-remove-flags-from-buffer 2271 (ediff-remove-flags-from-buffer
2228 ediff-buffer-B 2272 ediff-buffer-B
2229 (ediff-get-diff-overlay n 'B) 2273 (ediff-get-diff-overlay n 'B))
2230 (ediff-get-diff-posn 'B 'beg n)
2231 (ediff-get-diff-posn 'B 'end n)
2232 ediff-before-flag-B ediff-after-flag-B)
2233 (if ediff-3way-job 2274 (if ediff-3way-job
2234 (ediff-remove-flags-from-buffer 2275 (ediff-remove-flags-from-buffer
2235 ediff-buffer-C 2276 ediff-buffer-C
2236 (ediff-get-diff-overlay n 'C) 2277 (ediff-get-diff-overlay n 'C)))
2237 (ediff-get-diff-posn 'C 'beg n)
2238 (ediff-get-diff-posn 'C 'end n)
2239 ediff-before-flag-C ediff-after-flag-C))
2240 )) 2278 ))
2241
2242 (ediff-restore-buffer-characteristics)
2243 (setq ediff-highlighting-style nil) 2279 (setq ediff-highlighting-style nil)
2244 2280
2245 ;; unhighlight fine diffs 2281 ;; unhighlight fine diffs
2246 (ediff-set-fine-diff-properties ediff-current-difference 'default) 2282 (ediff-set-fine-diff-properties ediff-current-difference 'default)
2247
2248 (run-hooks 'ediff-unselect-hooks)))) 2283 (run-hooks 'ediff-unselect-hooks))))
2249 2284
2250 2285
2251 ;; Unselects prev diff and selects a new one, if FLAG has value other than 2286 ;; Unselects prev diff and selects a new one, if FLAG has value other than
2252 ;; 'select-only or 'unselect-only. If FLAG is 'select-only, the 2287 ;; 'select-only or 'unselect-only. If FLAG is 'select-only, the
2253 ;; next difference is selected, but the current selection is not 2288 ;; next difference is selected, but the current selection is not
2254 ;; unselected. If FLAG is 'unselect-only then the current selection is 2289 ;; unselected. If FLAG is 'unselect-only then the current selection is
2255 ;; unselected, but the next one is not selected. If NO-RECENTER is non-nil, 2290 ;; unselected, but the next one is not selected. If NO-RECENTER is non-nil,
2256 ;; don't recenter buffers after selecting/unselecting. 2291 ;; don't recenter buffers after selecting/unselecting.
2257 ;; 2292 ;;
2258 ;; Don't use `ediff-select-difference' and `ediff-unselect-difference'
2259 ;; directly, since this will screw up the undo info in the presence of
2260 ;; ASCII flags.
2261 ;; Instead, use `ediff-unselect-and-select-difference' with appropriate
2262 ;; flags.
2263
2264 (defun ediff-unselect-and-select-difference (n &optional flag no-recenter) 2293 (defun ediff-unselect-and-select-difference (n &optional flag no-recenter)
2265 (let (;; save buf modified info 2294 (let ((ediff-current-difference n))
2266 (control-buf ediff-control-buffer) 2295 (or no-recenter
2267 (buf-A-modified (buffer-modified-p ediff-buffer-A)) 2296 (ediff-recenter 'no-rehighlight)))
2268 (buf-B-modified (buffer-modified-p ediff-buffer-B))
2269 ;; temporarily disable undo so highlighting won't confuse the user
2270 buf-C-modified buf-A-undo buf-B-undo buf-C-undo)
2271
2272 (let ((ediff-current-difference n))
2273 (or no-recenter
2274 (ediff-recenter 'no-rehighlight)))
2275 2297
2276 (if (and (ediff-buffer-live-p ediff-buffer-A) 2298 (let ((control-buf ediff-control-buffer))
2277 (ediff-buffer-live-p ediff-buffer-B)) 2299 (unwind-protect
2278 (progn
2279 (ediff-eval-in-buffer ediff-buffer-A
2280 (setq buf-A-undo buffer-undo-list))
2281 (ediff-eval-in-buffer ediff-buffer-B
2282 (setq buf-B-undo buffer-undo-list))
2283 (buffer-disable-undo ediff-buffer-A)
2284 (buffer-disable-undo ediff-buffer-B)))
2285
2286 (if (ediff-buffer-live-p ediff-buffer-C)
2287 (progn
2288 (setq buf-C-modified (buffer-modified-p ediff-buffer-C))
2289 (ediff-eval-in-buffer ediff-buffer-C
2290 (setq buf-C-undo buffer-undo-list))
2291 (buffer-disable-undo ediff-buffer-C)))
2292
2293 (unwind-protect ; we don't want to lose undo info due to error
2294 (progn 2300 (progn
2295 (or (eq flag 'select-only) 2301 (or (eq flag 'select-only)
2296 (ediff-unselect-difference ediff-current-difference)) 2302 (ediff-unselect-difference ediff-current-difference))
2297
2298 ;; Auto-save buffers while Ediff flags are temporarily removed.
2299 (ediff-eval-in-buffer ediff-buffer-A
2300 (if buf-A-modified (do-auto-save)))
2301 (ediff-eval-in-buffer ediff-buffer-B
2302 (if buf-B-modified (do-auto-save)))
2303 (if (ediff-buffer-live-p ediff-buffer-C)
2304 (ediff-eval-in-buffer ediff-buffer-C
2305 (if buf-C-modified (do-auto-save))))
2306 2303
2307 (or (eq flag 'unselect-only) 2304 (or (eq flag 'unselect-only)
2308 (ediff-select-difference n)) 2305 (ediff-select-difference n))
2309 (setq ediff-current-difference n) 2306 (setq ediff-current-difference n)
2310 ) ; end protected section 2307 ) ; end protected section
2311 2308
2312 (ediff-eval-in-buffer control-buf 2309 (ediff-eval-in-buffer control-buf
2313 (ediff-refresh-mode-lines) 2310 (ediff-refresh-mode-lines))
2314 ;; restore undo and buffer-modified info
2315 (ediff-eval-in-buffer ediff-buffer-A
2316 (set-buffer-modified-p buf-A-modified)
2317 (setq buffer-undo-list buf-A-undo)))
2318 (ediff-eval-in-buffer control-buf
2319 (ediff-eval-in-buffer ediff-buffer-B
2320 (set-buffer-modified-p buf-B-modified)
2321 (setq buffer-undo-list buf-B-undo)))
2322 (if (ediff-buffer-live-p ediff-buffer-C)
2323 (ediff-eval-in-buffer control-buf
2324 (ediff-eval-in-buffer ediff-buffer-C
2325 (set-buffer-modified-p buf-C-modified)
2326 (setq buffer-undo-list buf-C-undo))))
2327 ))) 2311 )))
2328 2312
2329 2313
2330 (defun ediff-read-file-name (prompt default-dir default-file) 2314 (defun ediff-read-file-name (prompt default-dir default-file)
2331 ; This is a modified version of a similar function in `emerge.el'. 2315 ; This is a modified version of a similar function in `emerge.el'.
2358 (if default-file 2342 (if default-file
2359 (concat " (default " default-file ")") 2343 (concat " (default " default-file ")")
2360 "")) 2344 ""))
2361 default-dir 2345 default-dir
2362 default-file 2346 default-file
2363 'confirm 2347 t ; must match, no-confirm
2364 (if default-file (file-name-directory default-file)) 2348 (if default-file (file-name-directory default-file))
2365 ) 2349 )
2366 default-dir 2350 default-dir
2367 )) 2351 ))
2368 ;; If user enters a directory name, expand the default file in that 2352 ;; If user enters a directory name, expand the default file in that
2375 f)) 2359 f))
2376 2360
2377 ;; If `prefix' is given, then it is used as a prefix for the temp file 2361 ;; If `prefix' is given, then it is used as a prefix for the temp file
2378 ;; name. Otherwise, `_buffer-name' is used. If `file' is given, use this 2362 ;; name. Otherwise, `_buffer-name' is used. If `file' is given, use this
2379 ;; file and don't create a new one. 2363 ;; file and don't create a new one.
2364 ;; Also, save buffer from START to END in the file.
2365 ;; START defaults to (point-min), END to (point-max)
2380 (defun ediff-make-temp-file (&optional prefix given-file start end) 2366 (defun ediff-make-temp-file (&optional prefix given-file start end)
2381 (let ((f (or given-file 2367 (let ((f (or given-file
2382 (make-temp-name (concat 2368 (make-temp-name (concat
2383 ediff-temp-file-prefix 2369 ediff-temp-file-prefix
2384 (if prefix 2370 (if prefix
2440 (erase-buffer)) 2426 (erase-buffer))
2441 (revert-buffer t t)) 2427 (revert-buffer t t))
2442 (error "Buffer out of sync for file %s" buffer-file-name)))) 2428 (error "Buffer out of sync for file %s" buffer-file-name))))
2443 2429
2444 2430
2445 ;; to be deleted in due time
2446 (defun ediff-block-write-file ()
2447 "Prevent writing files A and B directly."
2448 (if (ediff-check-for-ascii-flags)
2449 (error "Type `wa' and `wb' in Ediff Control Panel to save buffs A/B")))
2450
2451 ;; To be deleted in due time
2452 (defun ediff-before-change-guard (start end)
2453 "If buffer is highlighted with ASCII flags, remove highlighting.
2454 Arguments, START and END are not used, but are provided
2455 because this is required by `before-change-function'."
2456 (let (rehighlight-key)
2457 (save-window-excursion
2458 (mapcar
2459 (function
2460 (lambda (buf)
2461 (ediff-eval-in-buffer buf
2462 (if (eq ediff-highlighting-style 'ascii)
2463 (progn
2464 (ediff-unselect-and-select-difference
2465 ediff-current-difference
2466 'unselect-only 'no-recenter)
2467 (setq rehighlight-key
2468 (substitute-command-keys "\\[ediff-recenter]"))
2469 )))))
2470 ediff-this-buffer-control-sessions)
2471 (if rehighlight-key
2472 (error
2473 "ASCII flags removed. You can edit now. Hit `%s' to rehighlight"
2474 rehighlight-key))
2475 )))
2476
2477 2431
2478 (defun ediff-check-for-ascii-flags () 2432 (defun ediff-check-for-ascii-flags ()
2479 (eval 2433 (eval
2480 (cons 'or 2434 (cons 'or
2481 (mapcar (function (lambda (buf) 2435 (mapcar (function (lambda (buf)
2509 (defun ediff-insert-in-front (overl &optional flag beg end length) 2463 (defun ediff-insert-in-front (overl &optional flag beg end length)
2510 (if (ediff-overlay-get overl 'ediff-diff-num) 2464 (if (ediff-overlay-get overl 'ediff-diff-num)
2511 (setq ediff-disturbed-overlays 2465 (setq ediff-disturbed-overlays
2512 (cons overl ediff-disturbed-overlays)))) 2466 (cons overl ediff-disturbed-overlays))))
2513 2467
2514 ;; to be deleted in due time
2515 ;; Collects all extents at POS having property `ediff-diff-num'.
2516 ;; XEmacs causes headache by detaching empty extents, so I have to save
2517 ;; them before they disappear.
2518 (defun ediff-collect-extents-xemacs (pos)
2519 (let (lis elt)
2520 (while (setq elt (extent-at pos nil 'ediff-diff-num elt))
2521 (setq lis (cons elt lis)))
2522 (setq ediff-disturbed-overlays lis)))
2523 2468
2524 ;; to be deleted in due time 2469 ;; to be deleted in due time
2525 ;; We can't move overlays directly in insert-in-front-hooks 2470 ;; We can't move overlays directly in insert-in-front-hooks
2526 ;; because when diff is highlighted with ascii flags, they will disturb 2471 ;; because when diff is highlighted with ascii flags, they will disturb
2527 ;; overlays and so they will be included in them, which we don't want. 2472 ;; overlays and so they will be included in them, which we don't want.
2532 (ediff-overlay-end overl)) 2477 (ediff-overlay-end overl))
2533 )) 2478 ))
2534 ediff-disturbed-overlays) 2479 ediff-disturbed-overlays)
2535 (setq ediff-disturbed-overlays nil)) 2480 (setq ediff-disturbed-overlays nil))
2536 2481
2537 ;; to be deleted in due time
2538 ;; If XEmacs adds the ability to not detach extents, we should be able to
2539 ;; delete this
2540 (defun ediff-adjust-disturbed-extents-xemacs (posn)
2541 (mapcar (function (lambda (overl)
2542 (if (equal (ediff-overlay-start overl)
2543 (ediff-overlay-end overl))
2544 (ediff-move-overlay overl posn posn))))
2545 ediff-disturbed-overlays)
2546 (setq ediff-disturbed-overlays nil))
2547 2482
2548 (defun ediff-save-buffer (arg) 2483 (defun ediff-save-buffer (arg)
2549 "Safe way of saving buffers A, B, C, and the diff output. 2484 "Safe way of saving buffers A, B, C, and the diff output.
2550 `wa' saves buffer A, `wb' saves buffer B, `wc' saves buffer C, 2485 `wa' saves buffer A, `wb' saves buffer B, `wc' saves buffer C,
2551 and `wd' saves the diff output." 2486 and `wd' saves the diff output."
2552 (interactive "P") 2487 (interactive "P")
2553 (let ((hooks local-write-file-hooks)) 2488 (ediff-eval-in-buffer
2554 (ediff-unselect-and-select-difference ediff-current-difference 2489 (cond ((memq last-command-char '(?a ?b ?c))
2555 'unselect-only) 2490 (ediff-get-buffer
2556 (unwind-protect 2491 (ediff-char-to-buftype last-command-char)))
2557 (ediff-eval-in-buffer 2492 ((eq last-command-char ?d)
2558 (cond ((memq last-command-char '(?a ?b ?c)) 2493 (message "Saving diff output ...")(sit-for 1)
2559 (ediff-get-buffer 2494 (if arg ediff-diff-buffer ediff-custom-diff-buffer)
2560 (ediff-char-to-buftype last-command-char))) 2495 ))
2561 ((eq last-command-char ?d) 2496 (save-buffer)))
2562 (message "Saving diff output ...")(sit-for 1)
2563 (if arg ediff-diff-buffer ediff-custom-diff-buffer)
2564 ))
2565 ;; temporarily remove writing block
2566 (setq hooks (delq 'ediff-block-write-file hooks))
2567 (let ((local-write-file-hooks hooks))
2568 (save-buffer)))
2569 (ediff-unselect-and-select-difference ediff-current-difference
2570 'select-only)
2571 )))
2572 2497
2573 2498
2574 ;; will simplify it in due time, when emacs acquires before/after strings 2499 ;; will simplify it in due time, when emacs acquires before/after strings
2575 (defun ediff-remove-flags-from-buffer (buffer overlay before-posn after-posn 2500 (defun ediff-remove-flags-from-buffer (buffer overlay)
2576 before-flag after-flag)
2577 (ediff-eval-in-buffer buffer 2501 (ediff-eval-in-buffer buffer
2578 (let ((before-flag-length (length before-flag)) 2502 (let ((inhibit-read-only t))
2579 (after-flag-length (length after-flag))
2580 (inhibit-read-only t)
2581 buffer-read-only
2582 before-change-function)
2583 (goto-char after-posn)
2584 (setq after-posn (point-marker)) ; after-posn is now a marker
2585 ;; remove the flags, if they're there
2586 (goto-char (- before-posn before-flag-length))
2587 (if ediff-xemacs-p 2503 (if ediff-xemacs-p
2588 (ediff-overlay-put overlay 'begin-glyph nil) 2504 (ediff-overlay-put overlay 'begin-glyph nil)
2589 ;; before-string is not yet implemented in emacs. 2505 ;; before-string is not yet implemented in emacs.
2590 ;; when it will be, I will be able to delete much of the rest of 2506 ;; when it will be, I will be able to delete much of the rest of
2591 ;; this function 2507 ;; this function
2592 (ediff-overlay-put overlay 'before-string nil) 2508 (ediff-overlay-put overlay 'before-string nil))
2593 (if (looking-at (regexp-quote before-flag))
2594 (delete-region (point) (+ (point) before-flag-length))
2595 ;; flag isn't there
2596 (ding)
2597 (message "Trouble removing ASCII flag"))
2598 )
2599 2509
2600 (if ediff-xemacs-p 2510 (if ediff-xemacs-p
2601 (ediff-overlay-put overlay 'end-glyph nil) 2511 (ediff-overlay-put overlay 'end-glyph nil)
2602 ;; after-string is not yet implemented in emacs. 2512 ;; after-string is not yet implemented in emacs.
2603 (ediff-overlay-put overlay 'after-string nil) 2513 (ediff-overlay-put overlay 'after-string nil))
2604 (goto-char after-posn)
2605 (if (looking-at (regexp-quote after-flag))
2606 (delete-region (point) (+ (point) after-flag-length))
2607 ;; flag isn't there
2608 (ding)
2609 (message "Trouble removing ASCII flag"))
2610 (setq after-posn nil) ; after has become a marker--garbage-collect
2611 )
2612 ))) 2514 )))
2613 2515
2614 2516
2615 2517
2616 ;; will simplify it in due time, when emacs acquires before/after strings 2518 ;; will simplify it in due time, when emacs acquires before/after strings
2618 (ediff-eval-in-buffer buffer 2520 (ediff-eval-in-buffer buffer
2619 (ediff-place-flags-in-buffer1 buf-type ctl-buffer diff))) 2521 (ediff-place-flags-in-buffer1 buf-type ctl-buffer diff)))
2620 2522
2621 2523
2622 (defun ediff-place-flags-in-buffer1 (buf-type ctl-buffer diff-no) 2524 (defun ediff-place-flags-in-buffer1 (buf-type ctl-buffer diff-no)
2623 (let* ((before-flag-name (intern (format "ediff-before-flag-%S" buf-type))) 2525 (let* ((curr-overl (ediff-eval-in-buffer ctl-buffer
2624 (after-flag-name (intern (format "ediff-after-flag-%S" buf-type)))
2625 (curr-overl (ediff-eval-in-buffer ctl-buffer
2626 (ediff-get-diff-overlay diff-no buf-type))) 2526 (ediff-get-diff-overlay diff-no buf-type)))
2627 (inhibit-read-only t)
2628 (narrow-overlay (ediff-eval-in-buffer ctl-buffer
2629 (ediff-get-value-according-to-buffer-type
2630 buf-type ediff-narrow-bounds)))
2631 (wide-overlay (ediff-eval-in-buffer ctl-buffer
2632 (ediff-get-value-according-to-buffer-type
2633 buf-type ediff-wide-bounds)))
2634 (visibility-overlay (ediff-eval-in-buffer ctl-buffer
2635 (ediff-get-value-according-to-buffer-type
2636 buf-type ediff-visible-bounds)))
2637 (visibility-min (ediff-overlay-start visibility-overlay))
2638 (visibility-max (ediff-overlay-end visibility-overlay))
2639 (before (ediff-get-diff-posn buf-type 'beg diff-no ctl-buffer)) 2527 (before (ediff-get-diff-posn buf-type 'beg diff-no ctl-buffer))
2640 after buffer-read-only before-change-function beg-of-line flag) 2528 after beg-of-line flag)
2641
2642 ;; we need it to be a marker
2643 (setq visibility-max
2644 (move-marker
2645 (make-marker) (if (numberp visibility-max) visibility-max 1)))
2646
2647 (widen)
2648 2529
2649 ;; insert flag before the difference 2530 ;; insert flag before the difference
2650 (goto-char before) 2531 (goto-char before)
2651 (setq beg-of-line (bolp)) 2532 (setq beg-of-line (bolp))
2652 2533
2653 (setq flag (ediff-eval-in-buffer ctl-buffer 2534 (setq flag (ediff-eval-in-buffer ctl-buffer
2654 (if beg-of-line 2535 (if (eq ediff-highlighting-style 'ascii)
2655 (set before-flag-name ediff-before-flag-bol) 2536 (if beg-of-line
2656 (set before-flag-name ediff-before-flag-mol)))) 2537 ediff-before-flag-bol ediff-before-flag-mol))))
2657 2538
2658 ;; insert the flag itself 2539 ;; insert the flag itself
2659 (if ediff-xemacs-p 2540 (if ediff-xemacs-p
2660 (ediff-overlay-put curr-overl 'begin-glyph flag) 2541 (ediff-overlay-put curr-overl 'begin-glyph flag)
2661 ;; before-string is not yet implemented in emacs. 2542 (ediff-overlay-put curr-overl 'before-string flag))
2662 ;; when it will, I will be able to delete much of the rest of this
2663 ;; function
2664 ;;(ediff-overlay-put curr-overl 'before-string flag)
2665 (insert-before-markers flag)
2666 (if (or (not (numberp visibility-min)) (< before visibility-min))
2667 (setq visibility-min before))
2668 )
2669 2543
2670 ;; insert the flag after the difference 2544 ;; insert the flag after the difference
2671 ;; `after' must be set here, after the before-flag was inserted 2545 ;; `after' must be set here, after the before-flag was inserted
2672 (setq after (ediff-get-diff-posn buf-type 'end diff-no ctl-buffer)) 2546 (setq after (ediff-get-diff-posn buf-type 'end diff-no ctl-buffer))
2673 (goto-char after) 2547 (goto-char after)
2674 (setq beg-of-line (bolp)) 2548 (setq beg-of-line (bolp))
2675 2549
2676 (setq flag (ediff-eval-in-buffer ctl-buffer 2550 (setq flag (ediff-eval-in-buffer ctl-buffer
2677 (if beg-of-line 2551 (if (eq ediff-highlighting-style 'ascii)
2678 (set after-flag-name ediff-after-flag-eol) 2552 (if beg-of-line
2679 (set after-flag-name ediff-after-flag-mol)))) 2553 ediff-after-flag-eol ediff-after-flag-mol))))
2680 2554
2681 ;; insert the flag itself 2555 ;; insert the flag itself
2682 (if ediff-xemacs-p 2556 (if ediff-xemacs-p
2683 ;; In XEmacs, end-glyph of a 0-length overlay is not inserted.
2684 ;; Hopefully, this bug will be fixed in 19.12.
2685 (ediff-overlay-put curr-overl 'end-glyph flag) 2557 (ediff-overlay-put curr-overl 'end-glyph flag)
2686 ;; after-string is not yet implemented in emacs. 2558 (ediff-overlay-put curr-overl 'after-string flag))
2687 ;;(ediff-overlay-put curr-overl 'after-string flag)
2688 (insert flag)
2689 (if (> (point) visibility-max)
2690 (move-marker visibility-max (point)))
2691 )
2692 (narrow-to-region visibility-min visibility-max)
2693 (ediff-move-overlay wide-overlay
2694 (min before
2695 (ediff-overlay-start wide-overlay))
2696 (max (point)
2697 (ediff-overlay-end wide-overlay)))
2698 (ediff-move-overlay narrow-overlay
2699 (min before
2700 (ediff-overlay-start narrow-overlay))
2701 (max (point)
2702 (ediff-overlay-end narrow-overlay)))
2703
2704 (setq visibility-max nil) ; garbage-collect it
2705 )) 2559 ))
2706 2560
2707 2561
2708 (defun ediff-get-diff-posn (buf-type pos &optional n control-buf) 2562 (defun ediff-get-diff-posn (buf-type pos &optional n control-buf)
2709 "Returns positions of difference sectors in the BUF-TYPE buffer. 2563 "Returns positions of difference sectors in the BUF-TYPE buffer.
2757 (even-diff-face-var 2611 (even-diff-face-var
2758 (intern (format "ediff-even-diff-face-%S-var" buf-type))) 2612 (intern (format "ediff-even-diff-face-%S-var" buf-type)))
2759 ) 2613 )
2760 2614
2761 (if ediff-xemacs-p 2615 (if ediff-xemacs-p
2762 (ediff-move-overlay 2616 (ediff-move-overlay current-diff-overlay begin end-hilit)
2763 current-diff-overlay begin end-hilit) 2617 (ediff-move-overlay current-diff-overlay begin end-hilit buff))
2764 ;; Emacs 19.22 has a bug, which requires that ediff-move-overlay will
2765 ;; have the buffer as a parameter. Believed fixed in 19.23.
2766 (ediff-move-overlay current-diff-overlay
2767 begin end-hilit buff))
2768 ;; giving priority of 0 and then changing it may look funny, but 2618 ;; giving priority of 0 and then changing it may look funny, but
2769 ;; this overcomes an obscure Emacs bug. 2619 ;; this overcomes an obscure Emacs bug.
2770 (ediff-overlay-put current-diff-overlay 'priority 0) 2620 (ediff-overlay-put current-diff-overlay 'priority 0)
2771 (ediff-overlay-put current-diff-overlay 'priority 2621 (ediff-overlay-put current-diff-overlay 'priority
2772 (ediff-highest-priority begin end-hilit buff)) 2622 (ediff-highest-priority begin end-hilit buff))
2805 odd-diff-face-var 2655 odd-diff-face-var
2806 even-diff-face-var)) 2656 even-diff-face-var))
2807 ))) 2657 )))
2808 2658
2809 (defun ediff-unhighlight-diffs-totally-in-one-buffer (buf-type) 2659 (defun ediff-unhighlight-diffs-totally-in-one-buffer (buf-type)
2810 (let (buffer-read-only) 2660 (ediff-unselect-and-select-difference -1)
2811 (ediff-unselect-and-select-difference -1) 2661 (if (and (ediff-window-display-p) ediff-use-faces)
2812 (if (and window-system ediff-use-faces) 2662 (let* ((inhibit-quit t)
2813 (let* ((inhibit-quit t) 2663 (current-diff-overlay-var
2814 (current-diff-overlay-var 2664 (intern (format "ediff-current-diff-overlay-%S" buf-type)))
2815 (intern (format "ediff-current-diff-overlay-%S" buf-type))) 2665 (current-diff-overlay (symbol-value current-diff-overlay-var))
2816 (current-diff-overlay (symbol-value current-diff-overlay-var)) 2666 (odd-diff-face-var
2817 (odd-diff-face-var 2667 (intern (format "ediff-odd-diff-face-%S-var" buf-type)))
2818 (intern (format "ediff-odd-diff-face-%S-var" buf-type))) 2668 (even-diff-face-var
2819 (even-diff-face-var 2669 (intern (format "ediff-even-diff-face-%S-var" buf-type))))
2820 (intern (format "ediff-even-diff-face-%S-var" buf-type)))) 2670 (if (face-differs-from-default-p odd-diff-face-var)
2821 (if (face-differs-from-default-p odd-diff-face-var) 2671 (progn
2822 (progn 2672 (copy-face 'default odd-diff-face-var)
2823 (copy-face 'default odd-diff-face-var) 2673 (copy-face 'default even-diff-face-var)))
2824 (copy-face 'default even-diff-face-var))) 2674 (if (ediff-overlayp current-diff-overlay)
2825 (if (ediff-overlayp current-diff-overlay) 2675 (ediff-delete-overlay current-diff-overlay))
2826 (ediff-delete-overlay current-diff-overlay)) 2676 (set current-diff-overlay-var nil)
2827 (set current-diff-overlay-var nil) 2677 )))
2828 ))
2829 ))
2830 2678
2831 2679
2832 ;; null out difference overlays so they won't slow down future 2680 ;; null out difference overlays so they won't slow down future
2833 ;; editing operations 2681 ;; editing operations
2834 ;; VEC is either a difference vector or a fine-diff vector 2682 ;; VEC is either a difference vector or a fine-diff vector
2843 )) 2691 ))
2844 (symbol-value vec-var))) 2692 (symbol-value vec-var)))
2845 ;; allow them to be garbage collected 2693 ;; allow them to be garbage collected
2846 (set vec-var nil)) 2694 (set vec-var nil))
2847 2695
2848 (defun ediff-operate-on-flags (action)
2849 "Re/unhighlights buffers A and B with all flags from all Ediff sessions.
2850 This is usually needed only when a
2851 buffer is involved in multiple Ediff sessions."
2852 (let* ((A-sessions (ediff-eval-in-buffer ediff-buffer-A
2853 ediff-this-buffer-control-sessions))
2854 (B-sessions (ediff-eval-in-buffer ediff-buffer-B
2855 ediff-this-buffer-control-sessions))
2856 (C-sessions (if ediff-3way-job
2857 (ediff-eval-in-buffer ediff-buffer-C
2858 ediff-this-buffer-control-sessions)))
2859 (sessions (ediff-union
2860 (ediff-union A-sessions B-sessions) C-sessions))
2861 (flag (if (eq action 'remove) 'unselect-only 'select-only)))
2862
2863 (mapcar (function
2864 (lambda (buf)
2865 (if (ediff-buffer-live-p buf)
2866 (ediff-eval-in-buffer buf
2867 (or (if (eq action 'insert)
2868 (memq ediff-highlighting-style '(ascii off))
2869 (not (eq ediff-highlighting-style 'ascii)))
2870 (ediff-unselect-and-select-difference
2871 ediff-current-difference
2872 flag 'no-recenter))
2873 ))))
2874 sessions)))
2875
2876
2877 2696
2878 2697
2879 ;;; Misc 2698 ;;; Misc
2880 2699
2881 ;; These two functions are here to neutralize XEmacs unwillingless to 2700 ;; These two functions are here to neutralize XEmacs unwillingless to
2884 "Calls `move-overlay' in Emacs and `set-extent-endpoints' in Lemacs. 2703 "Calls `move-overlay' in Emacs and `set-extent-endpoints' in Lemacs.
2885 Checks if overlay's buffer exists before actually doing the move." 2704 Checks if overlay's buffer exists before actually doing the move."
2886 (let ((buf (and overlay (ediff-overlay-buffer overlay)))) 2705 (let ((buf (and overlay (ediff-overlay-buffer overlay))))
2887 (if (ediff-buffer-live-p buf) 2706 (if (ediff-buffer-live-p buf)
2888 (if ediff-xemacs-p 2707 (if ediff-xemacs-p
2889 (progn 2708 (set-extent-endpoints overlay beg end)
2890 (set-extent-endpoints overlay beg end)
2891 (set-extent-property overlay 'ediff-marker beg))
2892 (move-overlay overlay beg end buffer)) 2709 (move-overlay overlay beg end buffer))
2893 ;; buffer's dead 2710 ;; buffer's dead
2894 (if overlay 2711 (if overlay
2895 (ediff-delete-overlay overlay))))) 2712 (ediff-delete-overlay overlay)))))
2896 2713
2902 (set-extent-property overlay prop value) 2719 (set-extent-property overlay prop value)
2903 (overlay-put overlay prop value)) 2720 (overlay-put overlay prop value))
2904 (ediff-delete-overlay overlay))) 2721 (ediff-delete-overlay overlay)))
2905 2722
2906 2723
2907 ;; In Emacs 19.23 and XEmacs 19.10, the number of variables to
2908 ;; file-name-handler has changed.
2909 (defun ediff-find-file-name-handler (file)
2910 (let (newvers)
2911 (setq newvers (if ediff-xemacs-p
2912 (ediff-check-version '> 19 9)
2913 (ediff-check-version '> 19 22)))
2914 (if newvers
2915 (find-file-name-handler file 'find-file-noselect)
2916 (find-file-name-handler file))))
2917
2918 ;; In XEmacs, it checks if the overlay is detached. If so, it reattaches
2919 ;; this overlay at position specified by ediff-marker.
2920 ;; If extent is not detached, it simply returns the start point.
2921 ;; In Emacs, this is the same as overlay-start.
2922 ;; If arg is not overlay, retuns nil
2923 (defun ediff-overlay-start (overl)
2924 (if (ediff-overlay-p overl)
2925 (if ediff-emacs-p
2926 (overlay-start overl)
2927 (let ((pos (extent-property overl 'ediff-marker)))
2928 (if (and (ediff-overlay-get overl 'detached)
2929 (number-or-marker-p pos))
2930 (ediff-move-overlay overl pos pos))
2931 (extent-start-position overl)))))
2932
2933 ;; In XEmacs, it checks if the overlay is detached. If so, it reattaches
2934 ;; this overlay at position specified by ediff-marker.
2935 ;; If extent is not detached, it simply returns the end point.
2936 ;; In Emacs, this is the same as overlay-end.
2937 (defun ediff-overlay-end (overl)
2938 (if (ediff-overlay-p overl)
2939 (if ediff-emacs-p
2940 (overlay-end overl)
2941 (let ((pos (extent-property overl 'ediff-marker)))
2942 (if (and (ediff-overlay-get overl 'detached)
2943 (number-or-marker-p pos))
2944 (ediff-move-overlay overl pos pos))
2945 (extent-end-position overl)))))
2946
2947 ;; Makes overlays that remember their position, even if detached in XEmacs.
2948 ;; In Emacs, this just makes overlay. In the future, when Emacs will start 2724 ;; In Emacs, this just makes overlay. In the future, when Emacs will start
2949 ;; supporting sticky overlays, this function will make a sticky overlay. 2725 ;; supporting sticky overlays, this function will make a sticky overlay.
2950 ;; BEG and END are expressions telling where overlay starts. 2726 ;; BEG and END are expressions telling where overlay starts.
2951 ;; If they are numbers or buffers, then all is well. Otherwise, they must 2727 ;; If they are numbers or buffers, then all is well. Otherwise, they must
2952 ;; be expressions to be evaluated in buffer BUF in order to get the overlay 2728 ;; be expressions to be evaluated in buffer BUF in order to get the overlay
2964 (setq overl (ediff-make-overlay beg end buff)) 2740 (setq overl (ediff-make-overlay beg end buff))
2965 2741
2966 (if ediff-xemacs-p 2742 (if ediff-xemacs-p
2967 (progn 2743 (progn
2968 ;; take precautions against detached extents 2744 ;; take precautions against detached extents
2969 (ediff-overlay-put 2745 (ediff-overlay-put overl 'detachable nil)
2970 overl 'ediff-marker (move-marker (make-marker) beg buff))
2971 ;; chars inserted at both ends will be inside extent 2746 ;; chars inserted at both ends will be inside extent
2972 (ediff-overlay-put overl 'start-open nil) 2747 (ediff-overlay-put overl 'start-open nil)
2973 (ediff-overlay-put overl 'end-open nil)) 2748 (ediff-overlay-put overl 'end-open nil))
2974 (ediff-overlay-put overl 'ediff-diff-num 0) 2749 (ediff-overlay-put overl 'ediff-diff-num 0)
2975 ;;(ediff-overlay-put overl 'insert-in-front-hooks 2750 ;;(ediff-overlay-put overl 'insert-in-front-hooks
2979 ;; These two are not yet implemented in Emacs 2754 ;; These two are not yet implemented in Emacs
2980 ;;(ediff-overlay-put overl 'rear-sticky t) 2755 ;;(ediff-overlay-put overl 'rear-sticky t)
2981 ;;(ediff-overlay-put overl 'front-sticky t) 2756 ;;(ediff-overlay-put overl 'front-sticky t)
2982 ) 2757 )
2983 overl)))) 2758 overl))))
2984 2759
2985 2760 (defsubst ediff-overlay-start (overl)
2986 ;; Check the current version against the major and minor version numbers 2761 (if (ediff-overlayp overl)
2987 ;; using op: cur-vers op major.minor If emacs-major-version or 2762 (if ediff-emacs-p
2988 ;; emacs-minor-version are not defined, we assume that the current version 2763 (overlay-start overl)
2989 ;; is hopelessly outdated. We assume that emacs-major-version and 2764 (extent-start-position overl))))
2990 ;; emacs-minor-version are defined. Otherwise, for Emacs/XEmacs 19, if the 2765
2991 ;; current minor version is < 10 (xemacs) or < 23 (emacs) the return value 2766 (defsubst ediff-overlay-end (overl)
2992 ;; will be nil (when op is =, >, or >=) and t (when op is <, <=), which may be 2767 (if (ediff-overlayp overl)
2993 ;; incorrect. However, this gives correct result in our cases, since we are 2768 (if ediff-emacs-p
2994 ;; testing for sufficiently high Emacs versions. 2769 (overlay-end overl)
2995 (defun ediff-check-version (op major minor &optional type-of-emacs) 2770 (extent-end-position overl))))
2996 (if (and (boundp 'emacs-major-version) (boundp 'emacs-minor-version)) 2771
2997 (and (cond ((eq type-of-emacs 'xemacs) ediff-xemacs-p) 2772
2998 ((eq type-of-emacs 'emacs) ediff-emacs-p)
2999 (t t))
3000 (cond ((eq op '=) (and (= emacs-minor-version minor)
3001 (= emacs-major-version major)))
3002 ((memq op '(> >= < <=))
3003 (and (or (funcall op emacs-major-version major)
3004 (= emacs-major-version major))
3005 (if (= emacs-major-version major)
3006 (funcall op emacs-minor-version minor)
3007 t)))
3008 (t
3009 (error "%S: Invalid op in ediff-check-version" op))))
3010 (cond ((memq op '(= > >=)) nil)
3011 ((memq op '(< <=)) t))))
3012
3013
3014 ;; Like other-buffer, but prefers visible buffers and ignores temporary or 2773 ;; Like other-buffer, but prefers visible buffers and ignores temporary or
3015 ;; other insignificant buffers (those beginning with "^[ *]"). 2774 ;; other insignificant buffers (those beginning with "^[ *]").
3016 ;; Gets one arg--buffer name or a list of buffer names (it won't return 2775 ;; Gets one arg--buffer name or a list of buffer names (it won't return
3017 ;; these buffers). 2776 ;; these buffers).
3018 (defun ediff-other-buffer (buff) 2777 (defun ediff-other-buffer (buff)
3019 (if (not (listp buff)) (setq buff (list buff))) 2778 (if (not (listp buff)) (setq buff (list buff)))
3020 (let* ((screen-buffers (buffer-list)) 2779 (let* ((frame-buffers (buffer-list))
3021 (significant-buffers 2780 (significant-buffers
3022 (mapcar 2781 (mapcar
3023 (function (lambda (x) 2782 (function (lambda (x)
3024 (cond ((member (buffer-name x) buff) 2783 (cond ((member (buffer-name x) buff)
3025 nil) 2784 nil)
3026 ((not (ediff-get-visible-buffer-window x)) 2785 ((not (ediff-get-visible-buffer-window x))
3027 nil) 2786 nil)
3028 ((string-match "^ " (buffer-name x)) 2787 ((string-match "^ " (buffer-name x))
3029 nil) 2788 nil)
3030 (t x)))) 2789 (t x))))
3031 screen-buffers)) 2790 frame-buffers))
3032 (buffers (delq nil significant-buffers)) 2791 (buffers (delq nil significant-buffers))
3033 less-significant-buffers) 2792 less-significant-buffers)
3034 2793
3035 (cond (buffers (car buffers)) 2794 (cond (buffers (car buffers))
3036 ;; try also buffers that are not displayed in windows 2795 ;; try also buffers that are not displayed in windows
3040 (function 2799 (function
3041 (lambda (x) 2800 (lambda (x)
3042 (cond ((member (buffer-name x) buff) nil) 2801 (cond ((member (buffer-name x) buff) nil)
3043 ((string-match "^[ *]" (buffer-name x)) nil) 2802 ((string-match "^[ *]" (buffer-name x)) nil)
3044 (t x)))) 2803 (t x))))
3045 screen-buffers))) 2804 frame-buffers)))
3046 (car less-significant-buffers)) 2805 (car less-significant-buffers))
3047 (t (other-buffer (current-buffer)))) 2806 (t (other-buffer (current-buffer))))
3048 )) 2807 ))
3049 2808
3050 2809
3058 (while (get-buffer (format "%s<%d>%s" prefix n suffix)) 2817 (while (get-buffer (format "%s<%d>%s" prefix n suffix))
3059 (setq n (1+ n))) 2818 (setq n (1+ n)))
3060 (format "%s<%d>%s" prefix n suffix)))) 2819 (format "%s<%d>%s" prefix n suffix))))
3061 2820
3062 2821
3063 ;; Early versions of XEmacs didn't have window-live-p (or it didn't work right)
3064 (if (ediff-check-version '< 19 11 'xemacs)
3065 (defun window-live-p (win)
3066 (let (visible)
3067 (walk-windows
3068 '(lambda (walk-win)
3069 (if(equal walk-win win)
3070 (setq visible t)))
3071 nil 'all-screens)
3072 visible))
3073 )
3074
3075 (defun ediff-submit-report () 2822 (defun ediff-submit-report ()
3076 "Submit bug report on Ediff." 2823 "Submit bug report on Ediff."
3077 (interactive) 2824 (interactive)
3078 (let ((reporter-prompt-for-summary-p t) 2825 (let ((reporter-prompt-for-summary-p t)
3079 (ctl-buf ediff-control-buffer) 2826 (ctl-buf ediff-control-buffer)
2827 (ediff-device-type (ediff-device-type))
3080 varlist salutation buffer-name) 2828 varlist salutation buffer-name)
3081 (setq varlist '(ediff-diff-program ediff-diff-options 2829 (setq varlist '(ediff-diff-program ediff-diff-options
3082 ediff-patch-program ediff-patch-options 2830 ediff-patch-program ediff-patch-options
3083 ediff-shell 2831 ediff-shell
3084 ediff-use-faces 2832 ediff-use-faces
3092 ediff-window-setup-function 2840 ediff-window-setup-function
3093 ediff-split-window-function 2841 ediff-split-window-function
3094 ediff-job-name 2842 ediff-job-name
3095 ediff-word-mode 2843 ediff-word-mode
3096 buffer-name 2844 buffer-name
3097 window-system 2845 ediff-device-type
3098 )) 2846 ))
3099 (setq salutation " 2847 (setq salutation "
3100 Congratulations! You may have unearthed a bug in Ediff! 2848 Congratulations! You may have unearthed a bug in Ediff!
3101 2849
3102 Please make a concise and accurate summary of what happened 2850 Please make a concise and accurate summary of what happened
3103 and mail it to the address above. 2851 and mail it to the address above.
3104 ----------------------------------------------------------- 2852 -----------------------------------------------------------
3105 ") 2853 ")
3106 2854
3107 (ediff-skip-unsuitable-frames) 2855 (ediff-skip-unsuitable-frames)
3108 (if window-system 2856 (ediff-reset-mouse)
3109 (set-mouse-position (ediff-selected-frame) 1 0))
3110 2857
3111 (switch-to-buffer ediff-msg-buffer) 2858 (switch-to-buffer ediff-msg-buffer)
3112 (erase-buffer) 2859 (erase-buffer)
3113 (delete-other-windows) 2860 (delete-other-windows)
3114 (insert " 2861 (insert "
3133 While compiling toplevel forms in file ediff.el: 2880 While compiling toplevel forms in file ediff.el:
3134 ** reference to free variable pm-color-alist 2881 ** reference to free variable pm-color-alist
3135 ........................ 2882 ........................
3136 While compiling the end of the data: 2883 While compiling the end of the data:
3137 ** The following functions are not known to be defined: 2884 ** The following functions are not known to be defined:
3138 ediff-valid-color-p, ediff-display-color-p, ediff-set-face, 2885 ediff-valid-color-p, ediff-set-face,
3139 ........................ 2886 ........................
3140 2887
3141 These are NOT errors, but inevitable warnings, which ought to be ignored. 2888 These are NOT errors, but inevitable warnings, which ought to be ignored.
3142 2889
3143 Please do not report those and similar things. However, comments and 2890 Please do not report those and similar things. However, comments and
3196 (save-excursion 2943 (save-excursion
3197 (save-restriction 2944 (save-restriction
3198 (widen) 2945 (widen)
3199 (goto-char (point-min)) 2946 (goto-char (point-min))
3200 (let ((mod-p (buffer-modified-p)) 2947 (let ((mod-p (buffer-modified-p))
3201 (buffer-read-only nil) 2948 buffer-read-only end)
3202 end)
3203 (and (eq t selective-display) 2949 (and (eq t selective-display)
3204 (while (search-forward "\^M" nil t) 2950 (while (search-forward "\^M" nil t)
3205 (end-of-line) 2951 (end-of-line)
3206 (setq end (point)) 2952 (setq end (point))
3207 (beginning-of-line) 2953 (beginning-of-line)
3211 (set-buffer-modified-p mod-p) 2957 (set-buffer-modified-p mod-p)
3212 (setq selective-display nil))))) 2958 (setq selective-display nil)))))
3213 )) 2959 ))
3214 2960
3215 2961
3216 ;; The next two are simplified versions from emerge.el. 2962 ;; The next two are modified versions from emerge.el.
3217 ;; VARS must be a list of symbols 2963 ;; VARS must be a list of symbols
3218 (defun ediff-save-variables (vars) 2964 ;; ediff-save-variables returns an association list: ((var . val) ...)
3219 (mapcar (function (lambda (v) (symbol-value v))) 2965 (defsubst ediff-save-variables (vars)
2966 (mapcar (function (lambda (v) (cons v (symbol-value v))))
3220 vars)) 2967 vars))
3221 (defun ediff-restore-variables (vars values) 2968 ;; VARS is a list of variable symbols.
2969 (defun ediff-restore-variables (vars assoc-list)
3222 (while vars 2970 (while vars
3223 (set (car vars) (car values)) 2971 (set (car vars) (cdr (assoc (car vars) assoc-list)))
3224 (setq vars (cdr vars) 2972 (setq vars (cdr vars))))
3225 values (cdr values)))) 2973 (defun ediff-change-saved-variable (var value buf-type)
3226 2974 (let* ((assoc-list
3227 ;; When Emacs implements before/after-string properties in overlays, 2975 (symbol-value (intern
3228 ;; this function will be deleted 2976 (concat "ediff-buffer-values-orig-"
3229 (defun ediff-remember-buffer-characteristics (&optional arg) 2977 (symbol-name buf-type)))))
3230 "Record certain properties of the buffers being compared. 2978 (assoc-elt (assoc var assoc-list)))
3231 Must be called in the control buffer. Saves `read-only', `modified', 2979 (if assoc-elt
3232 and `auto-save' properties in buffer local variables. Turns off 2980 (setcdr assoc-elt value))))
3233 `auto-save-mode'. These properties are restored via a call to 2981
3234 `ediff-restore-buffer-characteristics'."
3235
3236 ;; remember and alter buffer characteristics
3237 (set (if arg 'ediff-buffer-A-values-setup 'ediff-buffer-A-values)
3238 (ediff-eval-in-buffer ediff-buffer-A
3239 (prog1
3240 (ediff-save-variables ediff-saved-variables)
3241 (ediff-restore-variables ediff-saved-variables
3242 ediff-working-values))))
3243 (set (if arg 'ediff-buffer-B-values-setup 'ediff-buffer-B-values)
3244 (ediff-eval-in-buffer ediff-buffer-B
3245 (prog1
3246 (ediff-save-variables ediff-saved-variables)
3247 (ediff-restore-variables ediff-saved-variables
3248 ediff-working-values))))
3249 (if (ediff-buffer-live-p ediff-buffer-C)
3250 (set (if arg 'ediff-buffer-C-values-setup 'ediff-buffer-C-values)
3251 (ediff-eval-in-buffer ediff-buffer-C
3252 (prog1
3253 (ediff-save-variables ediff-saved-variables)
3254 (ediff-restore-variables ediff-saved-variables
3255 ediff-working-values)))))
3256 )
3257 2982
3258 ;; must execute in control buf 2983 ;; must execute in control buf
3259 (defun ediff-save-protected-variables () 2984 (defun ediff-save-protected-variables ()
3260 (setq ediff-buffer-A-values-orig 2985 (setq ediff-buffer-values-orig-A
3261 (ediff-eval-in-buffer ediff-buffer-A 2986 (ediff-eval-in-buffer ediff-buffer-A
3262 (ediff-save-variables ediff-protected-variables))) 2987 (ediff-save-variables ediff-protected-variables)))
3263 (setq ediff-buffer-B-values-orig 2988 (setq ediff-buffer-values-orig-B
3264 (ediff-eval-in-buffer ediff-buffer-B 2989 (ediff-eval-in-buffer ediff-buffer-B
3265 (ediff-save-variables ediff-protected-variables))) 2990 (ediff-save-variables ediff-protected-variables)))
3266 (if ediff-3way-comparison-job 2991 (if ediff-3way-comparison-job
3267 (setq ediff-buffer-C-values-orig 2992 (setq ediff-buffer-values-orig-C
3268 (ediff-eval-in-buffer ediff-buffer-C 2993 (ediff-eval-in-buffer ediff-buffer-C
3269 (ediff-save-variables ediff-protected-variables))))) 2994 (ediff-save-variables ediff-protected-variables)))))
3270 2995
3271 ;; must execute in control buf 2996 ;; must execute in control buf
3272 (defun ediff-restore-protected-variables () 2997 (defun ediff-restore-protected-variables ()
3273 (let ((values-A ediff-buffer-A-values-orig) 2998 (let ((values-A ediff-buffer-values-orig-A)
3274 (values-B ediff-buffer-B-values-orig) 2999 (values-B ediff-buffer-values-orig-B)
3275 (values-C ediff-buffer-C-values-orig)) 3000 (values-C ediff-buffer-values-orig-C))
3276 (ediff-eval-in-buffer ediff-buffer-A 3001 (ediff-eval-in-buffer ediff-buffer-A
3277 (ediff-restore-variables ediff-protected-variables values-A)) 3002 (ediff-restore-variables ediff-protected-variables values-A))
3278 (ediff-eval-in-buffer ediff-buffer-B 3003 (ediff-eval-in-buffer ediff-buffer-B
3279 (ediff-restore-variables ediff-protected-variables values-B)) 3004 (ediff-restore-variables ediff-protected-variables values-B))
3280 (if ediff-3way-comparison-job 3005 (if ediff-3way-comparison-job
3281 (ediff-eval-in-buffer ediff-buffer-C 3006 (ediff-eval-in-buffer ediff-buffer-C
3282 (ediff-restore-variables ediff-protected-variables values-C))))) 3007 (ediff-restore-variables ediff-protected-variables values-C)))))
3283
3284 ;; When Emacs implements before/after-string properties in overlays, this
3285 ;; function will be called only once, in ediff-really-quit.
3286 (defun ediff-restore-buffer-characteristics (&optional arg)
3287 "Restore properties saved by `ediff-remember-buffer-characteristics'."
3288 (let ((A-values (if arg ediff-buffer-A-values-setup ediff-buffer-A-values))
3289 (B-values (if arg ediff-buffer-B-values-setup ediff-buffer-B-values))
3290 (C-values (if arg ediff-buffer-C-values-setup ediff-buffer-C-values))
3291 )
3292
3293 (ediff-eval-in-buffer ediff-buffer-A
3294 (ediff-restore-variables ediff-saved-variables A-values))
3295 (ediff-eval-in-buffer ediff-buffer-B
3296 (ediff-restore-variables ediff-saved-variables B-values))
3297 (if (ediff-buffer-live-p ediff-buffer-C)
3298 (ediff-eval-in-buffer ediff-buffer-C
3299 (ediff-restore-variables ediff-saved-variables C-values)))
3300 ))
3301 3008
3302 3009
3303 ;;; Debug 3010 ;;; Debug
3304 3011
3305 (ediff-defvar-local ediff-command-begin-time '(0 0 0) "") 3012 (ediff-defvar-local ediff-command-begin-time '(0 0 0) "")
3376 ;; don't report error if version control package wasn't found 3083 ;; don't report error if version control package wasn't found
3377 ;;(ediff-load-version-control 'silent) 3084 ;;(ediff-load-version-control 'silent)
3378 3085
3379 (run-hooks 'ediff-load-hooks) 3086 (run-hooks 'ediff-load-hooks)
3380 3087
3381 ;; to foil foul play 3088
3382 (if (or (not window-system)
3383 (ediff-check-version '< 19 11 'xemacs))
3384 (fset 'ediff-setup-windows-multiframe 'ediff-setup-windows-plain))
3385
3386
3387 ;;; Local Variables: 3089 ;;; Local Variables:
3388 ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun) 3090 ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
3389 ;;; eval: (put 'ediff-eval-in-buffer 'lisp-indent-hook 1) 3091 ;;; eval: (put 'ediff-eval-in-buffer 'lisp-indent-hook 1)
3390 ;;; End: 3092 ;;; End:
3391 3093