aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2004-03-10 23:42:37 +0000
committerStefan Monnier2004-03-10 23:42:37 +0000
commit7d85a64e42336fb6330a1d89aa1e47b0af8e265a (patch)
tree29ba4086cf591ed2e8fbc249d55aafe1b48f375a
parent197d4ebcbcc24adcaa1a5e6995bef8be15ea76ae (diff)
downloademacs-7d85a64e42336fb6330a1d89aa1e47b0af8e265a.tar.gz
emacs-7d85a64e42336fb6330a1d89aa1e47b0af8e265a.zip
(smerge-check-cache, smerge-check): New var and fun.
(smerge-mode-menu): Use it to deactivate menu entries. (smerge-keep-current): New fun. (smerge-keep-current): Use it.
-rw-r--r--lisp/smerge-mode.el62
1 files changed, 47 insertions, 15 deletions
diff --git a/lisp/smerge-mode.el b/lisp/smerge-mode.el
index 320c9eb1734..711ceefedc0 100644
--- a/lisp/smerge-mode.el
+++ b/lisp/smerge-mode.el
@@ -1,10 +1,10 @@
1;;; smerge-mode.el --- Minor mode to resolve diff3 conflicts 1;;; smerge-mode.el --- Minor mode to resolve diff3 conflicts
2 2
3;; Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. 3;; Copyright (C) 1999, 2000, 01, 03, 2004 Free Software Foundation, Inc.
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.24 2003/10/06 16:34:59 fx Exp $
8 8
9;; This file is part of GNU Emacs. 9;; This file is part of GNU Emacs.
10 10
@@ -137,26 +137,54 @@ Used in `smerge-diff-base-mine' and related functions."
137 `((,smerge-command-prefix . ,smerge-basic-map)) 137 `((,smerge-command-prefix . ,smerge-basic-map))
138 "Keymap for `smerge-mode'.") 138 "Keymap for `smerge-mode'.")
139 139
140(defvar smerge-check-cache nil)
141(make-variable-buffer-local 'smerge-check-cache)
142(defun smerge-check (n)
143 (condition-case nil
144 (let ((state (cons (point) (buffer-modified-tick))))
145 (unless (equal (cdr smerge-check-cache) state)
146 (smerge-match-conflict)
147 (setq smerge-check-cache (cons (match-data) state)))
148 (nth (* 2 n) (car smerge-check-cache)))
149 (error nil)))
150
140(easy-menu-define smerge-mode-menu smerge-mode-map 151(easy-menu-define smerge-mode-menu smerge-mode-map
141 "Menu for `smerge-mode'." 152 "Menu for `smerge-mode'."
142 '("SMerge" 153 '("SMerge"
143 ["Next" smerge-next :help "Go to next conflict"] 154 ["Next" smerge-next :help "Go to next conflict"]
144 ["Previous" smerge-prev :help "Go to previous conflict"] 155 ["Previous" smerge-prev :help "Go to previous conflict"]
145 ["Keep All" smerge-keep-all :help "Keep all three versions"] 156 "--"
146 ["Revert to Base" smerge-keep-base :help "Revert to base version"] 157 ["Keep All" smerge-keep-all :help "Keep all three versions"
147 ["Keep Other" smerge-keep-other :help "Keep `other' version"] 158 :active (smerge-check 1)]
148 ["Keep Yours" smerge-keep-mine :help "Keep your version"] 159 ["Keep Current" smerge-keep-current :help "Use current (at point) version"
149 ["Keep Current" smerge-keep-current :help "Use current (at point) version"] 160 :active (and (smerge-check 1) (> (smerge-get-current) 0))]
161 "--"
162 ["Revert to Base" smerge-keep-base :help "Revert to base version"
163 :active (smerge-check 2)]
164 ["Keep Other" smerge-keep-other :help "Keep `other' version"
165 :active (smerge-check 3)]
166 ["Keep Yours" smerge-keep-mine :help "Keep your version"
167 :active (smerge-check 1)]
150 "--" 168 "--"
151 ["Diff Base/Mine" smerge-diff-base-mine 169 ["Diff Base/Mine" smerge-diff-base-mine
152 :help "Diff `base' and `mine' for current conflict"] 170 :help "Diff `base' and `mine' for current conflict"
171 :active (smerge-check 2)]
153 ["Diff Base/Other" smerge-diff-base-other 172 ["Diff Base/Other" smerge-diff-base-other
154 :help "Diff `base' and `other' for current conflict"] 173 :help "Diff `base' and `other' for current conflict"
174 :active (smerge-check 2)]
155 ["Diff Mine/Other" smerge-diff-mine-other 175 ["Diff Mine/Other" smerge-diff-mine-other
156 :help "Diff `mine' and `other' for current conflict"] 176 :help "Diff `mine' and `other' for current conflict"
177 :active (smerge-check 1)]
157 "--" 178 "--"
158 ["Invoke Ediff" smerge-ediff 179 ["Invoke Ediff" smerge-ediff
159 :help "Use Ediff to resolve the conflicts"] 180 :help "Use Ediff to resolve the conflicts"
181 :active (smerge-check 1)]
182 ["Auto Resolve" smerge-resolve
183 :help "Use mode-provided resolution function"
184 :active (and (smerge-check 1) (local-variable-p 'smerge-resolve-function))]
185 ["Combine" smerge-combine-with-next
186 :help "Combine current conflict with next"
187 :active (smerge-check 1)]
160 )) 188 ))
161 189
162(defconst smerge-font-lock-keywords 190(defconst smerge-font-lock-keywords
@@ -288,15 +316,19 @@ some major modes. Uses `smerge-resolve-function' to do the actual work."
288 (replace-match (match-string 1) t t) 316 (replace-match (match-string 1) t t)
289 (smerge-auto-leave)) 317 (smerge-auto-leave))
290 318
291(defun smerge-keep-current () 319(defun smerge-get-current ()
292 "Use the current (under the cursor) version."
293 (interactive)
294 (smerge-match-conflict)
295 (let ((i 3)) 320 (let ((i 3))
296 (while (or (not (match-end i)) 321 (while (or (not (match-end i))
297 (< (point) (match-beginning i)) 322 (< (point) (match-beginning i))
298 (>= (point) (match-end i))) 323 (>= (point) (match-end i)))
299 (decf i)) 324 (decf i))
325 i))
326
327(defun smerge-keep-current ()
328 "Use the current (under the cursor) version."
329 (interactive)
330 (smerge-match-conflict)
331 (let ((i (smerge-get-current)))
300 (if (<= i 0) (error "Not inside a version") 332 (if (<= i 0) (error "Not inside a version")
301 (replace-match (match-string i) t t) 333 (replace-match (match-string i) t t)
302 (smerge-auto-leave)))) 334 (smerge-auto-leave))))