# HG changeset patch # User Christian Brabandt # Date 1518355806 -3600 # Node ID 5958573d8a7226e587d3251a93bf937d093385ed # Parent 698ff552c830826cfff9f77c6c5c2d357023ce6d patch 8.0.1498: getjumplist() returns duplicate entries commit https://github.com/vim/vim/commit/a7e18d237f817637815f0de44b08df1e0ca0f4f9 Author: Bram Moolenaar 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) diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -4871,8 +4871,13 @@ f_getjumplist(typval_T *argvars, typval_ return; list_append_number(rettv->vval.v_list, (varnumber_T)wp->w_jumplistidx); + cleanup_jumplist(wp); 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) @@ -4886,7 +4891,7 @@ f_getjumplist(typval_T *argvars, typval_ NULL); # endif dict_add_nr_str(d, "bufnr", (long)wp->w_jumplist[i].fmark.fnum, NULL); - if (wp->w_jumplist[i].fmark.fnum == 0) + if (wp->w_jumplist[i].fname != NULL) dict_add_nr_str(d, "filename", 0L, wp->w_jumplist[i].fname); } #endif diff --git a/src/mark.c b/src/mark.c --- 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) diff --git a/src/proto/mark.pro b/src/proto/mark.pro --- a/src/proto/mark.pro +++ b/src/proto/mark.pro @@ -9,6 +9,7 @@ pos_T *getmark_buf(buf_T *buf, int c, in pos_T *getmark(int c, int changefile); pos_T *getmark_buf_fnum(buf_T *buf, int c, int changefile, int *fnum); pos_T *getnextmark(pos_T *startpos, int dir, int begin_line); +void fname2fnum(xfmark_T *fm); void fmarks_check_names(buf_T *buf); int check_mark(pos_T *pos); void clrallmarks(buf_T *buf); @@ -23,6 +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 set_last_cursor(win_T *win); void free_all_marks(void); int read_viminfo_filemark(vir_T *virp, int force); diff --git a/src/testdir/test_jumplist.vim b/src/testdir/test_jumplist.vim --- a/src/testdir/test_jumplist.vim +++ b/src/testdir/test_jumplist.vim @@ -30,7 +30,6 @@ func Test_getjumplist() call assert_equal([[ \ {'lnum': 1, 'bufnr': bnr, 'col': 0, 'coladd': 0}, - \ {'lnum': 1, 'bufnr': bnr, 'col': 0, 'coladd': 0}, \ {'lnum': 50, 'bufnr': bnr, 'col': 0, 'coladd': 0}, \ {'lnum': 100, 'bufnr': bnr, 'col': 0, 'coladd': 0}], 4], \ getjumplist()) @@ -48,17 +47,16 @@ func Test_getjumplist() call assert_equal([[ \ {'lnum': 1, 'bufnr': bnr, 'col': 0, 'coladd': 0}, \ {'lnum': 50, 'bufnr': bnr, 'col': 0, 'coladd': 0}, - \ {'lnum': 100, 'bufnr': bnr, 'col': 0, 'coladd': 0}, \ {'lnum': 5, 'bufnr': bnr, 'col': 0, 'coladd': 0}, \ {'lnum': 100, 'bufnr': bnr, 'col': 0, 'coladd': 0}], 5], \ getjumplist()) let l = getjumplist() call test_garbagecollect_now() - call assert_equal(5, l[1]) + call assert_equal(4, l[1]) clearjumps call test_garbagecollect_now() - call assert_equal(5, l[1]) + call assert_equal(4, l[1]) call delete("Xtest") endfunc diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 1498, +/**/ 1497, /**/ 1496,