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))