From 783aa6b507bc40565c0b7dbd146beaa7645e72c5 Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Mon, 20 May 2019 12:49:42 -0400 Subject: vim-patch:8.0.1514: getting the list of changes is not easy Problem: Getting the list of changes is not easy. Solution: Add the getchangelist() function. (Yegappan Lakshmanan, closes vim/vim#2634) https://github.com/vim/vim/commit/07ad816525da67cab3c0db21d1286d221dbc7477 --- src/nvim/eval.c | 31 +++++++++++++++++++++++ src/nvim/eval.lua | 1 + src/nvim/testdir/test_changelist.vim | 48 ++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 src/nvim/testdir/test_changelist.vim (limited to 'src') diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 6479163028..7229b2f977 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -9547,6 +9547,37 @@ f_getbufvar_end: } } +// "getchangelist()" function +static void f_getchangelist(typval_T *argvars, typval_T *rettv, FunPtr fptr) +{ + tv_list_alloc_ret(rettv, 2); + const buf_T *const buf = find_buffer(&argvars[0]); + if (buf == NULL) { + return; + } + + list_T *const l = tv_list_alloc(buf->b_changelistlen); + tv_list_append_list(rettv->vval.v_list, l); + // 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. + tv_list_append_number(rettv->vval.v_list, + (buf == curwin->w_buffer) + ? curwin->w_changelistidx + : buf->b_changelistlen); + + for (int i = 0; i < buf->b_changelistlen; i++) { + if (buf->b_changelist[i].mark.lnum == 0) { + continue; + } + dict_T *const d = tv_dict_alloc(); + tv_list_append_dict(l, d); + tv_dict_add_nr(d, S_LEN("lnum"), buf->b_changelist[i].mark.lnum); + tv_dict_add_nr(d, S_LEN("col"), buf->b_changelist[i].mark.col); + tv_dict_add_nr(d, S_LEN("coladd"), buf->b_changelist[i].mark.coladd); + } +} + /* * "getchar()" function */ diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua index d4bb69613e..aad2de5d30 100644 --- a/src/nvim/eval.lua +++ b/src/nvim/eval.lua @@ -116,6 +116,7 @@ return { getbufinfo={args={0, 1}}, getbufline={args={2, 3}}, getbufvar={args={2, 3}}, + getchangelist={args={1, 1}}, getchar={args={0, 1}}, getcharmod={}, getcharsearch={}, diff --git a/src/nvim/testdir/test_changelist.vim b/src/nvim/testdir/test_changelist.vim new file mode 100644 index 0000000000..0880fce840 --- /dev/null +++ b/src/nvim/testdir/test_changelist.vim @@ -0,0 +1,48 @@ +" Tests for the changelist functionality + +" Tests for the getchangelist() function +func Test_getchangelist() + if !has("jumplist") + return + endif + + bwipe! + enew + call assert_equal([], getchangelist(10)) + call assert_equal([[], 0], getchangelist(bufnr('%'))) + + call writefile(['line1', 'line2', 'line3'], 'Xfile1.txt') + call writefile(['line1', 'line2', 'line3'], 'Xfile2.txt') + + edit Xfile1.txt + exe "normal 1Goline\u1.1" + exe "normal 3Goline\u2.1" + exe "normal 5Goline\u3.1" + normal g; + call assert_equal([[ + \ {'lnum' : 2, 'col' : 4, 'coladd' : 0}, + \ {'lnum' : 4, 'col' : 4, 'coladd' : 0}, + \ {'lnum' : 6, 'col' : 4, 'coladd' : 0}], 2], + \ getchangelist(bufnr('%'))) + + hide edit Xfile2.txt + exe "normal 1GOline\u1.0" + exe "normal 2Goline\u2.0" + call assert_equal([[ + \ {'lnum' : 1, 'col' : 6, 'coladd' : 0}, + \ {'lnum' : 3, 'col' : 6, 'coladd' : 0}], 2], + \ getchangelist(bufnr('%'))) + hide enew + + 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') + call delete('Xfile2.txt') +endfunc -- cgit From 7c979f972ede6c47b734fe547873848de438ba54 Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Mon, 20 May 2019 13:34:48 -0400 Subject: vim-patch:8.0.1519: getchangelist() does not use argument as bufname() Problem: Getchangelist() does not use argument as bufname(). Solution: Use get_buf_tv(). (Yegappan Lakshmanan, closes vim/vim#2641) https://github.com/vim/vim/commit/341a64c9cabff08e4a7dc8cd932a598e12134457 --- src/nvim/eval.c | 5 ++++- src/nvim/testdir/test_changelist.vim | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 7229b2f977..de510a8bca 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -9551,7 +9551,10 @@ f_getbufvar_end: static void f_getchangelist(typval_T *argvars, typval_T *rettv, FunPtr fptr) { tv_list_alloc_ret(rettv, 2); - const buf_T *const buf = find_buffer(&argvars[0]); + vim_ignored = tv_get_number(&argvars[0]); // issue errmsg if type error + emsg_off++; + const buf_T *const buf = tv_get_buf(&argvars[0], false); + emsg_off--; if (buf == NULL) { return; } diff --git a/src/nvim/testdir/test_changelist.vim b/src/nvim/testdir/test_changelist.vim index 0880fce840..dd6ea9600c 100644 --- a/src/nvim/testdir/test_changelist.vim +++ b/src/nvim/testdir/test_changelist.vim @@ -9,7 +9,7 @@ func Test_getchangelist() bwipe! enew call assert_equal([], getchangelist(10)) - call assert_equal([[], 0], getchangelist(bufnr('%'))) + call assert_equal([[], 0], getchangelist('%')) call writefile(['line1', 'line2', 'line3'], 'Xfile1.txt') call writefile(['line1', 'line2', 'line3'], 'Xfile2.txt') @@ -23,7 +23,7 @@ func Test_getchangelist() \ {'lnum' : 2, 'col' : 4, 'coladd' : 0}, \ {'lnum' : 4, 'col' : 4, 'coladd' : 0}, \ {'lnum' : 6, 'col' : 4, 'coladd' : 0}], 2], - \ getchangelist(bufnr('%'))) + \ getchangelist('%')) hide edit Xfile2.txt exe "normal 1GOline\u1.0" @@ -31,7 +31,7 @@ func Test_getchangelist() call assert_equal([[ \ {'lnum' : 1, 'col' : 6, 'coladd' : 0}, \ {'lnum' : 3, 'col' : 6, 'coladd' : 0}], 2], - \ getchangelist(bufnr('%'))) + \ getchangelist('%')) hide enew call assert_equal([[ -- cgit From 718702078356c4d53ef94e72662450b0971b5056 Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Mon, 20 May 2019 21:56:56 -0400 Subject: vim-patch:8.1.1360: buffer left 'nomodifiable' after :substitute Problem: Buffer left 'nomodifiable' after :substitute. (Ingo Karkat) Solution: Save the value of 'modifiable' earlier' (Christian Brabandt, closes vim/vim#4403) https://github.com/vim/vim/commit/80341bcd89764d96f87859a3aac8bc00aad1d762 --- src/nvim/ex_cmds.c | 1 + src/nvim/testdir/test_substitute.vim | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 8436ac810e..b3933ac9a6 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -3817,6 +3817,7 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, // 3. Substitute the string. During 'inccommand' preview only do this if // there is a replace pattern. if (!preview || has_second_delim) { + save_ma = curbuf->b_p_ma; if (subflags.do_count) { // prevent accidentally changing the buffer by a function curbuf->b_p_ma = false; diff --git a/src/nvim/testdir/test_substitute.vim b/src/nvim/testdir/test_substitute.vim index 8b306192f0..b29b678129 100644 --- a/src/nvim/testdir/test_substitute.vim +++ b/src/nvim/testdir/test_substitute.vim @@ -612,9 +612,24 @@ func Test_sub_replace_10() call assert_equal('1aaa', substitute('123', '1\zs\|[23]', 'a', 'g')) endfunc +func Test_sub_cmd_9() + new + let input = ['1 aaa', '2 aaa', '3 aaa'] + call setline(1, input) + func Foo() + return submatch(0) + endfunc + %s/aaa/\=Foo()/gn + call assert_equal(input, getline(1, '$')) + call assert_equal(1, &modifiable) + + delfunc Foo + bw! +endfunc + func Test_nocatch_sub_failure_handling() " normal error results in all replacements - func! Foo() + func Foo() foobar endfunc new @@ -650,6 +665,7 @@ func Test_nocatch_sub_failure_handling() call assert_equal(1, error_caught) call assert_equal(['1 aaa', '2 aaa', '3 aaa'], getline(1, 3)) + delfunc Foo bwipe! endfunc -- cgit