diff options
| author | Stefan Monnier | 2004-03-23 19:56:42 +0000 |
|---|---|---|
| committer | Stefan Monnier | 2004-03-23 19:56:42 +0000 |
| commit | 5bd8d87b8563f93070292d95144b03793a930104 (patch) | |
| tree | d91d8881f3117b3a86d593180bbc34aec8c12f0e | |
| parent | ef3e91755f45be240466d5d62178a5eeeecc36ba (diff) | |
| download | emacs-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.el | 119 |
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." |
| 250 | Convenient 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))) |