0
0
mirror of https://github.com/vim/vim.git synced 2025-09-28 04:24:06 -04:00

When undoing a reload, move the cursor to the first changed line.

This commit is contained in:
Bram Moolenaar
2010-08-04 14:29:54 +02:00
parent 006d2b036b
commit f9bb734367
3 changed files with 45 additions and 1 deletions

View File

@@ -2922,6 +2922,42 @@ u_unchanged(buf)
buf->b_did_warn = FALSE;
}
/*
* 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".