# HG changeset patch # User Stefan Monnier # Date 953686495 0 # Node ID 108ba8d610366131ef1fb457bbfc088c367b3ca4 # Parent 57c889c9cedb4f10a59f6fa2f44d22b70746389a (smerge-auto-leave): New function and variable. (smerge-basic-map): Rename from smerge-basic-keymap. Change the bindings for smerge-diff-*. (smerge-*-map): Use easy-mmode-defmap. (smerge-(next|prev)): Use easy-mmode-define-navigation. (smerge-keep-*): Use smerge-auto-leave. diff -r 57c889c9cedb -r 108ba8d61036 lisp/smerge-mode.el --- a/lisp/smerge-mode.el Wed Mar 22 00:39:25 2000 +0000 +++ b/lisp/smerge-mode.el Wed Mar 22 00:54:55 2000 +0000 @@ -4,7 +4,7 @@ ;; Author: Stefan Monnier ;; Keywords: merge diff3 cvs conflict -;; Revision: $Id$ +;; Revision: $Id: smerge-mode.el,v 1.1 1999/12/09 13:00:21 monnier Exp $ ;; This file is part of GNU Emacs. @@ -40,6 +40,10 @@ ;; (smerge-mode 1)))) ;; (add-hook 'find-file-hooks 'sm-try-smerge t) +;;; Todo: + +;; - if requested, ask the user whether he wants to call ediff right away + ;;; Code: (eval-when-compile (require 'cl)) @@ -67,6 +71,11 @@ :group 'smerge :type '(repeat string)) +(defcustom smerge-auto-leave t + "*Non-nil means to leave `smerge-mode' when the last conflict is resolved." + :group 'smerge + :type 'boolean) + (defface smerge-mine-face '((t (:foreground "blue"))) "Face for your code." @@ -91,17 +100,7 @@ :group 'smerge) (defvar smerge-markers-face 'smerge-markers-face) -(defmacro smerge-defmap (var bindings &optional doc) - `(defvar ,var - (let ((m (make-sparse-keymap))) - (dolist (b ,bindings) - (if (equal (car b) "") - (set-keymap-parent m (cdr b)) - (define-key m (car b) (cdr b)))) - m) - ,doc)) - -(smerge-defmap smerge-basic-keymap +(easy-mmode-defmap smerge-basic-map '(("n" . smerge-next) ("p" . smerge-prev) ("a" . smerge-keep-all) @@ -110,19 +109,18 @@ ("m" . smerge-keep-mine) ("E" . smerge-ediff) ("\C-m" . smerge-keep-current) - ("<" . smerge-diff-base-mine) - (">" . smerge-diff-base-other) - ("=" . smerge-diff-mine-other)) + ("d<" . smerge-diff-base-mine) + ("d>" . smerge-diff-base-other) + ("d=" . smerge-diff-mine-other)) "The base keymap for `smerge-mode'.") -(fset 'smerge-basic-keymap smerge-basic-keymap) (defcustom smerge-command-prefix "\e" "Prefix for `smerge-mode' commands." :group 'smerge :type '(choice (string "\e") (string "C-x^") (string "") string)) -(smerge-defmap smerge-mode-map - `((,smerge-command-prefix . smerge-basic-keymap)) +(easy-mmode-defmap smerge-mode-map + `((,smerge-command-prefix . ,smerge-basic-map)) "Keymap for `smerge-mode'.") (easy-menu-define smerge-mode-menu smerge-mode-map @@ -163,23 +161,8 @@ ;;;; Actual code ;;;; -(defun smerge-next (&optional count) - "Go to the next COUNT'th conflict." - (interactive) - (unless count (setq count 1)) - (if (< count 0) (smerge-prev (- count)) - (if (looking-at smerge-begin-re) (incf count)) - (unless (re-search-forward smerge-begin-re nil t count) - (error "No next conflict")) - (goto-char (match-beginning 0)))) - -(defun smerge-prev (&optional count) - "Go to the previous COUNT'th conflict." - (interactive) - (unless count (setq count 1)) - (if (< count 0) (smerge-next (- count)) - (unless (re-search-backward smerge-begin-re nil t count) - (error "No previous conflict")))) +;; Define smerge-next and smerge-prev +(easy-mmode-define-navigation smerge smerge-begin-re "conflict") (defconst smerge-match-names ["conflict" "mine" "base" "other"]) @@ -187,6 +170,13 @@ (unless (match-end n) (error (format "No `%s'" (aref smerge-match-names n))))) +(defun smerge-auto-leave () + (when (and smerge-auto-leave + (save-excursion (goto-char (point-min)) + (not (re-search-forward smerge-begin-re nil t)))) + (smerge-mode -1))) + + (defun smerge-keep-all () "Keep all three versions. Convenient for the kind of conflicts that can arise in ChangeLog files." @@ -195,28 +185,32 @@ (replace-match (concat (or (match-string 1) "") (or (match-string 2) "") (or (match-string 3) "")) - t t)) + t t) + (smerge-auto-leave)) (defun smerge-keep-base () "Revert to the base version." (interactive) (smerge-match-conflict) (smerge-ensure-match 2) - (replace-match (match-string 2) t t)) + (replace-match (match-string 2) t t) + (smerge-auto-leave)) (defun smerge-keep-other () "Use \"other\" version." (interactive) (smerge-match-conflict) ;;(smerge-ensure-match 3) - (replace-match (match-string 3) t t)) + (replace-match (match-string 3) t t) + (smerge-auto-leave)) (defun smerge-keep-mine () "Keep your version." (interactive) (smerge-match-conflict) ;;(smerge-ensure-match 1) - (replace-match (match-string 1) t t)) + (replace-match (match-string 1) t t) + (smerge-auto-leave)) (defun smerge-keep-current () "Use the current (under the cursor) version." @@ -228,7 +222,8 @@ (>= (point) (match-end i))) (decf i)) (if (<= i 0) (error "Not inside a version") - (replace-match (match-string i) t t)))) + (replace-match (match-string i) t t) + (smerge-auto-leave)))) (defun smerge-diff-base-mine () "Diff 'base' and 'mine' version in current conflict region." @@ -448,6 +443,10 @@ (provide 'smerge-mode) ;;; Change Log: -;; $Log$ +;; $Log: smerge-mode.el,v $ +;; Revision 1.1 1999/12/09 13:00:21 monnier +;; New file. Provides a simple minor-mode for files containing +;; diff3-style conflict markers, such as generated by RCS +;; ;;; smerge-mode.el ends here