aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2000-03-22 00:54:55 +0000
committerStefan Monnier2000-03-22 00:54:55 +0000
commitf97e9a8a437aa6b7f4997cfb613a6955221efc79 (patch)
tree29899f69878640b5c9a8e0edf4681f86df7a84ff
parent0ae39f53387ddc5e86114ce723606eb6bc0e6e13 (diff)
downloademacs-f97e9a8a437aa6b7f4997cfb613a6955221efc79.tar.gz
emacs-f97e9a8a437aa6b7f4997cfb613a6955221efc79.zip
(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.
-rw-r--r--lisp/smerge-mode.el81
1 files changed, 40 insertions, 41 deletions
diff --git a/lisp/smerge-mode.el b/lisp/smerge-mode.el
index 14b0a3acaca..bc6fe40432f 100644
--- a/lisp/smerge-mode.el
+++ b/lisp/smerge-mode.el
@@ -4,7 +4,7 @@
4 4
5;; Author: Stefan Monnier <monnier@cs.yale.edu> 5;; Author: Stefan Monnier <monnier@cs.yale.edu>
6;; Keywords: merge diff3 cvs conflict 6;; Keywords: merge diff3 cvs conflict
7;; Revision: $Id$ 7;; Revision: $Id: smerge-mode.el,v 1.1 1999/12/09 13:00:21 monnier Exp $
8 8
9;; This file is part of GNU Emacs. 9;; This file is part of GNU Emacs.
10 10
@@ -40,6 +40,10 @@
40;; (smerge-mode 1)))) 40;; (smerge-mode 1))))
41;; (add-hook 'find-file-hooks 'sm-try-smerge t) 41;; (add-hook 'find-file-hooks 'sm-try-smerge t)
42 42
43;;; Todo:
44
45;; - if requested, ask the user whether he wants to call ediff right away
46
43;;; Code: 47;;; Code:
44 48
45(eval-when-compile (require 'cl)) 49(eval-when-compile (require 'cl))
@@ -67,6 +71,11 @@ Used in `smerge-diff-base-mine' and related functions."
67 :group 'smerge 71 :group 'smerge
68 :type '(repeat string)) 72 :type '(repeat string))
69 73
74(defcustom smerge-auto-leave t
75 "*Non-nil means to leave `smerge-mode' when the last conflict is resolved."
76 :group 'smerge
77 :type 'boolean)
78
70(defface smerge-mine-face 79(defface smerge-mine-face
71 '((t (:foreground "blue"))) 80 '((t (:foreground "blue")))
72 "Face for your code." 81 "Face for your code."
@@ -91,17 +100,7 @@ Used in `smerge-diff-base-mine' and related functions."
91 :group 'smerge) 100 :group 'smerge)
92(defvar smerge-markers-face 'smerge-markers-face) 101(defvar smerge-markers-face 'smerge-markers-face)
93 102
94(defmacro smerge-defmap (var bindings &optional doc) 103(easy-mmode-defmap smerge-basic-map
95 `(defvar ,var
96 (let ((m (make-sparse-keymap)))
97 (dolist (b ,bindings)
98 (if (equal (car b) "")
99 (set-keymap-parent m (cdr b))
100 (define-key m (car b) (cdr b))))
101 m)
102 ,doc))
103
104(smerge-defmap smerge-basic-keymap
105 '(("n" . smerge-next) 104 '(("n" . smerge-next)
106 ("p" . smerge-prev) 105 ("p" . smerge-prev)
107 ("a" . smerge-keep-all) 106 ("a" . smerge-keep-all)
@@ -110,19 +109,18 @@ Used in `smerge-diff-base-mine' and related functions."
110 ("m" . smerge-keep-mine) 109 ("m" . smerge-keep-mine)
111 ("E" . smerge-ediff) 110 ("E" . smerge-ediff)
112 ("\C-m" . smerge-keep-current) 111 ("\C-m" . smerge-keep-current)
113 ("<" . smerge-diff-base-mine) 112 ("d<" . smerge-diff-base-mine)
114 (">" . smerge-diff-base-other) 113 ("d>" . smerge-diff-base-other)
115 ("=" . smerge-diff-mine-other)) 114 ("d=" . smerge-diff-mine-other))
116 "The base keymap for `smerge-mode'.") 115 "The base keymap for `smerge-mode'.")
117(fset 'smerge-basic-keymap smerge-basic-keymap)
118 116
119(defcustom smerge-command-prefix "\e" 117(defcustom smerge-command-prefix "\e"
120 "Prefix for `smerge-mode' commands." 118 "Prefix for `smerge-mode' commands."
121 :group 'smerge 119 :group 'smerge
122 :type '(choice (string "\e") (string "C-x^") (string "") string)) 120 :type '(choice (string "\e") (string "C-x^") (string "") string))
123 121
124(smerge-defmap smerge-mode-map 122(easy-mmode-defmap smerge-mode-map
125 `((,smerge-command-prefix . smerge-basic-keymap)) 123 `((,smerge-command-prefix . ,smerge-basic-map))
126 "Keymap for `smerge-mode'.") 124 "Keymap for `smerge-mode'.")
127 125
128(easy-menu-define smerge-mode-menu smerge-mode-map 126(easy-menu-define smerge-mode-menu smerge-mode-map
@@ -163,23 +161,8 @@ Can be nil if the style is undecided, or else:
163;;;; Actual code 161;;;; Actual code
164;;;; 162;;;;
165 163
166(defun smerge-next (&optional count) 164;; Define smerge-next and smerge-prev
167 "Go to the next COUNT'th conflict." 165(easy-mmode-define-navigation smerge smerge-begin-re "conflict")
168 (interactive)
169 (unless count (setq count 1))
170 (if (< count 0) (smerge-prev (- count))
171 (if (looking-at smerge-begin-re) (incf count))
172 (unless (re-search-forward smerge-begin-re nil t count)
173 (error "No next conflict"))
174 (goto-char (match-beginning 0))))
175
176(defun smerge-prev (&optional count)
177 "Go to the previous COUNT'th conflict."
178 (interactive)
179 (unless count (setq count 1))
180 (if (< count 0) (smerge-next (- count))
181 (unless (re-search-backward smerge-begin-re nil t count)
182 (error "No previous conflict"))))
183 166
184(defconst smerge-match-names ["conflict" "mine" "base" "other"]) 167(defconst smerge-match-names ["conflict" "mine" "base" "other"])
185 168
@@ -187,6 +170,13 @@ Can be nil if the style is undecided, or else:
187 (unless (match-end n) 170 (unless (match-end n)
188 (error (format "No `%s'" (aref smerge-match-names n))))) 171 (error (format "No `%s'" (aref smerge-match-names n)))))
189 172
173(defun smerge-auto-leave ()
174 (when (and smerge-auto-leave
175 (save-excursion (goto-char (point-min))
176 (not (re-search-forward smerge-begin-re nil t))))
177 (smerge-mode -1)))
178
179
190(defun smerge-keep-all () 180(defun smerge-keep-all ()
191 "Keep all three versions. 181 "Keep all three versions.
192Convenient for the kind of conflicts that can arise in ChangeLog files." 182Convenient for the kind of conflicts that can arise in ChangeLog files."
@@ -195,28 +185,32 @@ Convenient for the kind of conflicts that can arise in ChangeLog files."
195 (replace-match (concat (or (match-string 1) "") 185 (replace-match (concat (or (match-string 1) "")
196 (or (match-string 2) "") 186 (or (match-string 2) "")
197 (or (match-string 3) "")) 187 (or (match-string 3) ""))
198 t t)) 188 t t)
189 (smerge-auto-leave))
199 190
200(defun smerge-keep-base () 191(defun smerge-keep-base ()
201 "Revert to the base version." 192 "Revert to the base version."
202 (interactive) 193 (interactive)
203 (smerge-match-conflict) 194 (smerge-match-conflict)
204 (smerge-ensure-match 2) 195 (smerge-ensure-match 2)
205 (replace-match (match-string 2) t t)) 196 (replace-match (match-string 2) t t)
197 (smerge-auto-leave))
206 198
207(defun smerge-keep-other () 199(defun smerge-keep-other ()
208 "Use \"other\" version." 200 "Use \"other\" version."
209 (interactive) 201 (interactive)
210 (smerge-match-conflict) 202 (smerge-match-conflict)
211 ;;(smerge-ensure-match 3) 203 ;;(smerge-ensure-match 3)
212 (replace-match (match-string 3) t t)) 204 (replace-match (match-string 3) t t)
205 (smerge-auto-leave))
213 206
214(defun smerge-keep-mine () 207(defun smerge-keep-mine ()
215 "Keep your version." 208 "Keep your version."
216 (interactive) 209 (interactive)
217 (smerge-match-conflict) 210 (smerge-match-conflict)
218 ;;(smerge-ensure-match 1) 211 ;;(smerge-ensure-match 1)
219 (replace-match (match-string 1) t t)) 212 (replace-match (match-string 1) t t)
213 (smerge-auto-leave))
220 214
221(defun smerge-keep-current () 215(defun smerge-keep-current ()
222 "Use the current (under the cursor) version." 216 "Use the current (under the cursor) version."
@@ -228,7 +222,8 @@ Convenient for the kind of conflicts that can arise in ChangeLog files."
228 (>= (point) (match-end i))) 222 (>= (point) (match-end i)))
229 (decf i)) 223 (decf i))
230 (if (<= i 0) (error "Not inside a version") 224 (if (<= i 0) (error "Not inside a version")
231 (replace-match (match-string i) t t)))) 225 (replace-match (match-string i) t t)
226 (smerge-auto-leave))))
232 227
233(defun smerge-diff-base-mine () 228(defun smerge-diff-base-mine ()
234 "Diff 'base' and 'mine' version in current conflict region." 229 "Diff 'base' and 'mine' version in current conflict region."
@@ -448,6 +443,10 @@ The point is moved to the end of the conflict."
448(provide 'smerge-mode) 443(provide 'smerge-mode)
449 444
450;;; Change Log: 445;;; Change Log:
451;; $Log$ 446;; $Log: smerge-mode.el,v $
447;; Revision 1.1 1999/12/09 13:00:21 monnier
448;; New file. Provides a simple minor-mode for files containing
449;; diff3-style conflict markers, such as generated by RCS
450;;
452 451
453;;; smerge-mode.el ends here 452;;; smerge-mode.el ends here