/[emacs]/emacs/lisp/ediff-merg.el
ViewVC logotype

Diff of /emacs/lisp/ediff-merg.el

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.22 by kifer, Tue Jan 8 04:36:01 2002 UTC revision 1.22.4.1 by miles, Fri Apr 4 06:20:04 2003 UTC
# Line 58  Valid values are the symbols `default-A' Line 58  Valid values are the symbols `default-A'
58    :type '(radio (const default-A) (const default-B) (const combined))    :type '(radio (const default-A) (const default-B) (const combined))
59    :group 'ediff-merge)    :group 'ediff-merge)
60    
61  (defcustom ediff-combination-pattern  (defcustom ediff-combination-pattern
62    '("<<<<<<< variant A" A ">>>>>>> variant B" B  "####### Ancestor" Ancestor "======= end")    '("<<<<<<< variant A" A ">>>>>>> variant B" B  "####### Ancestor" Ancestor "======= end")
63    "*Pattern to be used for combining difference regions in buffers A and B.    "*Pattern to be used for combining difference regions in buffers A and B.
64  The value must be a list of the form  The value must be a list of the form
65  (STRING1 bufspec1  STRING2 bufspec2 STRING3 bufspec3 STRING4)  (STRING1 bufspec1  STRING2 bufspec2 STRING3 bufspec3 STRING4)
66  where bufspec is the symbol A, B, or Ancestor. For instance, if the value is  where bufspec is the symbol A, B, or Ancestor. For instance, if the value is
67  '(STRING1 A  STRING2 Ancestor STRING3 B STRING4) then the  '(STRING1 A  STRING2 Ancestor STRING3 B STRING4) then the
# Line 93  skipped over.  nil means show all region Line 93  skipped over.  nil means show all region
93  A region is considered to have been changed if it is different from the current  A region is considered to have been changed if it is different from the current
94  default (`default-A', `default-B', `combined') and it hasn't been marked as  default (`default-A', `default-B', `combined') and it hasn't been marked as
95  `prefer-A' or `prefer-B'.  `prefer-A' or `prefer-B'.
96  A region is considered to have been changed also when it is marked as  A region is considered to have been changed also when it is marked as
97  as `prefer-A', but is different from the corresponding difference region in  as `prefer-A', but is different from the corresponding difference region in
98  Buffer A or if it is marked as `prefer-B' and is different from the region in  Buffer A or if it is marked as `prefer-B' and is different from the region in
99  Buffer B."  Buffer B."
# Line 111  Buffer B." Line 111  Buffer B."
111  ;; If ediff-skip-changed-regions, check if the merge region differs from  ;; If ediff-skip-changed-regions, check if the merge region differs from
112  ;; the current default. If a region is different from the default, it means  ;; the current default. If a region is different from the default, it means
113  ;; that the user has made determination as to how to merge for this particular  ;; that the user has made determination as to how to merge for this particular
114  ;; region.  ;; region.
115  (defsubst ediff-skip-merge-region-if-changed-from-default-p (n)  (defsubst ediff-skip-merge-region-if-changed-from-default-p (n)
116    (and ediff-skip-merge-regions-that-differ-from-default    (and ediff-skip-merge-regions-that-differ-from-default
117         (ediff-merge-changed-from-default-p n 'prefers-too)))         (ediff-merge-changed-from-default-p n 'prefers-too)))
# Line 137  Buffer B." Line 137  Buffer B."
137            (setq combo-region            (setq combo-region
138                  (concat combo-region                  (concat combo-region
139                          region-delim "\n"                          region-delim "\n"
140                          (ediff-get-region-contents                          (ediff-get-region-contents
141                           n region-spec ediff-control-buffer)))                           n region-spec ediff-control-buffer)))
142          (error ""))          (error ""))
143        (setq pattern-list (cdr (cdr pattern-list)))        (setq pattern-list (cdr (cdr pattern-list)))
# Line 161  Buffer B." Line 161  Buffer B."
161      (while (< n ediff-number-of-differences)      (while (< n ediff-number-of-differences)
162        (ediff-set-state-of-diff-in-all-buffers n ctl-buf)        (ediff-set-state-of-diff-in-all-buffers n ctl-buf)
163        (setq n (1+ n)))))        (setq n (1+ n)))))
164        
165  (defun ediff-set-state-of-diff-in-all-buffers (n ctl-buf)  (defun ediff-set-state-of-diff-in-all-buffers (n ctl-buf)
166    (let ((regA (ediff-get-region-contents n 'A ctl-buf))    (let ((regA (ediff-get-region-contents n 'A ctl-buf))
167          (regB (ediff-get-region-contents n 'B ctl-buf))          (regB (ediff-get-region-contents n 'B ctl-buf))
# Line 190  Buffer B." Line 190  Buffer B."
190               (ediff-set-state-of-diff n 'B nil)               (ediff-set-state-of-diff n 'B nil)
191               (ediff-set-state-of-diff n 'C nil)))               (ediff-set-state-of-diff n 'C nil)))
192      ))      ))
193        
194  (defun ediff-set-merge-mode ()  (defun ediff-set-merge-mode ()
195    (normal-mode t)    (normal-mode t)
196    (remove-hook 'local-write-file-hooks 'ediff-set-merge-mode))    (remove-hook 'local-write-file-hooks 'ediff-set-merge-mode))
197    
198            
199  ;; Go over all diffs starting with DIFF-NUM and copy regions into buffer C  ;; Go over all diffs starting with DIFF-NUM and copy regions into buffer C
200  ;; according to the state of the difference.  ;; according to the state of the difference.
201  ;; Since ediff-copy-diff refuses to copy identical diff regions, there is  ;; Since ediff-copy-diff refuses to copy identical diff regions, there is
# Line 217  Buffer B." Line 217  Buffer B."
217                     (if remerging "Re-merging" "Merging")                     (if remerging "Re-merging" "Merging")
218                     n                     n
219                     ediff-number-of-differences))                     ediff-number-of-differences))
220                
221        (setq state-of-merge (ediff-get-state-of-merge n))        (setq state-of-merge (ediff-get-state-of-merge n))
222    
223        (if remerging        (if remerging
# Line 225  Buffer B." Line 225  Buffer B."
225            ;;    (reg-B (ediff-get-region-contents n 'B ediff-control-buffer))            ;;    (reg-B (ediff-get-region-contents n 'B ediff-control-buffer))
226            ;;    (reg-C (ediff-get-region-contents n 'C ediff-control-buffer)))            ;;    (reg-C (ediff-get-region-contents n 'C ediff-control-buffer)))
227            (let ()            (let ()
228                    
229              ;; if region was edited since it was first set by default              ;; if region was edited since it was first set by default
230              (if (or (ediff-merge-changed-from-default-p n)              (if (or (ediff-merge-changed-from-default-p n)
231                      ;; was preferred                      ;; was preferred
232                      (string-match "prefer" state-of-merge))                      (string-match "prefer" state-of-merge))
233                  ;; then ignore                  ;; then ignore
234                  (setq do-not-copy t))                  (setq do-not-copy t))
235                    
236              ;; change state of merge for this diff, if necessary              ;; change state of merge for this diff, if necessary
237              (if (and (string-match "\\(default\\|combined\\)" state-of-merge)              (if (and (string-match "\\(default\\|combined\\)" state-of-merge)
238                       (not do-not-copy))                       (not do-not-copy))
239                  (ediff-set-state-of-merge                  (ediff-set-state-of-merge
240                   n (format "%S" ediff-default-variant)))                   n (format "%S" ediff-default-variant)))
241              ))              ))
242              
243        ;; state-of-merge may have changed via ediff-set-state-of-merge, so        ;; state-of-merge may have changed via ediff-set-state-of-merge, so
244        ;; check it once again        ;; check it once again
245        (setq state-of-merge (ediff-get-state-of-merge n))        (setq state-of-merge (ediff-get-state-of-merge n))
246          
247        (or do-not-copy        (or do-not-copy
248            (if (string= state-of-merge "combined")            (if (string= state-of-merge "combined")
249                ;; use n+1 because ediff-combine-diffs works via user numbering                ;; use n+1 because ediff-combine-diffs works via user numbering
250                ;; of diffs, which is 1+ to what ediff uses internally                ;; of diffs, which is 1+ to what ediff uses internally
251                (ediff-combine-diffs (1+ n) 'batch)                (ediff-combine-diffs (1+ n) 'batch)
252              (ediff-copy-diff              (ediff-copy-diff
253               n (if (string-match "-A" state-of-merge) 'A 'B) 'C 'batch)))               n (if (string-match "-A" state-of-merge) 'A 'B) 'C 'batch)))
254        (setq n (1+ n)))        (setq n (1+ n)))
255      (message "Merging buffers A & B into C ... Done")      (message "Merging buffers A & B into C ... Done")
256      ))      ))
257        
258    
259  (defun ediff-re-merge ()  (defun ediff-re-merge ()
260    "Remerge unmodified diff regions using a new default.  Start with the current region."    "Remerge unmodified diff regions using a new default.  Start with the current region."
# Line 266  Buffer B." Line 266  Buffer B."
266                    default-variant-alist)))                    default-variant-alist)))
267      (setq ediff-default-variant      (setq ediff-default-variant
268            (intern            (intern
269             (completing-read             (completing-read
270              (format "Current merge default is `%S'.  New default: "              (format "Current merge default is `%S'.  New default: "
271                      ediff-default-variant)                      ediff-default-variant)
272              actual-alist nil 'must-match)))              actual-alist nil 'must-match)))
273      (ediff-do-merge ediff-current-difference 'remerge)      (ediff-do-merge ediff-current-difference 'remerge)
274      (ediff-recenter)      (ediff-recenter)
275    ))    ))
276        
277  (defun ediff-shrink-window-C (arg)  (defun ediff-shrink-window-C (arg)
278    "Shrink window C to just one line.    "Shrink window C to just one line.
279  With a prefix argument, returns window C to its normal size.  With a prefix argument, returns window C to its normal size.
# Line 307  Combining is done according to the speci Line 307  Combining is done according to the speci
307  `ediff-combination-pattern'."  `ediff-combination-pattern'."
308    (interactive "P")    (interactive "P")
309    (setq n (if (numberp n) (1- n) ediff-current-difference))    (setq n (if (numberp n) (1- n) ediff-current-difference))
310      
311    (let (reg-combined)    (let (reg-combined)
312      ;;(setq regA (ediff-get-region-contents n 'A ediff-control-buffer)      ;;(setq regA (ediff-get-region-contents n 'A ediff-control-buffer)
313      ;;    regB (ediff-get-region-contents n 'B ediff-control-buffer))      ;;    regB (ediff-get-region-contents n 'B ediff-control-buffer))
314      ;;(setq reg-combined (ediff-make-combined-diff regA regB))      ;;(setq reg-combined (ediff-make-combined-diff regA regB))
315      (setq reg-combined (ediff-get-combined-region n))      (setq reg-combined (ediff-get-combined-region n))
316        
317      (ediff-copy-diff n nil 'C batch-invocation reg-combined))      (ediff-copy-diff n nil 'C batch-invocation reg-combined))
318      (or batch-invocation (ediff-jump-to-difference (1+ n))))      (or batch-invocation (ediff-jump-to-difference (1+ n))))
319        
320    
321  ;; Checks if the region in buff C looks like a combination of the regions  ;; Checks if the region in buff C looks like a combination of the regions
322  ;; in buffers A and B.  Return a list (reg-a-beg reg-a-end reg-b-beg reg-b-end)  ;; in buffers A and B.  Return a list (reg-a-beg reg-a-end reg-b-beg reg-b-end)
# Line 331  Combining is done according to the speci Line 331  Combining is done according to the speci
331              (mrgreg-end (ediff-get-diff-posn 'C 'end region-num))              (mrgreg-end (ediff-get-diff-posn 'C 'end region-num))
332              (pattern-list ediff-combination-pattern)              (pattern-list ediff-combination-pattern)
333              delim reg-beg reg-end delim-regs-list)              delim reg-beg reg-end delim-regs-list)
334            
335          (if combined          (if combined
336              (ediff-with-current-buffer ediff-buffer-C              (ediff-with-current-buffer ediff-buffer-C
337                (while pattern-list                (while pattern-list
# Line 364  Combining is done according to the speci Line 364  Combining is done according to the speci
364          (reg-C (ediff-get-region-contents diff-num 'C ediff-control-buffer)))          (reg-C (ediff-get-region-contents diff-num 'C ediff-control-buffer)))
365    
366      (setq state-of-merge (ediff-get-state-of-merge diff-num))      (setq state-of-merge (ediff-get-state-of-merge diff-num))
367                    
368      ;; if region was edited since it was first set by default      ;; if region was edited since it was first set by default
369      (or (and (string= state-of-merge "default-A")      (or (and (string= state-of-merge "default-A")
370               (not (string= reg-A reg-C)))               (not (string= reg-A reg-C)))
# Line 380  Combining is done according to the speci Line 380  Combining is done according to the speci
380               (string= state-of-merge "prefer-B")               (string= state-of-merge "prefer-B")
381               (not (string= reg-B reg-C)))               (not (string= reg-B reg-C)))
382          )))          )))
383      
384    
385  ;;; Local Variables:  ;;; Local Variables:
386  ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)  ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)

Legend:
Removed from v.1.22  
changed lines
  Added in v.1.22.4.1

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26