diff options
| author | Stefan Monnier | 2000-03-22 00:54:55 +0000 |
|---|---|---|
| committer | Stefan Monnier | 2000-03-22 00:54:55 +0000 |
| commit | f97e9a8a437aa6b7f4997cfb613a6955221efc79 (patch) | |
| tree | 29899f69878640b5c9a8e0edf4681f86df7a84ff | |
| parent | 0ae39f53387ddc5e86114ce723606eb6bc0e6e13 (diff) | |
| download | emacs-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.el | 81 |
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. |
| 192 | Convenient for the kind of conflicts that can arise in ChangeLog files." | 182 | Convenient 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 |