Patch 8.2.4731
Problem:    The changelist index is not remembered per buffer.
Solution:   Keep the changelist index per window and buffer. (closes #10135,
            closes #2173)
Files:      src/buffer.c, src/evalfunc.c, src/structs.h,
            src/testdir/test_changelist.vim


*** ../vim-8.2.4730/src/buffer.c        2022-04-07 12:39:03.983973910 +0100
--- src/buffer.c        2022-04-10 17:34:46.577734595 +0100
***************
*** 3076,3081 ****
--- 3076,3083 ----
        wip->wi_fpos.lnum = lnum;
        wip->wi_fpos.col = col;
      }
+     if (win != NULL)
+       wip->wi_changelistidx = win->w_changelistidx;
      if (copy_options && win != NULL)
      {
        // Save the window-specific option values.
***************
*** 3210,3215 ****
--- 3212,3219 ----
      }
      else
        copy_winopt(&curwin->w_allbuf_opt, &curwin->w_onebuf_opt);
+     if (wip != NULL)
+       curwin->w_changelistidx = wip->wi_changelistidx;
  
  #ifdef FEAT_FOLDING
      // Set 'foldlevel' to 'foldlevelstart' if it's not negative.
*** ../vim-8.2.4730/src/evalfunc.c      2022-04-03 21:30:25.022559205 +0100
--- src/evalfunc.c      2022-04-10 17:57:14.931027713 +0100
***************
*** 4724,4729 ****
--- 4724,4730 ----
      int               i;
      list_T    *l;
      dict_T    *d;
+     int               changelistindex;
  
      if (rettv_list_alloc(rettv) != OK)
        return;
***************
*** 4745,4757 ****
      if (list_append_list(rettv->vval.v_list, l) == FAIL)
        return;
      /*
!      * The current window change list index tracks only the position in the
!      * current buffer change list. For other buffers, use the change list
!      * length as the current index.
       */
!     list_append_number(rettv->vval.v_list,
!           (varnumber_T)((buf == curwin->w_buffer)
!               ? curwin->w_changelistidx : buf->b_changelistlen));
  
      for (i = 0; i < buf->b_changelistlen; ++i)
      {
--- 4746,4770 ----
      if (list_append_list(rettv->vval.v_list, l) == FAIL)
        return;
      /*
!      * The current window change list index tracks only the position for the
!      * current buffer. For other buffers use the stored index for the current
!      * window, or, if that's not available, the change list length.
       */
!     if (buf == curwin->w_buffer)
!     {
!       changelistindex = curwin->w_changelistidx;
!     }
!     else
!     {
!       wininfo_T       *wip;
! 
!       FOR_ALL_BUF_WININFO(buf, wip)
!           if (wip->wi_win == curwin)
!               break;
!       changelistindex = wip != NULL ? wip->wi_changelistidx
!                                                       : buf->b_changelistlen;
!     }
!     list_append_number(rettv->vval.v_list, (varnumber_T)changelistindex);
  
      for (i = 0; i < buf->b_changelistlen; ++i)
      {
*** ../vim-8.2.4730/src/structs.h       2022-04-09 21:02:58.506251763 +0100
--- src/structs.h       2022-04-10 17:34:46.577734595 +0100
***************
*** 343,348 ****
--- 343,349 ----
      int               wi_fold_manual; // copy of w_fold_manual
      garray_T  wi_folds;       // clone of w_folds
  #endif
+     int               wi_changelistidx; // copy of w_changelistidx
  };
  
  /*
*** ../vim-8.2.4730/src/testdir/test_changelist.vim     2021-12-13 
13:11:00.696262332 +0000
--- src/testdir/test_changelist.vim     2022-04-10 17:34:46.577734595 +0100
***************
*** 1,6 ****
--- 1,28 ----
  " Tests for the changelist functionality
  
  " Tests for the getchangelist() function
+ func Test_changelist_index()
+   edit Xfile1.txt
+   exe "normal iabc\<C-G>u\ndef\<C-G>u\nghi"
+   call assert_equal(3, getchangelist('%')[1])
+   " Move one step back in the changelist.
+   normal 2g;
+ 
+   hide edit Xfile2.txt
+   exe "normal iabcd\<C-G>u\ndefg\<C-G>u\nghij"
+   call assert_equal(3, getchangelist('%')[1])
+   " Move to the beginning of the changelist.
+   normal 99g;
+ 
+   " Check the changelist indices.
+   call assert_equal(0, getchangelist('%')[1])
+   call assert_equal(1, getchangelist('#')[1])
+ 
+   bwipe!
+   call delete('Xfile1.txt')
+   call delete('Xfile2.txt')
+ endfunc
+ 
  func Test_getchangelist()
    bwipe!
    enew
***************
*** 11,16 ****
--- 33,39 ----
    call writefile(['line1', 'line2', 'line3'], 'Xfile2.txt')
  
    edit Xfile1.txt
+   let buf_1 = bufnr()
    exe "normal 1Goline\<C-G>u1.1"
    exe "normal 3Goline\<C-G>u2.1"
    exe "normal 5Goline\<C-G>u3.1"
***************
*** 22,27 ****
--- 45,51 ----
              \ getchangelist('%'))
  
    hide edit Xfile2.txt
+   let buf_2 = bufnr()
    exe "normal 1GOline\<C-G>u1.0"
    exe "normal 2Goline\<C-G>u2.0"
    call assert_equal([[
***************
*** 33,42 ****
    call assert_equal([[
              \ {'lnum' : 2, 'col' : 4, 'coladd' : 0},
              \ {'lnum' : 4, 'col' : 4, 'coladd' : 0},
!             \ {'lnum' : 6, 'col' : 4, 'coladd' : 0}], 3], getchangelist(2))
    call assert_equal([[
              \ {'lnum' : 1, 'col' : 6, 'coladd' : 0},
!             \ {'lnum' : 3, 'col' : 6, 'coladd' : 0}], 2], getchangelist(3))
  
    bwipe!
    call delete('Xfile1.txt')
--- 57,68 ----
    call assert_equal([[
              \ {'lnum' : 2, 'col' : 4, 'coladd' : 0},
              \ {'lnum' : 4, 'col' : 4, 'coladd' : 0},
!             \ {'lnum' : 6, 'col' : 4, 'coladd' : 0}], 2],
!             \ getchangelist(buf_1))
    call assert_equal([[
              \ {'lnum' : 1, 'col' : 6, 'coladd' : 0},
!             \ {'lnum' : 3, 'col' : 6, 'coladd' : 0}], 2],
!             \ getchangelist(buf_2))
  
    bwipe!
    call delete('Xfile1.txt')
*** ../vim-8.2.4730/src/version.c       2022-04-10 12:37:45.376577706 +0100
--- src/version.c       2022-04-10 17:40:15.890514147 +0100
***************
*** 748,749 ****
--- 748,751 ----
  {   /* Add new patch number below this line */
+ /**/
+     4731,
  /**/

-- 
Friends?  I have lots of friends!  In fact, I have all episodes ever made.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20220410170011.4F47D1C0463%40moolenaar.net.

Raspunde prin e-mail lui