diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-06-13 22:22:15 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-06-13 22:22:15 +0200 |
commit | ece74ab103eca15e17435efbe9cb21039787f1ea (patch) | |
tree | 2f7da47b2ab351dce720f152a6ad609a7820ad40 /src | |
parent | a641e1d4da3f9152c489318c06a93fcd1c746637 (diff) | |
download | vim-git-ece74ab103eca15e17435efbe9cb21039787f1ea.tar.gz |
patch 7.4.1932v7.4.1932
Problem: When writing viminfo the jumplist is not merged with the one in
the viminfo file.
Solution: Merge based on timestamp.
Diffstat (limited to 'src')
-rw-r--r-- | src/mark.c | 26 | ||||
-rw-r--r-- | src/testdir/test_viminfo.vim | 27 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 51 insertions, 4 deletions
diff --git a/src/mark.c b/src/mark.c index 34825a657..008a0d0fe 100644 --- a/src/mark.c +++ b/src/mark.c @@ -1518,7 +1518,13 @@ handle_viminfo_mark(garray_T *values, int force) { for (idx = curwin->w_jumplistlen - 1; idx >= 0; --idx) if (curwin->w_jumplist[idx].time_set < timestamp) + { + ++idx; break; + } + if (idx < 0 && curwin->w_jumplistlen < JUMPLISTSIZE) + /* insert as the oldest entry */ + idx = 0; } else if (curwin->w_jumplistlen < JUMPLISTSIZE) /* insert as oldest entry */ @@ -1538,7 +1544,6 @@ handle_viminfo_mark(garray_T *values, int force) else { /* Move newer entries forward. */ - ++idx; for (i = curwin->w_jumplistlen; i > idx; --i) curwin->w_jumplist[i] = curwin->w_jumplist[i - 1]; ++curwin->w_jumplistidx; @@ -1684,10 +1689,23 @@ write_viminfo_filemarks(FILE *fp) fputs(_("\n# Jumplist (newest first):\n"), fp); setpcmark(); /* add current cursor position */ cleanup_jumplist(); - /* TODO: when vi_jumplist != NULL merge the two lists. */ - for (fm = &curwin->w_jumplist[curwin->w_jumplistlen - 1]; - fm >= &curwin->w_jumplist[0]; --fm) + vi_idx = 0; + idx = curwin->w_jumplistlen - 1; + 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 || ((buf = buflist_findnr(fm->fmark.fnum)) != NULL && !removable(buf->b_ffname))) diff --git a/src/testdir/test_viminfo.vim b/src/testdir/test_viminfo.vim index 19be47dd1..64a7e6fee 100644 --- a/src/testdir/test_viminfo.vim +++ b/src/testdir/test_viminfo.vim @@ -309,6 +309,33 @@ func Test_viminfo_jumplist() exe "normal \<C-O>" 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! call delete('Xviminfo') endfunc diff --git a/src/version.c b/src/version.c index 977cb1a80..b06ede38d 100644 --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1932, +/**/ 1931, /**/ 1930, |