Function: ediff-prepare-meta-buffer
ediff-prepare-meta-buffer is a byte-compiled function defined in
ediff-mult.el.gz.
Signature
(ediff-prepare-meta-buffer ACTION-FUNC META-LIST META-BUFFER-NAME REDRAW-FUNCTION JOBNAME &optional STARTUP-HOOKS)
Source Code
;; Defined in /usr/src/emacs/lisp/vc/ediff-mult.el.gz
;; If file groups selected by patterns will ever be implemented, this
;; comparison function might become useful.
;; ;; uses external variables PAT1 PAT2 to compare str1/2
;; ;; patterns must be of the form ???*???? where ??? are strings of chars
;; ;; containing no *.
;;(defun ediff-pattern= (str1 str2)
;; (let (pos11 pos12 pos21 pos22 len1 len2)
;; (setq pos11 0
;; len (length epat1)
;; pos12 len)
;; (while (and (< pos11 len) (not (= (aref epat1 pos11) ?*)))
;; (setq pos11 (1+ pos11)))
;; (while (and (> pos12 0) (not (= (aref epat1 (1- pos12)) ?*)))
;; (setq pos12 (1- pos12)))
;;
;; (setq pos21 0
;; len (length epat2)
;; pos22 len)
;; (while (and (< pos21 len) (not (= (aref epat2 pos21) ?*)))
;; (setq pos21 (1+ pos21)))
;; (while (and (> pos22 0) (not (= (aref epat2 (1- pos22)) ?*)))
;; (setq pos22 (1- pos22)))
;;
;; (if (and (> (length str1) pos12) (>= pos12 pos11) (> pos11 -1)
;; (> (length str2) pos22) (>= pos22 pos21) (> pos21 -1))
;; (string= (substring str1 pos11 pos12)
;; (substring str2 pos21 pos22)))
;; ))
;; Prepare meta-buffer in accordance with the argument-function and
;; redraw-function. Must return the created meta-buffer.
(defun ediff-prepare-meta-buffer (action-func meta-list
meta-buffer-name redraw-function
jobname &optional startup-hooks)
(let* ((meta-buffer-name
(ediff-unique-buffer-name meta-buffer-name "*"))
(meta-buffer (get-buffer-create meta-buffer-name)))
(ediff-with-current-buffer meta-buffer
;; comes first
(ediff-meta-mode)
(setq ediff-meta-action-function action-func
ediff-meta-redraw-function redraw-function
ediff-metajob-name jobname
ediff-meta-buffer meta-buffer)
;; comes after ediff-meta-action-function is set
(ediff-setup-meta-map)
(if (eq ediff-metajob-name 'ediff-registry)
(progn
(setq ediff-registry-buffer meta-buffer
ediff-meta-list meta-list)
;; this func is used only from registry buffer, not from other
;; meta-buffs.
(define-key
ediff-meta-buffer-map "M" 'ediff-show-meta-buff-from-registry))
;; Initialize the meta list -- we don't do this for registry.
(setq ediff-meta-list
;; add meta-buffer to the list header
(cons (cons meta-buffer (car meta-list))
(cdr meta-list))))
(or (eq meta-buffer ediff-registry-buffer)
(setq ediff-session-registry
(cons meta-buffer ediff-session-registry)))
;; redraw-function uses ediff-meta-list
(funcall redraw-function ediff-meta-list)
;; set read-only/non-modified
(setq buffer-read-only t)
(set-buffer-modified-p nil)
(mapc #'funcall startup-hooks)
;; Arrange to show directory contents differences
;; Must be after run startup-hooks, since ediff-dir-difference-list is
;; set inside these hooks
(if (eq action-func 'ediff-filegroup-action)
(progn
;; put meta buffer in (car ediff-dir-difference-list)
(setq ediff-dir-difference-list
(cons (cons meta-buffer (car ediff-dir-difference-list))
(cdr ediff-dir-difference-list)))
(or (ediff-one-filegroup-metajob jobname)
(ediff-draw-dir-diffs ediff-dir-difference-list))
(define-key
ediff-meta-buffer-map "h" 'ediff-mark-for-hiding-at-pos)
(define-key ediff-meta-buffer-map "x" #'ediff-hide-marked-sessions)
(define-key
ediff-meta-buffer-map "m" #'ediff-mark-for-operation-at-pos)
(define-key ediff-meta-buffer-map "u" nil)
(define-key
ediff-meta-buffer-map "um" #'ediff-unmark-all-for-operation)
(define-key
ediff-meta-buffer-map "uh" #'ediff-unmark-all-for-hiding)
(define-key ediff-meta-buffer-map
[menu-bar ediff-meta-mode ediff-hide-marked-sessions]
'(menu-item "Hide marked" ediff-hide-marked-sessions
:help "Hide marked sessions. With prefix arg, unhide"))
(define-key ediff-meta-buffer-map
[menu-bar ediff-meta-mode ediff-mark-for-hiding-at-pos]
'(menu-item "Mark for hiding" ediff-mark-for-hiding-at-pos
:help "Mark session for hiding. With prefix arg, unmark"))
(define-key ediff-meta-buffer-map
[menu-bar ediff-meta-mode ediff-mark-for-operation-at-pos]
'(menu-item "Mark for group operation" ediff-mark-for-operation-at-pos
:help "Mark session for a group operation. With prefix arg, unmark"))
(define-key ediff-meta-buffer-map
[menu-bar ediff-meta-mode ediff-unmark-all-for-hiding]
'(menu-item "Unmark all for hiding" ediff-unmark-all-for-hiding
:help "Unmark all sessions marked for hiding"))
(define-key ediff-meta-buffer-map
[menu-bar ediff-meta-mode ediff-unmark-all-for-operation]
'(menu-item "Unmark all for group operation" ediff-unmark-all-for-operation
:help "Unmark all sessions marked for operation"))
(cond ((ediff-collect-diffs-metajob jobname)
(define-key ediff-meta-buffer-map
[menu-bar ediff-meta-mode ediff-collect-custom-diffs]
'(menu-item "Collect diffs" ediff-collect-custom-diffs
:help "Collect custom diffs of marked sessions in buffer `*Ediff Multifile Diffs*'"))
(define-key
ediff-meta-buffer-map "P" #'ediff-collect-custom-diffs))
((ediff-patch-metajob jobname)
(define-key ediff-meta-buffer-map
[menu-bar ediff-meta-mode ediff-meta-show-patch]
'(menu-item "Show multi-file patch" ediff-meta-show-patch
:help "Show the multi-file patch associated with this group session"))
(define-key
ediff-meta-buffer-map "P" 'ediff-meta-show-patch)))
(define-key ediff-meta-buffer-map "^" #'ediff-up-meta-hierarchy)
(define-key ediff-meta-buffer-map "D" #'ediff-show-dir-diffs)
(define-key ediff-meta-buffer-map
[menu-bar ediff-meta-mode ediff-up-meta-hierarchy]
'(menu-item "Go to parent session" ediff-up-meta-hierarchy
:help "Go to the parent session group buffer"))
(define-key ediff-meta-buffer-map
[menu-bar ediff-meta-mode ediff-show-dir-diffs]
'(menu-item "Diff directories" ediff-show-dir-diffs
:help "Display differences among the directories involved in session group"))))
(if (eq ediff-metajob-name 'ediff-registry)
(run-hooks 'ediff-registry-setup-hook)
(run-hooks 'ediff-after-session-group-setup-hook))
) ; eval in meta-buffer
meta-buffer))