0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 7.4.1932

Problem:    When writing viminfo the jumplist is not merged with the one in
            the viminfo file.
Solution:   Merge based on timestamp.
This commit is contained in:
Bram Moolenaar 2016-06-13 22:22:15 +02:00
parent a641e1d4da
commit ece74ab103
3 changed files with 51 additions and 4 deletions

View File

@ -1518,8 +1518,14 @@ handle_viminfo_mark(garray_T *values, int force)
{ {
for (idx = curwin->w_jumplistlen - 1; idx >= 0; --idx) for (idx = curwin->w_jumplistlen - 1; idx >= 0; --idx)
if (curwin->w_jumplist[idx].time_set < timestamp) if (curwin->w_jumplist[idx].time_set < timestamp)
{
++idx;
break; break;
} }
if (idx < 0 && curwin->w_jumplistlen < JUMPLISTSIZE)
/* insert as the oldest entry */
idx = 0;
}
else if (curwin->w_jumplistlen < JUMPLISTSIZE) else if (curwin->w_jumplistlen < JUMPLISTSIZE)
/* insert as oldest entry */ /* insert as oldest entry */
idx = 0; idx = 0;
@ -1538,7 +1544,6 @@ handle_viminfo_mark(garray_T *values, int force)
else else
{ {
/* Move newer entries forward. */ /* Move newer entries forward. */
++idx;
for (i = curwin->w_jumplistlen; i > idx; --i) for (i = curwin->w_jumplistlen; i > idx; --i)
curwin->w_jumplist[i] = curwin->w_jumplist[i - 1]; curwin->w_jumplist[i] = curwin->w_jumplist[i - 1];
++curwin->w_jumplistidx; ++curwin->w_jumplistidx;
@ -1684,10 +1689,23 @@ write_viminfo_filemarks(FILE *fp)
fputs(_("\n# Jumplist (newest first):\n"), fp); fputs(_("\n# Jumplist (newest first):\n"), fp);
setpcmark(); /* add current cursor position */ setpcmark(); /* add current cursor position */
cleanup_jumplist(); cleanup_jumplist();
/* TODO: when vi_jumplist != NULL merge the two lists. */ vi_idx = 0;
for (fm = &curwin->w_jumplist[curwin->w_jumplistlen - 1]; idx = curwin->w_jumplistlen - 1;
fm >= &curwin->w_jumplist[0]; --fm) for (i = 0; i < JUMPLISTSIZE; ++i)
{ {
xfmark_T *vi_fm;
fm = idx >= 0 ? &curwin->w_jumplist[idx] : NULL;
vi_fm = vi_idx < vi_jumplist_len ? &vi_jumplist[vi_idx] : NULL;
if (fm == NULL && vi_fm == NULL)
break;
if (fm == NULL || (vi_fm != NULL && fm->time_set < vi_fm->time_set))
{
fm = vi_fm;
++vi_idx;
}
else
--idx;
if (fm->fmark.fnum == 0 if (fm->fmark.fnum == 0
|| ((buf = buflist_findnr(fm->fmark.fnum)) != NULL || ((buf = buflist_findnr(fm->fmark.fnum)) != NULL
&& !removable(buf->b_ffname))) && !removable(buf->b_ffname)))

View File

@ -309,6 +309,33 @@ func Test_viminfo_jumplist()
exe "normal \<C-O>" exe "normal \<C-O>"
call assert_equal('time 05', getline('.')) call assert_equal('time 05', getline('.'))
clearjumps
call cursor(1, 1)
call test_settime(5)
exe "normal /15\r"
call test_settime(15)
exe "normal /last pos\r"
call test_settime(40)
exe "normal ?30\r"
" Test merge when writing
wviminfo Xviminfo
clearjumps
rviminfo Xviminfo
exe "normal \<C-O>"
call assert_equal('time 30', getline('.'))
exe "normal \<C-O>"
call assert_equal('last pos', getline('.'))
exe "normal \<C-O>"
" duplicate for 'time 30' was removed
call assert_equal('time 20', getline('.'))
exe "normal \<C-O>"
call assert_equal('time 15', getline('.'))
exe "normal \<C-O>"
call assert_equal('time 10', getline('.'))
exe "normal \<C-O>"
call assert_equal('time 05', getline('.'))
bwipe! bwipe!
call delete('Xviminfo') call delete('Xviminfo')
endfunc endfunc

View File

@ -753,6 +753,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1932,
/**/ /**/
1931, 1931,
/**/ /**/