diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 08a2f42f74..ca62679fab 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -462,7 +462,7 @@ static void insert_enter(InsertState *s) // Always update o_lnum, so that a "CTRL-O ." that adds a line // still puts the cursor back after the inserted text. - if (ins_at_eol && gchar_cursor() == NUL) { + if (ins_at_eol) { o_lnum = curwin->w_cursor.lnum; } diff --git a/test/functional/insert/ctrl_o_spec.lua b/test/functional/insert/ctrl_o_spec.lua new file mode 100644 index 0000000000..fbdff8a3a0 --- /dev/null +++ b/test/functional/insert/ctrl_o_spec.lua @@ -0,0 +1,43 @@ +local helpers = require('test.functional.helpers')(after_each) +local clear = helpers.clear +local eq = helpers.eq +local eval = helpers.eval +local expect = helpers.expect +local feed = helpers.feed +local insert = helpers.insert + +describe('insert-mode Ctrl-O', function() + before_each(clear) + + it('enters command mode for one command', function() + feed('ihello world') + feed(':let ctrlo = "test"') + feed('iii') + expect('hello worldiii') + eq(1, eval('ctrlo ==# "test"')) + end) + + it('re-enters insert mode at the end of the line when running startinsert', function() + -- #6962 + feed('ihello world') + feed(':startinsert') + feed('iii') + expect('hello worldiii') + end) + + it('re-enters insert mode at the beginning of the line when running startinsert', function() + insert('hello world') + feed('0') + feed(':startinsert') + feed('aaa') + expect('aaahello world') + end) + + it('re-enters insert mode in the middle of the line when running startinsert', function() + insert('hello world') + feed('bi') + feed(':startinsert') + feed('ooo') + expect('hello oooworld') + end) +end)