]> granicus.if.org Git - vim/commitdiff
patch 7.4.1932 v7.4.1932
authorBram Moolenaar <Bram@vim.org>
Mon, 13 Jun 2016 20:22:15 +0000 (22:22 +0200)
committerBram Moolenaar <Bram@vim.org>
Mon, 13 Jun 2016 20:22:15 +0000 (22:22 +0200)
Problem:    When writing viminfo the jumplist is not merged with the one in
            the viminfo file.
Solution:   Merge based on timestamp.

src/mark.c
src/testdir/test_viminfo.vim
src/version.c

index 34825a65749446efa1eda154f7bb725d05774a63..008a0d0feca6f6958723902bcddcaacce3faa8bf 100644 (file)
@@ -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)))
index 19be47dd1684c5db802213709a28659833304401..64a7e6feee87ffdaba106319d8eae66ffe62f8a9 100644 (file)
@@ -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
index 977cb1a80d1794e77222a9e83d912b4b8ab0bb89..b06ede38dca744a3a022fa383c1bdc34ea724992 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1932,
 /**/
     1931,
 /**/