aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2004-03-23 19:56:42 +0000
committerStefan Monnier2004-03-23 19:56:42 +0000
commit5bd8d87b8563f93070292d95144b03793a930104 (patch)
treed91d8881f3117b3a86d593180bbc34aec8c12f0e
parentef3e91755f45be240466d5d62178a5eeeecc36ba (diff)
downloademacs-5bd8d87b8563f93070292d95144b03793a930104.tar.gz
emacs-5bd8d87b8563f93070292d95144b03793a930104.zip
(smerge-mode-menu): Fix activate pred for resolve.
(smerge-context-menu-map): Remove unused var. (smerge-keep-all): Preserve markers. (smerge-keep-n): New fun. (smerge-keep-base, smerge-keep-other, smerge-keep-mine) (smerge-keep-current, smerge-ediff): Use it. (smerge-kill-current): Use it. Make it work on some 3-part conflicts. (smerge-popup-context-menu): Also use context-menu on 3-part conflicts. (smerge-resolve): Resolve trivial 3-part conflicts.
-rw-r--r--lisp/smerge-mode.el119
1 files changed, 72 insertions, 47 deletions
diff --git a/lisp/smerge-mode.el b/lisp/smerge-mode.el
index add5d718c25..9778bb35b01 100644
--- a/lisp/smerge-mode.el
+++ b/lisp/smerge-mode.el
@@ -179,16 +179,13 @@ Used in `smerge-diff-base-mine' and related functions."
179 :help "Use Ediff to resolve the conflicts" 179 :help "Use Ediff to resolve the conflicts"
180 :active (smerge-check 1)] 180 :active (smerge-check 1)]
181 ["Auto Resolve" smerge-resolve 181 ["Auto Resolve" smerge-resolve
182 :help "Use mode-provided resolution function" 182 :help "Try auto-resolution heuristics"
183 :active (and (smerge-check 1) (local-variable-p 'smerge-resolve-function))] 183 :active (smerge-check 1)]
184 ["Combine" smerge-combine-with-next 184 ["Combine" smerge-combine-with-next
185 :help "Combine current conflict with next" 185 :help "Combine current conflict with next"
186 :active (smerge-check 1)] 186 :active (smerge-check 1)]
187 )) 187 ))
188 188
189(easy-mmode-defmap smerge-context-menu-map
190 `(([down-mouse-3] . smerge-activate-context-menu))
191 "Keymap for context menu appeared on conflicts area.")
192(easy-menu-define smerge-context-menu nil 189(easy-menu-define smerge-context-menu nil
193 "Context menu for mine area in `smerge-mode'." 190 "Context menu for mine area in `smerge-mode'."
194 '(nil 191 '(nil
@@ -246,15 +243,22 @@ Can be nil if the style is undecided, or else:
246 243
247 244
248(defun smerge-keep-all () 245(defun smerge-keep-all ()
249 "Keep all three versions. 246 "Concatenate all versions."
250Convenient for the kind of conflicts that can arise in ChangeLog files."
251 (interactive) 247 (interactive)
252 (smerge-match-conflict) 248 (smerge-match-conflict)
253 (replace-match (concat (or (match-string 1) "") 249 (let ((mb2 (or (match-beginning 2) (point-max)))
254 (or (match-string 2) "") 250 (me2 (or (match-end 2) (point-min))))
255 (or (match-string 3) "")) 251 (delete-region (match-end 3) (match-end 0))
256 t t) 252 (delete-region (max me2 (match-end 1)) (match-beginning 3))
257 (smerge-auto-leave)) 253 (if (and (match-end 2) (/= (match-end 1) (match-end 3)))
254 (delete-region (match-end 1) (match-beginning 2)))
255 (delete-region (match-beginning 0) (min (match-beginning 1) mb2))
256 (smerge-auto-leave)))
257
258(defun smerge-keep-n (n)
259 ;; We used to use replace-match, but that did not preserve markers so well.
260 (delete-region (match-end n) (match-end 0))
261 (delete-region (match-beginning 0) (match-beginning n)))
258 262
259(defun smerge-combine-with-next () 263(defun smerge-combine-with-next ()
260 "Combine the current conflict with the next one." 264 "Combine the current conflict with the next one."
@@ -310,32 +314,30 @@ according to `smerge-match-conflict'.")
310 "Pop up the Smerge mode context menu under mouse." 314 "Pop up the Smerge mode context menu under mouse."
311 (interactive "e") 315 (interactive "e")
312 (if (and smerge-mode 316 (if (and smerge-mode
313 (save-excursion (mouse-set-point event) (smerge-check 1))) 317 (save-excursion (mouse-set-point event) (smerge-check 1)))
314 (progn 318 (progn
315 (mouse-set-point event) 319 (mouse-set-point event)
316 (smerge-match-conflict) 320 (smerge-match-conflict)
317 (let ((i (smerge-get-current)) 321 (let ((i (smerge-get-current))
318 o) 322 o)
319 (if (<= i 0) 323 (if (<= i 0)
320 ;; Out of range 324 ;; Out of range
321 (popup-menu smerge-mode-menu) 325 (popup-menu smerge-mode-menu)
322 ;; Install overlay. 326 ;; Install overlay.
323 (setq o (make-overlay (match-beginning i) (match-end i))) 327 (setq o (make-overlay (match-beginning i) (match-end i)))
324 (unwind-protect 328 (unwind-protect
325 (progn 329 (progn
326 (overlay-put o 'face 'highlight) 330 (overlay-put o 'face 'highlight)
327 (sit-for 0) 331 (sit-for 0) ;Display the new highlighting.
328 (popup-menu (if (smerge-check 2) 332 (popup-menu smerge-context-menu))
329 smerge-mode-menu 333 ;; Delete overlay.
330 smerge-context-menu))) 334 (delete-overlay o)))))
331 ;; Delete overlay.
332 (delete-overlay o)))))
333 ;; There's no conflict at point, the text-props are just obsolete. 335 ;; There's no conflict at point, the text-props are just obsolete.
334 (save-excursion 336 (save-excursion
335 (let ((beg (re-search-backward smerge-end-re nil t)) 337 (let ((beg (re-search-backward smerge-end-re nil t))
336 (end (re-search-forward smerge-begin-re nil t))) 338 (end (re-search-forward smerge-begin-re nil t)))
337 (smerge-remove-props (or beg (point-min)) (or end (point-max))) 339 (smerge-remove-props (or beg (point-min)) (or end (point-max)))
338 (push event unread-command-events))))) 340 (push event unread-command-events)))))
339 341
340(defun smerge-resolve () 342(defun smerge-resolve ()
341 "Resolve the conflict at point intelligently. 343 "Resolve the conflict at point intelligently.
@@ -344,7 +346,24 @@ some major modes. Uses `smerge-resolve-function' to do the actual work."
344 (interactive) 346 (interactive)
345 (smerge-match-conflict) 347 (smerge-match-conflict)
346 (smerge-remove-props) 348 (smerge-remove-props)
347 (funcall smerge-resolve-function) 349 (cond
350 ;; Trivial diff3 -A non-conflicts.
351 ((and (eq (match-end 1) (match-end 3))
352 (eq (match-beginning 1) (match-beginning 3)))
353 ;; FIXME: Add "if [ diff -b MINE OTHER ]; then select OTHER; fi"
354 (smerge-keep-n 3))
355 ((and (match-end 2)
356 ;; FIXME: Add "diff -b BASE MINE | patch OTHER".
357 ;; FIXME: Add "diff -b BASE OTHER | patch MINE".
358 nil)
359 )
360 ((and (not (match-end 2))
361 ;; FIXME: Add "diff -b"-based refinement.
362 nil)
363 )
364 (t
365 ;; Mode-specific conflict resolution.
366 (funcall smerge-resolve-function)))
348 (smerge-auto-leave)) 367 (smerge-auto-leave))
349 368
350(defun smerge-keep-base () 369(defun smerge-keep-base ()
@@ -353,7 +372,7 @@ some major modes. Uses `smerge-resolve-function' to do the actual work."
353 (smerge-match-conflict) 372 (smerge-match-conflict)
354 (smerge-ensure-match 2) 373 (smerge-ensure-match 2)
355 (smerge-remove-props) 374 (smerge-remove-props)
356 (replace-match (match-string 2) t t) 375 (smerge-keep-n 2)
357 (smerge-auto-leave)) 376 (smerge-auto-leave))
358 377
359(defun smerge-keep-other () 378(defun smerge-keep-other ()
@@ -362,7 +381,7 @@ some major modes. Uses `smerge-resolve-function' to do the actual work."
362 (smerge-match-conflict) 381 (smerge-match-conflict)
363 ;;(smerge-ensure-match 3) 382 ;;(smerge-ensure-match 3)
364 (smerge-remove-props) 383 (smerge-remove-props)
365 (replace-match (match-string 3) t t) 384 (smerge-keep-n 3)
366 (smerge-auto-leave)) 385 (smerge-auto-leave))
367 386
368(defun smerge-keep-mine () 387(defun smerge-keep-mine ()
@@ -371,7 +390,7 @@ some major modes. Uses `smerge-resolve-function' to do the actual work."
371 (smerge-match-conflict) 390 (smerge-match-conflict)
372 ;;(smerge-ensure-match 1) 391 ;;(smerge-ensure-match 1)
373 (smerge-remove-props) 392 (smerge-remove-props)
374 (replace-match (match-string 1) t t) 393 (smerge-keep-n 1)
375 (smerge-auto-leave)) 394 (smerge-auto-leave))
376 395
377(defun smerge-get-current () 396(defun smerge-get-current ()
@@ -389,7 +408,7 @@ some major modes. Uses `smerge-resolve-function' to do the actual work."
389 (let ((i (smerge-get-current))) 408 (let ((i (smerge-get-current)))
390 (if (<= i 0) (error "Not inside a version") 409 (if (<= i 0) (error "Not inside a version")
391 (smerge-remove-props) 410 (smerge-remove-props)
392 (replace-match (match-string i) t t) 411 (smerge-keep-n i)
393 (smerge-auto-leave)))) 412 (smerge-auto-leave))))
394 413
395(defun smerge-kill-current () 414(defun smerge-kill-current ()
@@ -399,11 +418,15 @@ some major modes. Uses `smerge-resolve-function' to do the actual work."
399 (let ((i (smerge-get-current))) 418 (let ((i (smerge-get-current)))
400 (if (<= i 0) (error "Not inside a version") 419 (if (<= i 0) (error "Not inside a version")
401 (smerge-remove-props) 420 (smerge-remove-props)
402 (replace-match (mapconcat 421 (let ((left nil))
403 (lambda (j) 422 (dolist (n '(3 2 1))
404 (match-string j)) 423 (if (and (match-end n) (/= (match-end n) (match-end i)))
405 (remove i '(1 2 3)) "") t t) 424 (push n left)))
406 (smerge-auto-leave)))) 425 (if (and (cdr left)
426 (/= (match-end (car left)) (match-end (cadr left))))
427 (ding) ;We don't know how to do that.
428 (smerge-keep-n (car left))
429 (smerge-auto-leave))))))
407 430
408(defun smerge-diff-base-mine () 431(defun smerge-diff-base-mine ()
409 "Diff 'base' and 'mine' version in current conflict region." 432 "Diff 'base' and 'mine' version in current conflict region."
@@ -567,7 +590,7 @@ buffer names."
567 (goto-char (point-min)) 590 (goto-char (point-min))
568 (while (smerge-find-conflict) 591 (while (smerge-find-conflict)
569 (when (match-beginning 2) (setq base t)) 592 (when (match-beginning 2) (setq base t))
570 (replace-match (match-string 1) t t)) 593 (smerge-keep-n 1))
571 (buffer-enable-undo) 594 (buffer-enable-undo)
572 (set-buffer-modified-p nil) 595 (set-buffer-modified-p nil)
573 (funcall mode)) 596 (funcall mode))
@@ -577,7 +600,7 @@ buffer names."
577 (insert-buffer-substring buf) 600 (insert-buffer-substring buf)
578 (goto-char (point-min)) 601 (goto-char (point-min))
579 (while (smerge-find-conflict) 602 (while (smerge-find-conflict)
580 (replace-match (match-string 3) t t)) 603 (smerge-keep-n 3))
581 (buffer-enable-undo) 604 (buffer-enable-undo)
582 (set-buffer-modified-p nil) 605 (set-buffer-modified-p nil)
583 (funcall mode)) 606 (funcall mode))
@@ -590,7 +613,9 @@ buffer names."
590 (insert-buffer-substring buf) 613 (insert-buffer-substring buf)
591 (goto-char (point-min)) 614 (goto-char (point-min))
592 (while (smerge-find-conflict) 615 (while (smerge-find-conflict)
593 (replace-match (or (match-string 2) "") t t)) 616 (if (match-end 2)
617 (smerge-keep-n 2)
618 (delete-region (match-beginning 0) (match-end 0))))
594 (buffer-enable-undo) 619 (buffer-enable-undo)
595 (set-buffer-modified-p nil) 620 (set-buffer-modified-p nil)
596 (funcall mode))) 621 (funcall mode)))