mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.0.1498: getjumplist() returns duplicate entries
Problem: Getjumplist() returns duplicate entries. (lacygoill) Solution: Call cleanup_jumplist(). (Yegappan Lakshmanan)
This commit is contained in:
@@ -4871,8 +4871,13 @@ f_getjumplist(typval_T *argvars, typval_T *rettv)
|
|||||||
return;
|
return;
|
||||||
list_append_number(rettv->vval.v_list, (varnumber_T)wp->w_jumplistidx);
|
list_append_number(rettv->vval.v_list, (varnumber_T)wp->w_jumplistidx);
|
||||||
|
|
||||||
|
cleanup_jumplist(wp);
|
||||||
for (i = 0; i < wp->w_jumplistlen; ++i)
|
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)
|
if ((d = dict_alloc()) == NULL)
|
||||||
return;
|
return;
|
||||||
if (list_append_dict(l, d) == FAIL)
|
if (list_append_dict(l, d) == FAIL)
|
||||||
@@ -4886,7 +4891,7 @@ f_getjumplist(typval_T *argvars, typval_T *rettv)
|
|||||||
NULL);
|
NULL);
|
||||||
# endif
|
# endif
|
||||||
dict_add_nr_str(d, "bufnr", (long)wp->w_jumplist[i].fmark.fnum, NULL);
|
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);
|
dict_add_nr_str(d, "filename", 0L, wp->w_jumplist[i].fname);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
49
src/mark.c
49
src/mark.c
@@ -27,13 +27,9 @@
|
|||||||
#define EXTRA_MARKS 10 /* marks 0-9 */
|
#define EXTRA_MARKS 10 /* marks 0-9 */
|
||||||
static xfmark_T namedfm[NMARKS + EXTRA_MARKS]; /* marks with file nr */
|
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 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 char_u *mark_line(pos_T *mp, int lead_len);
|
||||||
static void show_one_mark(int, char_u *, pos_T *, char_u *, int current);
|
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
|
#ifdef FEAT_VIMINFO
|
||||||
static void write_one_filemark(FILE *fp, xfmark_T *fm, int c1, int c2);
|
static void write_one_filemark(FILE *fp, xfmark_T *fm, int c1, int c2);
|
||||||
#endif
|
#endif
|
||||||
@@ -225,7 +221,7 @@ movemark(int count)
|
|||||||
pos_T *pos;
|
pos_T *pos;
|
||||||
xfmark_T *jmp;
|
xfmark_T *jmp;
|
||||||
|
|
||||||
cleanup_jumplist();
|
cleanup_jumplist(curwin);
|
||||||
|
|
||||||
if (curwin->w_jumplistlen == 0) /* nothing to jump to */
|
if (curwin->w_jumplistlen == 0) /* nothing to jump to */
|
||||||
return (pos_T *)NULL;
|
return (pos_T *)NULL;
|
||||||
@@ -519,7 +515,7 @@ getnextmark(
|
|||||||
* This is used for marks obtained from the .viminfo file. It's postponed
|
* This is used for marks obtained from the .viminfo file. It's postponed
|
||||||
* until the mark is used to avoid a long startup delay.
|
* until the mark is used to avoid a long startup delay.
|
||||||
*/
|
*/
|
||||||
static void
|
void
|
||||||
fname2fnum(xfmark_T *fm)
|
fname2fnum(xfmark_T *fm)
|
||||||
{
|
{
|
||||||
char_u *p;
|
char_u *p;
|
||||||
@@ -895,7 +891,8 @@ ex_jumps(exarg_T *eap UNUSED)
|
|||||||
int i;
|
int i;
|
||||||
char_u *name;
|
char_u *name;
|
||||||
|
|
||||||
cleanup_jumplist();
|
cleanup_jumplist(curwin);
|
||||||
|
|
||||||
/* Highlight title */
|
/* Highlight title */
|
||||||
MSG_PUTS_TITLE(_("\n jump line col file/text"));
|
MSG_PUTS_TITLE(_("\n jump line col file/text"));
|
||||||
for (i = 0; i < curwin->w_jumplistlen && !got_int; ++i)
|
for (i = 0; i < curwin->w_jumplistlen && !got_int; ++i)
|
||||||
@@ -1305,34 +1302,34 @@ mark_col_adjust(
|
|||||||
#ifdef FEAT_JUMPLIST
|
#ifdef FEAT_JUMPLIST
|
||||||
/*
|
/*
|
||||||
* When deleting lines, this may create duplicate marks in the
|
* 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
|
void
|
||||||
cleanup_jumplist(void)
|
cleanup_jumplist(win_T *wp)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int from, to;
|
int from, to;
|
||||||
|
|
||||||
to = 0;
|
to = 0;
|
||||||
for (from = 0; from < curwin->w_jumplistlen; ++from)
|
for (from = 0; from < wp->w_jumplistlen; ++from)
|
||||||
{
|
{
|
||||||
if (curwin->w_jumplistidx == from)
|
if (wp->w_jumplistidx == from)
|
||||||
curwin->w_jumplistidx = to;
|
wp->w_jumplistidx = to;
|
||||||
for (i = from + 1; i < curwin->w_jumplistlen; ++i)
|
for (i = from + 1; i < wp->w_jumplistlen; ++i)
|
||||||
if (curwin->w_jumplist[i].fmark.fnum
|
if (wp->w_jumplist[i].fmark.fnum
|
||||||
== curwin->w_jumplist[from].fmark.fnum
|
== wp->w_jumplist[from].fmark.fnum
|
||||||
&& curwin->w_jumplist[from].fmark.fnum != 0
|
&& wp->w_jumplist[from].fmark.fnum != 0
|
||||||
&& curwin->w_jumplist[i].fmark.mark.lnum
|
&& wp->w_jumplist[i].fmark.mark.lnum
|
||||||
== curwin->w_jumplist[from].fmark.mark.lnum)
|
== wp->w_jumplist[from].fmark.mark.lnum)
|
||||||
break;
|
break;
|
||||||
if (i >= curwin->w_jumplistlen) /* no duplicate */
|
if (i >= wp->w_jumplistlen) /* no duplicate */
|
||||||
curwin->w_jumplist[to++] = curwin->w_jumplist[from];
|
wp->w_jumplist[to++] = wp->w_jumplist[from];
|
||||||
else
|
else
|
||||||
vim_free(curwin->w_jumplist[from].fname);
|
vim_free(wp->w_jumplist[from].fname);
|
||||||
}
|
}
|
||||||
if (curwin->w_jumplistidx == curwin->w_jumplistlen)
|
if (wp->w_jumplistidx == wp->w_jumplistlen)
|
||||||
curwin->w_jumplistidx = to;
|
wp->w_jumplistidx = to;
|
||||||
curwin->w_jumplistlen = to;
|
wp->w_jumplistlen = to;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1741,7 +1738,7 @@ write_viminfo_filemarks(FILE *fp)
|
|||||||
/* Write the jumplist with -' */
|
/* Write the jumplist with -' */
|
||||||
fputs(_("\n# Jumplist (newest first):\n"), fp);
|
fputs(_("\n# Jumplist (newest first):\n"), fp);
|
||||||
setpcmark(); /* add current cursor position */
|
setpcmark(); /* add current cursor position */
|
||||||
cleanup_jumplist();
|
cleanup_jumplist(curwin);
|
||||||
vi_idx = 0;
|
vi_idx = 0;
|
||||||
idx = curwin->w_jumplistlen - 1;
|
idx = curwin->w_jumplistlen - 1;
|
||||||
for (i = 0; i < JUMPLISTSIZE; ++i)
|
for (i = 0; i < JUMPLISTSIZE; ++i)
|
||||||
|
@@ -9,6 +9,7 @@ pos_T *getmark_buf(buf_T *buf, int c, int changefile);
|
|||||||
pos_T *getmark(int c, int changefile);
|
pos_T *getmark(int c, int changefile);
|
||||||
pos_T *getmark_buf_fnum(buf_T *buf, int c, int changefile, int *fnum);
|
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);
|
pos_T *getnextmark(pos_T *startpos, int dir, int begin_line);
|
||||||
|
void fname2fnum(xfmark_T *fm);
|
||||||
void fmarks_check_names(buf_T *buf);
|
void fmarks_check_names(buf_T *buf);
|
||||||
int check_mark(pos_T *pos);
|
int check_mark(pos_T *pos);
|
||||||
void clrallmarks(buf_T *buf);
|
void clrallmarks(buf_T *buf);
|
||||||
@@ -23,6 +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 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 copy_jumplist(win_T *from, win_T *to);
|
||||||
void free_jumplist(win_T *wp);
|
void free_jumplist(win_T *wp);
|
||||||
|
void cleanup_jumplist(win_T *wp);
|
||||||
void set_last_cursor(win_T *win);
|
void set_last_cursor(win_T *win);
|
||||||
void free_all_marks(void);
|
void free_all_marks(void);
|
||||||
int read_viminfo_filemark(vir_T *virp, int force);
|
int read_viminfo_filemark(vir_T *virp, int force);
|
||||||
|
@@ -29,7 +29,6 @@ func Test_getjumplist()
|
|||||||
normal gg
|
normal gg
|
||||||
|
|
||||||
call assert_equal([[
|
call assert_equal([[
|
||||||
\ {'lnum': 1, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
|
||||||
\ {'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': 50, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
\ {'lnum': 100, 'bufnr': bnr, 'col': 0, 'coladd': 0}], 4],
|
\ {'lnum': 100, 'bufnr': bnr, 'col': 0, 'coladd': 0}], 4],
|
||||||
@@ -48,17 +47,16 @@ func Test_getjumplist()
|
|||||||
call assert_equal([[
|
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': 50, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
\ {'lnum': 100, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
|
||||||
\ {'lnum': 5, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
\ {'lnum': 5, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
\ {'lnum': 100, 'bufnr': bnr, 'col': 0, 'coladd': 0}], 5],
|
\ {'lnum': 100, 'bufnr': bnr, 'col': 0, 'coladd': 0}], 5],
|
||||||
\ getjumplist())
|
\ getjumplist())
|
||||||
|
|
||||||
let l = getjumplist()
|
let l = getjumplist()
|
||||||
call test_garbagecollect_now()
|
call test_garbagecollect_now()
|
||||||
call assert_equal(5, l[1])
|
call assert_equal(4, l[1])
|
||||||
clearjumps
|
clearjumps
|
||||||
call test_garbagecollect_now()
|
call test_garbagecollect_now()
|
||||||
call assert_equal(5, l[1])
|
call assert_equal(4, l[1])
|
||||||
|
|
||||||
call delete("Xtest")
|
call delete("Xtest")
|
||||||
endfunc
|
endfunc
|
||||||
|
@@ -771,6 +771,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1498,
|
||||||
/**/
|
/**/
|
||||||
1497,
|
1497,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user