From 69bd1e4e36fa3e3f604740c92b15b13141520822 Mon Sep 17 00:00:00 2001 From: Magnus Groß Date: Wed, 29 Sep 2021 16:36:48 +0200 Subject: vim-patch:8.2.3430: no generic way to trigger an autocommand on mode change Problem: No generic way to trigger an autocommand on mode change. Solution: Add the ModeChanged autocommand event. (Magnus Gross, closes vim/vim#8856) https://github.com/vim/vim/commit/f1e8876fa2359b572d262772747405d3616db670 N/A patches for version.c: vim-patch:8.2.3434: function prototype for trigger_modechanged() is incomplete Problem: Function prototype for trigger_modechanged() is incomplete. Solution: Add "void". https://github.com/vim/vim/commit/28e591dd5080bbcd0f468f9d9597cedb716e28c9 Fixes #4399. Fixes #7416. --- src/nvim/testdir/test_edit.vim | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'src/nvim/testdir') diff --git a/src/nvim/testdir/test_edit.vim b/src/nvim/testdir/test_edit.vim index 23ad8dbfc5..75e30502b8 100644 --- a/src/nvim/testdir/test_edit.vim +++ b/src/nvim/testdir/test_edit.vim @@ -1644,4 +1644,38 @@ func Test_read_invalid() set encoding=utf-8 endfunc +" Test for ModeChanged pattern +func Test_mode_changes() + let g:count = 0 + func! DoIt() + let g:count += 1 + endfunc + let g:index = 0 + let g:mode_seq = ['n', 'i', 'n', 'v', 'V', 'n', 'V', 'v', 'n'] + func! TestMode() + call assert_equal(g:mode_seq[g:index], get(v:event, "old_mode")) + call assert_equal(g:mode_seq[g:index + 1], get(v:event, "new_mode")) + call assert_equal(mode(), get(v:event, "new_mode")) + let g:index += 1 + endfunc + + au ModeChanged * :call TestMode() + au ModeChanged n:* :call DoIt() + call feedkeys("i\vV\", 'tnix') + call assert_equal(2, g:count) + + au ModeChanged V:v :call DoIt() + call feedkeys("Vv\", 'tnix') + call assert_equal(4, g:count) + + call assert_equal(len(g:mode_seq) - 1, g:index) + + au! ModeChanged + delfunc TestMode + unlet! g:mode_seq + unlet! g:index + delfunc DoIt + unlet! g:count +endfunc + " vim: shiftwidth=2 sts=2 expandtab -- cgit From fc3e5caefd2896f37f50222ca0b0c3a46f83deca Mon Sep 17 00:00:00 2001 From: Magnus Groß Date: Sun, 3 Oct 2021 16:15:28 +0200 Subject: vim-patch:8.2.3462: ModeChanged only uses one character for new_mode and old_mode Problem: The ModeChanged event only uses one character for the new_mode and old_mode values. Solution: Pass one as first argument to mode(). (issue vim/vim#8856) https://github.com/vim/vim/commit/d85931e67316e824878000d0ead122553ccef3a4 --- src/nvim/testdir/test_edit.vim | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/nvim/testdir') diff --git a/src/nvim/testdir/test_edit.vim b/src/nvim/testdir/test_edit.vim index 75e30502b8..40cee63064 100644 --- a/src/nvim/testdir/test_edit.vim +++ b/src/nvim/testdir/test_edit.vim @@ -1655,7 +1655,7 @@ func Test_mode_changes() func! TestMode() call assert_equal(g:mode_seq[g:index], get(v:event, "old_mode")) call assert_equal(g:mode_seq[g:index + 1], get(v:event, "new_mode")) - call assert_equal(mode(), get(v:event, "new_mode")) + call assert_equal(mode(1), get(v:event, "new_mode")) let g:index += 1 endfunc @@ -1667,7 +1667,11 @@ func Test_mode_changes() au ModeChanged V:v :call DoIt() call feedkeys("Vv\", 'tnix') call assert_equal(4, g:count) + call assert_equal(len(g:mode_seq) - 1, g:index) + let g:index = 0 + let g:mode_seq = ['n', 'i', 'niI', 'i', 'n'] + call feedkeys("a\l\", 'tnix') call assert_equal(len(g:mode_seq) - 1, g:index) au! ModeChanged -- cgit From 60c154687a8b8fbdb97cf3d394ae6aa5c6f90670 Mon Sep 17 00:00:00 2001 From: Magnus Groß Date: Sun, 3 Oct 2021 16:19:45 +0200 Subject: vim-patch:8.2.3463: pattern matching with ModeChanged not tested Problem: Pattern matching with ModeChanged not tested. Solution: Add a few more test lines. (issue vim/vim#8856) https://github.com/vim/vim/commit/72d2fa69e56dd0e61eac87a9c3b79cd89d47cdd9 --- src/nvim/testdir/test_edit.vim | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src/nvim/testdir') diff --git a/src/nvim/testdir/test_edit.vim b/src/nvim/testdir/test_edit.vim index 40cee63064..690558a44a 100644 --- a/src/nvim/testdir/test_edit.vim +++ b/src/nvim/testdir/test_edit.vim @@ -1669,10 +1669,31 @@ func Test_mode_changes() call assert_equal(4, g:count) call assert_equal(len(g:mode_seq) - 1, g:index) + let g:n_to_i = 0 + au ModeChanged n:i let g:n_to_i += 1 + let g:n_to_niI = 0 + au ModeChanged i:niI let g:n_to_niI += 1 + let g:niI_to_i = 0 + au ModeChanged niI:i let g:niI_to_i += 1 + let g:nany_to_i = 0 + au ModeChanged n*:i let g:nany_to_i += 1 + let g:i_to_n = 0 + au ModeChanged i:n let g:i_to_n += 1 + let g:nori_to_any = 0 + au ModeChanged [ni]:* let g:nori_to_any += 1 + let g:i_to_any = 0 + au ModeChanged i:* let g:i_to_any += 1 let g:index = 0 let g:mode_seq = ['n', 'i', 'niI', 'i', 'n'] call feedkeys("a\l\", 'tnix') call assert_equal(len(g:mode_seq) - 1, g:index) + call assert_equal(1, g:n_to_i) + call assert_equal(1, g:n_to_niI) + call assert_equal(1, g:niI_to_i) + call assert_equal(2, g:nany_to_i) + call assert_equal(1, g:i_to_n) + call assert_equal(2, g:i_to_any) + call assert_equal(3, g:nori_to_any) au! ModeChanged delfunc TestMode -- cgit From 11683193f597e1b3144ba65f08056cd44b19175f Mon Sep 17 00:00:00 2001 From: Magnus Groß Date: Fri, 22 Oct 2021 20:36:35 +0200 Subject: vim-patch:8.2.3555: ModeChanged is not triggered on every mode change Problem: ModeChanged is not triggered on every mode change. Solution: Also trigger on minor mode changes. (Maguns Gross, closes vim/vim#8999) https://github.com/vim/vim/commit/25def2c8b8bd7b0c3d5f020207c717a880b05d50 --- src/nvim/testdir/test_edit.vim | 46 +++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 14 deletions(-) (limited to 'src/nvim/testdir') diff --git a/src/nvim/testdir/test_edit.vim b/src/nvim/testdir/test_edit.vim index 690558a44a..95eb5a0c8b 100644 --- a/src/nvim/testdir/test_edit.vim +++ b/src/nvim/testdir/test_edit.vim @@ -1646,12 +1646,8 @@ endfunc " Test for ModeChanged pattern func Test_mode_changes() - let g:count = 0 - func! DoIt() - let g:count += 1 - endfunc let g:index = 0 - let g:mode_seq = ['n', 'i', 'n', 'v', 'V', 'n', 'V', 'v', 'n'] + let g:mode_seq = ['n', 'i', 'n', 'v', 'V', 'i', 'ix', 'i', 'ic', 'i', 'n', 'no', 'n', 'V', 'v', 's', 'n'] func! TestMode() call assert_equal(g:mode_seq[g:index], get(v:event, "old_mode")) call assert_equal(g:mode_seq[g:index + 1], get(v:event, "new_mode")) @@ -1660,13 +1656,15 @@ func Test_mode_changes() endfunc au ModeChanged * :call TestMode() - au ModeChanged n:* :call DoIt() - call feedkeys("i\vV\", 'tnix') - call assert_equal(2, g:count) - - au ModeChanged V:v :call DoIt() - call feedkeys("Vv\", 'tnix') - call assert_equal(4, g:count) + let g:n_to_any = 0 + au ModeChanged n:* let g:n_to_any += 1 + call feedkeys("i\vVca\\\\ggdG", 'tnix') + + let g:V_to_v = 0 + au ModeChanged V:v let g:V_to_v += 1 + call feedkeys("Vv\\", 'tnix') + call assert_equal(len(filter(g:mode_seq[1:], {idx, val -> val == 'n'})), g:n_to_any) + call assert_equal(1, g:V_to_v) call assert_equal(len(g:mode_seq) - 1, g:index) let g:n_to_i = 0 @@ -1695,12 +1693,32 @@ func Test_mode_changes() call assert_equal(2, g:i_to_any) call assert_equal(3, g:nori_to_any) + if has('terminal') + let g:mode_seq += ['c', 'n', 't', 'nt', 'c', 'nt', 'n'] + call feedkeys(":term\\N:bd!\", 'tnix') + call assert_equal(len(g:mode_seq) - 1, g:index) + call assert_equal(1, g:n_to_i) + call assert_equal(1, g:n_to_niI) + call assert_equal(1, g:niI_to_i) + call assert_equal(2, g:nany_to_i) + call assert_equal(1, g:i_to_n) + call assert_equal(2, g:i_to_any) + call assert_equal(5, g:nori_to_any) + endif + au! ModeChanged delfunc TestMode unlet! g:mode_seq unlet! g:index - delfunc DoIt - unlet! g:count + unlet! g:n_to_any + unlet! g:V_to_v + unlet! g:n_to_i + unlet! g:n_to_niI + unlet! g:niI_to_i + unlet! g:nany_to_i + unlet! g:i_to_n + unlet! g:nori_to_any + unlet! g:i_to_any endfunc " vim: shiftwidth=2 sts=2 expandtab -- cgit From 1fb101afe4f28ada83721c4ac260de46d23504ee Mon Sep 17 00:00:00 2001 From: Magnus Groß Date: Wed, 17 Nov 2021 17:55:49 +0100 Subject: vim-patch:8.2.3609: internal error when ModeChanged is triggered recursively Problem: Internal error when ModeChanged is triggered when v:event is already in use. Solution: Save and restore v:event if needed. https://github.com/vim/vim/commit/3075a45592fe76f2febb6321632a23e352efe949 In the vim codebase there is no occurrence of get_vim_var_dict(VV_EVENT) after the above patch, so in order to hold the same invariant in the neovim codebase we needed to replace more occurrences than the related vim patch. --- src/nvim/testdir/test_edit.vim | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/nvim/testdir') diff --git a/src/nvim/testdir/test_edit.vim b/src/nvim/testdir/test_edit.vim index 95eb5a0c8b..7a7f4cb036 100644 --- a/src/nvim/testdir/test_edit.vim +++ b/src/nvim/testdir/test_edit.vim @@ -1721,4 +1721,10 @@ func Test_mode_changes() unlet! g:i_to_any endfunc +func Test_recursive_ModeChanged() + au! ModeChanged * norm 0u + sil! norm  + au! +endfunc + " vim: shiftwidth=2 sts=2 expandtab -- cgit From 980c68d0362c3ca099c0facef2d08efede76aabf Mon Sep 17 00:00:00 2001 From: Magnus Groß Date: Wed, 17 Nov 2021 18:31:51 +0100 Subject: vim-patch:8.2.3610: crash when ModeChanged triggered too early Problem: Crash when ModeChanged triggered too early. Solution: Trigger ModeChanged after setting VIsual. https://github.com/vim/vim/commit/a062006b9de0b2947ab5fb376c6e67ef92a8cd69 --- src/nvim/testdir/test_edit.vim | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src/nvim/testdir') diff --git a/src/nvim/testdir/test_edit.vim b/src/nvim/testdir/test_edit.vim index 7a7f4cb036..37786f3ca0 100644 --- a/src/nvim/testdir/test_edit.vim +++ b/src/nvim/testdir/test_edit.vim @@ -1727,4 +1727,12 @@ func Test_recursive_ModeChanged() au! endfunc +func Test_ModeChanged_starts_visual() + " This was triggering ModeChanged before setting VIsual, causing a crash. + au! ModeChanged * norm 0u + sil! norm  + + au! ModeChanged +endfunc + " vim: shiftwidth=2 sts=2 expandtab -- cgit