diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/edit.c | 5 | ||||
-rw-r--r-- | src/nvim/testdir/test_edit.vim | 30 |
2 files changed, 34 insertions, 1 deletions
diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 7a0487bb64..d20660bfb9 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -468,7 +468,10 @@ static void insert_enter(InsertState *s) } foldUpdateAfterInsert(); - if (s->cmdchar != 'r' && s->cmdchar != 'v') { + // When CTRL-C was typed got_int will be set, with the result + // that the autocommands won't be executed. When mapped got_int + // is not set, but let's keep the behavior the same. + if (s->cmdchar != 'r' && s->cmdchar != 'v' && s->c != Ctrl_C) { ins_apply_autocmds(EVENT_INSERTLEAVE); } did_cursorhold = false; diff --git a/src/nvim/testdir/test_edit.vim b/src/nvim/testdir/test_edit.vim index b1fce07f39..f8946c6929 100644 --- a/src/nvim/testdir/test_edit.vim +++ b/src/nvim/testdir/test_edit.vim @@ -1413,3 +1413,33 @@ func Test_edit_alt() bwipe XAltFile call delete('XAltFile') endfunc + +func Test_leave_insert_autocmd() + new + au InsertLeave * let g:did_au = 1 + let g:did_au = 0 + call feedkeys("afoo\<Esc>", 'tx') + call assert_equal(1, g:did_au) + call assert_equal('foo', getline(1)) + + let g:did_au = 0 + call feedkeys("Sbar\<C-C>", 'tx') + call assert_equal(0, g:did_au) + call assert_equal('bar', getline(1)) + + inoremap x xx<Esc> + let g:did_au = 0 + call feedkeys("Saax", 'tx') + call assert_equal(1, g:did_au) + call assert_equal('aaxx', getline(1)) + + inoremap x xx<C-C> + let g:did_au = 0 + call feedkeys("Sbbx", 'tx') + call assert_equal(0, g:did_au) + call assert_equal('bbxx', getline(1)) + + bwipe! + au! InsertLeave + iunmap x +endfunc |