changeset 3246:c4898d6d73a2 v7.3.392

updated for version 7.3.392 Problem: When setting 'undofile' while the file is already loaded but unchanged, try reading the undo file. (Andy Wokula) Solution: Compute a checksum of the text when 'undofile' is set. (Christian Brabandt)
author Bram Moolenaar <bram@vim.org>
date Wed, 04 Jan 2012 19:34:37 +0100
parents 2116ffde38ac
children 10409da047b3
files src/option.c src/testdir/test72.in src/testdir/test72.ok src/version.c
diffstat 4 files changed, 42 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/option.c
+++ b/src/option.c
@@ -7516,6 +7516,30 @@ set_bool_option(opt_idx, varp, value, op
 	compatible_set();
     }
 
+#ifdef FEAT_PERSISTENT_UNDO
+    /* 'undofile' */
+    else if ((int *)varp == &curbuf->b_p_udf || (int *)varp == &p_udf)
+    {
+	char_u	hash[UNDO_HASH_SIZE];
+	buf_T	*save_curbuf = curbuf;
+
+	for (curbuf = firstbuf; curbuf != NULL; curbuf = curbuf->b_next)
+	{
+	    /* When 'undofile' is set globally: for every buffer, otherwise
+	     * only for the current buffer: Try to read in the undofile, if
+	     * one exists and the buffer wasn't changed. */
+	    if ((curbuf == save_curbuf
+				|| (opt_flags & OPT_GLOBAL) || opt_flags == 0)
+		    && !curbufIsChanged())
+	    {
+		u_compute_hash(hash);
+		u_read_undo(NULL, hash, curbuf->b_fname);
+	    }
+	}
+	curbuf = save_curbuf;
+    }
+#endif
+
     /* 'list', 'number' */
     else if ((int *)varp == &curwin->w_p_list
 	  || (int *)varp == &curwin->w_p_nu
--- a/src/testdir/test72.in
+++ b/src/testdir/test72.in
@@ -51,6 +51,12 @@ dd:set ul=100
 :e Xtestfile
 uuu:w >>test.out
 :"
+:" Test that reading the undofiles when setting undofile works
+:set noundofile ul=0
+i
+u:e! Xtestfile
+:set undofile ul=100
+uuuuuu:w >>test.out
 :" And now with encryption, cryptmethod=zip
 :e! Xtestfile
 :set undofile cm=zip
--- a/src/testdir/test72.ok
+++ b/src/testdir/test72.ok
@@ -7,6 +7,16 @@ seven
 eight
 nine
 ten
+one
+two
+three
+four
+five
+six
+seven
+eight
+nine
+ten
 monday
 wednesday
 thursday
--- a/src/version.c
+++ b/src/version.c
@@ -715,6 +715,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    392,
+/**/
     391,
 /**/
     390,