diff src/mark.c @ 13248:5958573d8a72 v8.0.1498

patch 8.0.1498: getjumplist() returns duplicate entries commit https://github.com/vim/vim/commit/a7e18d237f817637815f0de44b08df1e0ca0f4f9 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Feb 11 14:29:49 2018 +0100 patch 8.0.1498: getjumplist() returns duplicate entries Problem: Getjumplist() returns duplicate entries. (lacygoill) Solution: Call cleanup_jumplist(). (Yegappan Lakshmanan)
author Christian Brabandt <cb@256bit.org>
date Sun, 11 Feb 2018 14:30:06 +0100
parents ac42c4b11dbc
children 28ae299c6af0
line wrap: on
line diff
--- a/src/mark.c
+++ b/src/mark.c
@@ -27,13 +27,9 @@
 #define EXTRA_MARKS 10					/* marks 0-9 */
 static xfmark_T namedfm[NMARKS + EXTRA_MARKS];		/* marks with file nr */
 
-static void fname2fnum(xfmark_T *fm);
 static void fmarks_check_one(xfmark_T *fm, char_u *name, buf_T *buf);
 static char_u *mark_line(pos_T *mp, int lead_len);
 static void show_one_mark(int, char_u *, pos_T *, char_u *, int current);
-#ifdef FEAT_JUMPLIST
-static void cleanup_jumplist(void);
-#endif
 #ifdef FEAT_VIMINFO
 static void write_one_filemark(FILE *fp, xfmark_T *fm, int c1, int c2);
 #endif
@@ -225,7 +221,7 @@ movemark(int count)
     pos_T	*pos;
     xfmark_T	*jmp;
 
-    cleanup_jumplist();
+    cleanup_jumplist(curwin);
 
     if (curwin->w_jumplistlen == 0)	    /* nothing to jump to */
 	return (pos_T *)NULL;
@@ -519,7 +515,7 @@ getnextmark(
  * This is used for marks obtained from the .viminfo file.  It's postponed
  * until the mark is used to avoid a long startup delay.
  */
-    static void
+    void
 fname2fnum(xfmark_T *fm)
 {
     char_u	*p;
@@ -895,7 +891,8 @@ ex_jumps(exarg_T *eap UNUSED)
     int		i;
     char_u	*name;
 
-    cleanup_jumplist();
+    cleanup_jumplist(curwin);
+
     /* Highlight title */
     MSG_PUTS_TITLE(_("\n jump line  col file/text"));
     for (i = 0; i < curwin->w_jumplistlen && !got_int; ++i)
@@ -1305,34 +1302,34 @@ mark_col_adjust(
 #ifdef FEAT_JUMPLIST
 /*
  * When deleting lines, this may create duplicate marks in the
- * jumplist. They will be removed here for the current window.
+ * jumplist. They will be removed here for the specified window.
  */
-    static void
-cleanup_jumplist(void)
+    void
+cleanup_jumplist(win_T *wp)
 {
     int	    i;
     int	    from, to;
 
     to = 0;
-    for (from = 0; from < curwin->w_jumplistlen; ++from)
+    for (from = 0; from < wp->w_jumplistlen; ++from)
     {
-	if (curwin->w_jumplistidx == from)
-	    curwin->w_jumplistidx = to;
-	for (i = from + 1; i < curwin->w_jumplistlen; ++i)
-	    if (curwin->w_jumplist[i].fmark.fnum
-					== curwin->w_jumplist[from].fmark.fnum
-		    && curwin->w_jumplist[from].fmark.fnum != 0
-		    && curwin->w_jumplist[i].fmark.mark.lnum
-				  == curwin->w_jumplist[from].fmark.mark.lnum)
+	if (wp->w_jumplistidx == from)
+	    wp->w_jumplistidx = to;
+	for (i = from + 1; i < wp->w_jumplistlen; ++i)
+	    if (wp->w_jumplist[i].fmark.fnum
+					== wp->w_jumplist[from].fmark.fnum
+		    && wp->w_jumplist[from].fmark.fnum != 0
+		    && wp->w_jumplist[i].fmark.mark.lnum
+				  == wp->w_jumplist[from].fmark.mark.lnum)
 		break;
-	if (i >= curwin->w_jumplistlen)	    /* no duplicate */
-	    curwin->w_jumplist[to++] = curwin->w_jumplist[from];
+	if (i >= wp->w_jumplistlen)	    /* no duplicate */
+	    wp->w_jumplist[to++] = wp->w_jumplist[from];
 	else
-	    vim_free(curwin->w_jumplist[from].fname);
+	    vim_free(wp->w_jumplist[from].fname);
     }
-    if (curwin->w_jumplistidx == curwin->w_jumplistlen)
-	curwin->w_jumplistidx = to;
-    curwin->w_jumplistlen = to;
+    if (wp->w_jumplistidx == wp->w_jumplistlen)
+	wp->w_jumplistidx = to;
+    wp->w_jumplistlen = to;
 }
 
 /*
@@ -1741,7 +1738,7 @@ write_viminfo_filemarks(FILE *fp)
     /* Write the jumplist with -' */
     fputs(_("\n# Jumplist (newest first):\n"), fp);
     setpcmark();	/* add current cursor position */
-    cleanup_jumplist();
+    cleanup_jumplist(curwin);
     vi_idx = 0;
     idx = curwin->w_jumplistlen - 1;
     for (i = 0; i < JUMPLISTSIZE; ++i)