+
+
+(defun ediff-inferior-compare-regions ()
+ "Compare regions in an active Ediff session.
+Like ediff-regions-linewise but is called from under an active Ediff session on
+the files that belong to that session.
+
+After quitting the session invoked via this function, type C-l to the parent
+Ediff Control Panel to restore highlighting."
+ (interactive)
+ (let ((answer "")
+ (possibilities (list ?A ?B ?C))
+ (zmacs-regions t)
+ (ctl-buf (current-buffer))
+ quit-now
+ begA begB endA endB bufA bufB)
+
+ (cond ((ediff-merge-job)
+ (setq bufB ediff-buffer-C)
+ (while (cond ((eq answer ?A)
+ (setq bufA ediff-buffer-A
+ possibilities '(?B))
+ nil)
+ ((eq answer ?B)
+ (setq bufA ediff-buffer-B
+ possibilities '(?A))
+ nil)
+ ((equal answer ""))
+ (t (beep 1)
+ (message "Valid values are A or B")
+ (sit-for 2)
+ t))
+ (let ((cursor-in-echo-area t))
+ (message "Which buffer to compare to the merge buffer (A/B)? ")
+ (setq answer (capitalize (read-char-exclusive))))))
+
+ ((ediff-3way-comparison-job)
+ (while (cond ((memq answer possibilities)
+ (setq possibilities (delq answer possibilities))
+ (setq bufA
+ (eval
+ (ediff-get-symbol-from-alist
+ answer ediff-buffer-alist)))
+ nil)
+ ((equal answer ""))
+ (t (beep 1)
+ (message
+ "Valid values are %s"
+ (mapconcat 'char-to-string possibilities " or "))
+ (sit-for 2)
+ t))
+ (let ((cursor-in-echo-area t))
+ (message "Enter the 1st buffer you want to compare (%s): "
+ (mapconcat 'char-to-string possibilities "/"))
+ (setq answer (capitalize (read-char-exclusive)))))
+ (setq answer "") ; silence error msg
+ (while (cond ((memq answer possibilities)
+ (setq possibilities (delq answer possibilities))
+ (setq bufB
+ (eval
+ (ediff-get-symbol-from-alist
+ answer ediff-buffer-alist)))
+ nil)
+ ((equal answer ""))
+ (t (beep 1)
+ (message
+ "Valid values are %s"
+ (mapconcat 'char-to-string possibilities " or "))
+ (sit-for 2)
+ t))
+ (let ((cursor-in-echo-area t))
+ (message "Enter the 2nd buffer you want to compare (%s): "
+ (mapconcat 'char-to-string possibilities "/"))
+ (setq answer (capitalize (read-char-exclusive))))))
+ (t ; 2way comparison
+ (setq bufA ediff-buffer-A
+ bufB ediff-buffer-B
+ possibilities nil)))
+
+ (ediff-with-current-buffer bufA
+ (or (mark t)
+ (error "You forgot to specify a region in buffer %s" (buffer-name)))
+ (setq begA (region-beginning)
+ endA (region-end))
+ (goto-char begA)
+ (beginning-of-line)
+ (setq begA (point))
+ (goto-char endA)
+ (end-of-line)
+ (or (eobp) (forward-char)) ; include the newline char
+ (setq endA (point)))
+ (ediff-with-current-buffer bufB
+ (or (mark t)
+ (error "You forgot to specify a region in buffer %s" (buffer-name)))
+ (setq begB (region-beginning)
+ endB (region-end))
+ (goto-char begB)
+ (beginning-of-line)
+ (setq begB (point))
+ (goto-char endB)
+ (end-of-line)
+ (or (eobp) (forward-char)) ; include the newline char
+ (setq endB (point)))
+
+ (ediff-unselect-and-select-difference
+ ediff-current-difference 'unselect-only)
+ (ediff-paint-background-regions 'unhighlight)
+
+ (ediff-with-current-buffer bufA
+ (goto-char begA)
+ (set-mark endA)
+ (narrow-to-region begA endA)
+ ;; (ediff-activate-mark)
+ )
+ ;; (sit-for 0)
+ (ediff-with-current-buffer bufB
+ (goto-char begB)
+ (set-mark endB)
+ (narrow-to-region begB endB)
+ ;; (ediff-activate-mark)
+ )
+ ;; (sit-for 0)
+
+ ;; At this point, possibilities contains either the window char A/B/C
+ ;; that was not selected, or it is nil. We delete the window that is not
+ ;; selected.
+ (if possibilities
+ (ediff-with-current-buffer ctl-buf
+ (let* ((wind-to-delete (eval
+ (ediff-get-symbol-from-alist
+ (car possibilities)
+ ediff-window-alist)))
+ (frame (window-frame wind-to-delete)))
+ (delete-window wind-to-delete)
+ (select-frame frame)
+ (balance-windows))))
+ (or (y-or-n-p
+ "Please check regions selected for comparison. Continue? ")
+ (setq quit-now t))
+
+ (ediff-with-current-buffer bufA
+ (widen))
+ (ediff-with-current-buffer bufB
+ (widen))
+ (if quit-now
+ (ediff-with-current-buffer ctl-buf
+ (ediff-recenter)
+ (sit-for 0)
+ (error "All right. Make up your mind and come back...")))
+
+ (ediff-regions-internal
+ bufA begA endA bufB begB endB
+ nil ; setup-hook
+ 'ediff-regions-linewise ; job name
+ nil ; no word mode
+ ;; setup param to pass to ediff-setup
+ (list (cons 'ediff-split-window-function ediff-split-window-function)))
+ ))