X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/c07bb40b73856e3c40daf1dc6007ea13e3870912..4fee0f87b61e02644ea46db6cc75a5f5c8b49b07:/lisp/smerge-mode.el diff --git a/lisp/smerge-mode.el b/lisp/smerge-mode.el index 8e239ab5a2..e3484bb0a4 100644 --- a/lisp/smerge-mode.el +++ b/lisp/smerge-mode.el @@ -10,7 +10,7 @@ ;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) +;; the Free Software Foundation; either version 3, or (at your option) ;; any later version. ;; GNU Emacs is distributed in the hope that it will be useful, @@ -324,7 +324,8 @@ Can be nil if the style is undecided, or else: (defvar smerge-resolve-function (lambda () (error "Don't know how to resolve")) "Mode-specific merge function. -The function is called with no argument and with the match data set +The function is called with zero or one argument (non-nil if the resolution +function should only apply safe heuristics) and with the match data set according to `smerge-match-conflict'.") (add-to-list 'debug-ignored-errors "Don't know how to resolve") @@ -378,7 +379,7 @@ according to `smerge-match-conflict'.") (smerge-remove-props (or beg (point-min)) (or end (point-max))) (push event unread-command-events))))) -(defun smerge-resolve () +(defun smerge-resolve (&optional safe) "Resolve the conflict at point intelligently. This relies on mode-specific knowledge and thus only works in some major modes. Uses `smerge-resolve-function' to do the actual work." @@ -393,8 +394,10 @@ some major modes. Uses `smerge-resolve-function' to do the actual work." ;; Mode-specific conflict resolution. ((condition-case nil (atomic-change-group - (funcall smerge-resolve-function) - t) + (if safe + (funcall smerge-resolve-function safe) + (funcall smerge-resolve-function)) + t) (error nil)) ;; Nothing to do: the resolution function has done it already. nil) @@ -412,6 +415,31 @@ some major modes. Uses `smerge-resolve-function' to do the actual work." (error "Don't know how to resolve"))) (smerge-auto-leave)) +(defun smerge-resolve-all () + "Perform automatic resolution on all conflicts." + (interactive) + (save-excursion + (goto-char (point-min)) + (while (re-search-forward smerge-begin-re nil t) + (condition-case nil + (progn + (smerge-match-conflict) + (smerge-resolve 'safe)) + (error nil))))) + +(defun smerge-batch-resolve () + ;; command-line-args-left is what is left of the command line. + (if (not noninteractive) + (error "`smerge-batch-resolve' is to be used only with -batch")) + (while command-line-args-left + (let ((file (pop command-line-args-left))) + (message "Resolving conflicts in %s..." file) + (when (file-readable-p file) + (with-current-buffer (find-file-noselect file) + (smerge-resolve-all) + (save-buffer) + (kill-buffer (current-buffer))))))) + (defun smerge-keep-base () "Revert to the base version." (interactive) @@ -677,7 +705,9 @@ Point is moved to the end of the conflict." (unwind-protect (with-temp-buffer (let ((coding-system-for-read 'emacs-mule)) - (call-process diff-command nil t nil file1 file2)) + ;; Don't forget -a to make sure diff treats it as a text file + ;; even if it contains \0 and such. + (call-process diff-command nil t nil "-a" file1 file2)) ;; Process diff's output. (goto-char (point-min)) (while (not (eobp)) @@ -831,6 +861,10 @@ buffer names." (message "Please resolve conflicts now; exit ediff when done"))) +(defconst smerge-parsep-re + (concat smerge-begin-re "\\|" smerge-end-re "\\|" + smerge-base-re "\\|" smerge-other-re "\\|")) + ;;;###autoload (define-minor-mode smerge-mode "Minor mode to simplify editing output from the diff3 program. @@ -845,6 +879,13 @@ buffer names." (while (smerge-find-conflict) (save-excursion (font-lock-fontify-region (match-beginning 0) (match-end 0) nil))))) + (if (string-match (regexp-quote smerge-parsep-re) paragraph-separate) + (unless smerge-mode + (set (make-local-variable 'paragraph-separate) + (replace-match "" t t paragraph-separate))) + (when smerge-mode + (set (make-local-variable 'paragraph-separate) + (concat smerge-parsep-re paragraph-separate)))) (unless smerge-mode (smerge-remove-props (point-min) (point-max))))