changeset 82035:da9840648bbd

(diff-unified->context): Use the new `apply' undo entry kind if applicable, so as to save undo-log space.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Sun, 22 Jul 2007 21:38:28 +0000
parents 11eee91b817d
children 93dd0897a398
files lisp/ChangeLog lisp/diff-mode.el
diffstat 2 files changed, 26 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sun Jul 22 21:28:14 2007 +0000
+++ b/lisp/ChangeLog	Sun Jul 22 21:38:28 2007 +0000
@@ -1,5 +1,8 @@
 2007-07-22  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+	* diff-mode.el (diff-unified->context): Use the new `apply' undo entry
+	if applicable, so as to save undo-log space.
+
 	* diff-mode.el (diff-find-file-name): Add arg `batch'.
 
 	* diff-mode.el (diff-beginning-of-file-and-junk): New function.
--- a/lisp/diff-mode.el	Sun Jul 22 21:28:14 2007 +0000
+++ b/lisp/diff-mode.el	Sun Jul 22 21:38:28 2007 +0000
@@ -701,7 +701,12 @@
 	    (let ((line1 (match-string 4))
 		  (lines1 (match-string 5))
 		  (line2 (match-string 6))
-		  (lines2 (match-string 7)))
+		  (lines2 (match-string 7))
+		  ;; Variables to use the special undo function.
+		  (old-undo buffer-undo-list)
+		  (old-end (marker-position end))
+		  (start (match-beginning 0))
+		  (reversible t))
 	      (replace-match
 	       (concat "***************\n*** " line1 ","
 		       (number-to-string (+ (string-to-number line1)
@@ -743,6 +748,14 @@
 		  (if (not (save-excursion (re-search-forward "^+" nil t)))
 		      (delete-region (point) (point-max))
 		    (let ((modif nil) (delete nil))
+		      (if (save-excursion (re-search-forward "^\\+.*\n-" nil t))
+                          ;; Normally, lines in a substitution come with
+                          ;; first the removals and then the additions, and
+                          ;; the context->unified function follows this
+                          ;; convention, of course.  Yet, other alternatives
+                          ;; are valid as well, but they preclude the use of
+                          ;; context->unified as an undo command.
+			  (setq reversible nil))
 		      (while (not (eobp))
 			(case (char-after)
 			  (?\s (insert " ") (setq modif nil) (backward-char 1))
@@ -761,7 +774,15 @@
 			  (forward-line 1)
 			  (when delete
 			    (delete-region last-pt (point))
-			    (setq delete nil)))))))))))))))
+			    (setq delete nil)))))))
+		(unless (or (not reversible) (eq buffer-undo-list t))
+                  ;; Drop the many undo entries and replace them with
+                  ;; a single entry that uses diff-context->unified to do
+                  ;; the work.
+		  (setq buffer-undo-list
+			(cons (list 'apply (- old-end end) start (point-max)
+				    'diff-context->unified start (point-max))
+			      old-undo)))))))))))
 
 (defun diff-context->unified (start end &optional to-context)
   "Convert context diffs to unified diffs.