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