]> granicus.if.org Git - vim/commitdiff
patch 8.0.1513: the jumplist is not always properly cleaned up v8.0.1513
authorBram Moolenaar <Bram@vim.org>
Tue, 13 Feb 2018 12:33:29 +0000 (13:33 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 13 Feb 2018 12:33:29 +0000 (13:33 +0100)
Problem:    The jumplist is not always properly cleaned up.
Solution:   Call fname2fnum() before cleanup_jumplist(). (Yegappan Lakshmanan)

src/evalfunc.c
src/mark.c
src/proto/mark.pro
src/version.c

index 959be0cf8e4556d95ce97dbaedaaf9c4ca037166..7ea106bf65f0705c672b97820775149954a96dc3 100644 (file)
@@ -4858,13 +4858,12 @@ f_getjumplist(typval_T *argvars, typval_T *rettv)
        return;
     list_append_number(rettv->vval.v_list, (varnumber_T)wp->w_jumplistidx);
 
-    cleanup_jumplist(wp);
+    cleanup_jumplist(wp, TRUE);
+
     for (i = 0; i < wp->w_jumplistlen; ++i)
     {
        if (wp->w_jumplist[i].fmark.mark.lnum == 0)
            continue;
-       if (wp->w_jumplist[i].fmark.fnum == 0)
-           fname2fnum(&wp->w_jumplist[i]);
        if ((d = dict_alloc()) == NULL)
            return;
        if (list_append_dict(l, d) == FAIL)
index 9ebc9c24c48de86f9dbcadcdac064ce89ff0d028..dd714d800d757857c82590fe8a99e5a575a6b5a2 100644 (file)
@@ -221,7 +221,7 @@ movemark(int count)
     pos_T      *pos;
     xfmark_T   *jmp;
 
-    cleanup_jumplist(curwin);
+    cleanup_jumplist(curwin, TRUE);
 
     if (curwin->w_jumplistlen == 0)        /* nothing to jump to */
        return (pos_T *)NULL;
@@ -891,7 +891,7 @@ ex_jumps(exarg_T *eap UNUSED)
     int                i;
     char_u     *name;
 
-    cleanup_jumplist(curwin);
+    cleanup_jumplist(curwin, TRUE);
 
     /* Highlight title */
     MSG_PUTS_TITLE(_("\n jump line  col file/text"));
@@ -899,8 +899,6 @@ ex_jumps(exarg_T *eap UNUSED)
     {
        if (curwin->w_jumplist[i].fmark.mark.lnum != 0)
        {
-           if (curwin->w_jumplist[i].fmark.fnum == 0)
-               fname2fnum(&curwin->w_jumplist[i]);
            name = fm_getname(&curwin->w_jumplist[i].fmark, 16);
            if (name == NULL)       /* file name not available */
                continue;
@@ -1303,13 +1301,28 @@ mark_col_adjust(
 /*
  * When deleting lines, this may create duplicate marks in the
  * jumplist. They will be removed here for the specified window.
+ * When "loadfiles" is TRUE first ensure entries have the "fnum" field set
+ * (this may be a bit slow).
  */
     void
-cleanup_jumplist(win_T *wp)
+cleanup_jumplist(win_T *wp, int loadfiles)
 {
     int            i;
     int            from, to;
 
+    if (loadfiles)
+    {
+       /* If specified, load all the files from the jump list. This is
+        * needed to properly clean up duplicate entries, but will take some
+        * time. */
+       for (i = 0; i < wp->w_jumplistlen; ++i)
+       {
+           if ((wp->w_jumplist[i].fmark.fnum == 0) &&
+                   (wp->w_jumplist[i].fmark.mark.lnum != 0))
+               fname2fnum(&wp->w_jumplist[i]);
+       }
+    }
+
     to = 0;
     for (from = 0; from < wp->w_jumplistlen; ++from)
     {
@@ -1738,7 +1751,7 @@ write_viminfo_filemarks(FILE *fp)
     /* Write the jumplist with -' */
     fputs(_("\n# Jumplist (newest first):\n"), fp);
     setpcmark();       /* add current cursor position */
-    cleanup_jumplist(curwin);
+    cleanup_jumplist(curwin, FALSE);
     vi_idx = 0;
     idx = curwin->w_jumplistlen - 1;
     for (i = 0; i < JUMPLISTSIZE; ++i)
index aa6f44efcc3e0058debfa29a3e2fa1e8f4c189d6..448b45273931cd3fcb141db26f64916dec0d6a20 100644 (file)
@@ -24,7 +24,7 @@ void mark_adjust_nofold(linenr_T line1, linenr_T line2, long amount, long amount
 void mark_col_adjust(linenr_T lnum, colnr_T mincol, long lnum_amount, long col_amount);
 void copy_jumplist(win_T *from, win_T *to);
 void free_jumplist(win_T *wp);
-void cleanup_jumplist(win_T *wp);
+void cleanup_jumplist(win_T *wp, int loadfiles);
 void set_last_cursor(win_T *win);
 void free_all_marks(void);
 int read_viminfo_filemark(vir_T *virp, int force);
index 965df225a231eadc0b3a4b4d0d92e8f3033d5d93..e4f6f968c9c5649ef2244499cef391f21f9496eb 100644 (file)
@@ -771,6 +771,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1513,
 /**/
     1512,
 /**/