Patch 8.0.1498 (after 8.0.1497)
Problem: Getjumplist() returns duplicate entries. (lacygoill)
Solution: Call cleanup_jumplist(). (Yegappan Lakshmanan)
Files: src/evalfunc.c, src/mark.c, src/proto/mark.pro,
src/testdir/test_jumplist.vim
*** ../vim-8.0.1497/src/evalfunc.c 2018-02-10 21:05:52.642858209 +0100
--- src/evalfunc.c 2018-02-11 14:25:08.693827009 +0100
***************
*** 4871,4878 ****
--- 4871,4883 ----
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,4892 ****
NULL);
# endif
dict_add_nr_str(d, "bufnr", (long)wp->w_jumplist[i].fmark.fnum, NULL);
! if (wp->w_jumplist[i].fmark.fnum == 0)
dict_add_nr_str(d, "filename", 0L, wp->w_jumplist[i].fname);
}
#endif
--- 4891,4897 ----
NULL);
# endif
dict_add_nr_str(d, "bufnr", (long)wp->w_jumplist[i].fmark.fnum, NULL);
! if (wp->w_jumplist[i].fname != NULL)
dict_add_nr_str(d, "filename", 0L, wp->w_jumplist[i].fname);
}
#endif
*** ../vim-8.0.1497/src/mark.c 2018-02-10 18:45:21.064822187 +0100
--- src/mark.c 2018-02-11 14:28:04.456896564 +0100
***************
*** 27,39 ****
#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
--- 27,35 ----
***************
*** 225,231 ****
pos_T *pos;
xfmark_T *jmp;
! cleanup_jumplist();
if (curwin->w_jumplistlen == 0) /* nothing to jump to */
return (pos_T *)NULL;
--- 221,227 ----
pos_T *pos;
xfmark_T *jmp;
! cleanup_jumplist(curwin);
if (curwin->w_jumplistlen == 0) /* nothing to jump to */
return (pos_T *)NULL;
***************
*** 519,525 ****
* 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
fname2fnum(xfmark_T *fm)
{
char_u *p;
--- 515,521 ----
* This is used for marks obtained from the .viminfo file. It's postponed
* until the mark is used to avoid a long startup delay.
*/
! void
fname2fnum(xfmark_T *fm)
{
char_u *p;
***************
*** 895,901 ****
int i;
char_u *name;
! cleanup_jumplist();
/* Highlight title */
MSG_PUTS_TITLE(_("\n jump line col file/text"));
for (i = 0; i < curwin->w_jumplistlen && !got_int; ++i)
--- 891,898 ----
int i;
char_u *name;
! 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,1338 ****
#ifdef FEAT_JUMPLIST
/*
* When deleting lines, this may create duplicate marks in the
! * jumplist. They will be removed here for the current window.
*/
! static void
! cleanup_jumplist(void)
{
int i;
int from, to;
to = 0;
! for (from = 0; from < curwin->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)
break;
! if (i >= curwin->w_jumplistlen) /* no duplicate */
! curwin->w_jumplist[to++] = curwin->w_jumplist[from];
else
! vim_free(curwin->w_jumplist[from].fname);
}
! if (curwin->w_jumplistidx == curwin->w_jumplistlen)
! curwin->w_jumplistidx = to;
! curwin->w_jumplistlen = to;
}
/*
--- 1302,1335 ----
#ifdef FEAT_JUMPLIST
/*
* When deleting lines, this may create duplicate marks in the
! * jumplist. They will be removed here for the specified window.
*/
! void
! cleanup_jumplist(win_T *wp)
{
int i;
int from, to;
to = 0;
! for (from = 0; from < wp->w_jumplistlen; ++from)
{
! 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 >= wp->w_jumplistlen) /* no duplicate */
! wp->w_jumplist[to++] = wp->w_jumplist[from];
else
! vim_free(wp->w_jumplist[from].fname);
}
! if (wp->w_jumplistidx == wp->w_jumplistlen)
! wp->w_jumplistidx = to;
! wp->w_jumplistlen = to;
}
/*
***************
*** 1741,1747 ****
/* Write the jumplist with -' */
fputs(_("\n# Jumplist (newest first):\n"), fp);
setpcmark(); /* add current cursor position */
! cleanup_jumplist();
vi_idx = 0;
idx = curwin->w_jumplistlen - 1;
for (i = 0; i < JUMPLISTSIZE; ++i)
--- 1738,1744 ----
/* Write the jumplist with -' */
fputs(_("\n# Jumplist (newest first):\n"), fp);
setpcmark(); /* add current cursor position */
! cleanup_jumplist(curwin);
vi_idx = 0;
idx = curwin->w_jumplistlen - 1;
for (i = 0; i < JUMPLISTSIZE; ++i)
*** ../vim-8.0.1497/src/proto/mark.pro 2017-03-14 21:53:54.114075276 +0100
--- src/proto/mark.pro 2018-02-11 14:25:08.697826988 +0100
***************
*** 9,14 ****
--- 9,15 ----
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,28 ****
--- 24,30 ----
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);
*** ../vim-8.0.1497/src/testdir/test_jumplist.vim 2018-02-10
21:05:52.642858209 +0100
--- src/testdir/test_jumplist.vim 2018-02-11 14:25:08.697826988 +0100
***************
*** 30,36 ****
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())
--- 30,35 ----
***************
*** 48,64 ****
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])
clearjumps
call test_garbagecollect_now()
! call assert_equal(5, l[1])
call delete("Xtest")
endfunc
--- 47,62 ----
call assert_equal([[
\ {'lnum': 1, 'bufnr': bnr, 'col': 0, 'coladd': 0},
\ {'lnum': 50, '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(4, l[1])
clearjumps
call test_garbagecollect_now()
! call assert_equal(4, l[1])
call delete("Xtest")
endfunc
*** ../vim-8.0.1497/src/version.c 2018-02-10 21:05:52.642858209 +0100
--- src/version.c 2018-02-11 14:26:30.177399760 +0100
***************
*** 773,774 ****
--- 773,776 ----
{ /* Add new patch number below this line */
+ /**/
+ 1498,
/**/
--
WOMAN: Dennis, there's some lovely filth down here. Oh -- how d'you do?
ARTHUR: How do you do, good lady. I am Arthur, King of the Britons.
Who's castle is that?
WOMAN: King of the who?
The Quest for the Holy Grail (Monty Python)
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.