Mercurial > emacs
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.