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:
parent
a641e1d4da
commit
ece74ab103
26
src/mark.c
26
src/mark.c
@ -1518,7 +1518,13 @@ 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 */
|
||||||
@ -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)))
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user