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 -- b...@moolenaar.net -- 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 vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui