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.