diff src/undo.c @ 2482:88751831fa0a vim73

When undoing a reload, move the cursor to the first changed line.
author Bram Moolenaar <bram@vim.org>
date Wed, 04 Aug 2010 14:29:54 +0200
parents 8f6106dd3d12
children c43e99e9baaf
line wrap: on
line diff
--- a/src/undo.c
+++ b/src/undo.c
@@ -2923,6 +2923,42 @@ u_unchanged(buf)
 }
 
 /*
+ * After reloading a buffer which was saved for 'undoreload': Find the first
+ * line that was changed and set the cursor there.
+ */
+    void
+u_find_first_changed()
+{
+    u_header_T	*uhp = curbuf->b_u_newhead;
+    u_entry_T   *uep;
+    linenr_T	lnum;
+
+    if (curbuf->b_u_curhead != NULL || uhp == NULL)
+	return;  /* undid something in an autocmd? */
+
+    /* Check that the last undo block was for the whole file. */
+    uep = uhp->uh_entry;
+    if (uep->ue_top != 0 || uep->ue_bot != 0)
+	return;
+
+    for (lnum = 1; lnum < curbuf->b_ml.ml_line_count
+					      && lnum <= uep->ue_size; ++lnum)
+	if (STRCMP(ml_get_buf(curbuf, lnum, FALSE),
+						uep->ue_array[lnum - 1]) != 0)
+	{
+	    clearpos(&(uhp->uh_cursor));
+	    uhp->uh_cursor.lnum = lnum;
+	    return;
+	}
+    if (curbuf->b_ml.ml_line_count != uep->ue_size)
+    {
+	/* lines added or deleted at the end, put the cursor there */
+	clearpos(&(uhp->uh_cursor));
+	uhp->uh_cursor.lnum = lnum;
+    }
+}
+
+/*
  * Increase the write count, store it in the last undo header, what would be
  * used for "u".
  */