changeset 13278:28ae299c6af0 v8.0.1513

patch 8.0.1513: the jumplist is not always properly cleaned up commit https://github.com/vim/vim/commit/486797413791f6be12dcec6e5faf4f952e4647ae Author: Bram Moolenaar <Bram@vim.org> Date: Tue Feb 13 13:33:29 2018 +0100 patch 8.0.1513: the jumplist is not always properly cleaned up Problem: The jumplist is not always properly cleaned up. Solution: Call fname2fnum() before cleanup_jumplist(). (Yegappan Lakshmanan)
author Christian Brabandt <cb@256bit.org>
date Tue, 13 Feb 2018 13:45:05 +0100
parents 99fc5a0fd96c
children fa46af018785
files src/evalfunc.c src/mark.c src/proto/mark.pro src/version.c
diffstat 4 files changed, 24 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -4858,13 +4858,12 @@ f_getjumplist(typval_T *argvars, typval_
 	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)
--- a/src/mark.c
+++ b/src/mark.c
@@ -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)
--- a/src/proto/mark.pro
+++ b/src/proto/mark.pro
@@ -24,7 +24,7 @@ void mark_adjust_nofold(linenr_T line1, 
 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);
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1513,
+/**/
     1512,
 /**/
     1511,