diff options
| author | Stefan Monnier | 2004-03-10 23:42:37 +0000 |
|---|---|---|
| committer | Stefan Monnier | 2004-03-10 23:42:37 +0000 |
| commit | 7d85a64e42336fb6330a1d89aa1e47b0af8e265a (patch) | |
| tree | 29ba4086cf591ed2e8fbc249d55aafe1b48f375a | |
| parent | 197d4ebcbcc24adcaa1a5e6995bef8be15ea76ae (diff) | |
| download | emacs-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.el | 62 |
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)))) |