aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authord10n <david@bitinvert.com>2017-07-08 06:50:58 -0400
committerJustin M. Keyes <justinkz@gmail.com>2017-07-08 12:50:58 +0200
commit69e9cda5ace194a678c125256bc5558bc2bfcfce (patch)
tree1510e93c9677293d51f81ff54484701535184665
parent17298a7912596c0009499b22493074f543d624d9 (diff)
downloadrneovim-69e9cda5ace194a678c125256bc5558bc2bfcfce.tar.gz
rneovim-69e9cda5ace194a678c125256bc5558bc2bfcfce.tar.bz2
rneovim-69e9cda5ace194a678c125256bc5558bc2bfcfce.zip
i_CTRL-O: fix :startinsert at end of line (#6963)
The gchar_cursor() == NUL check is already done in ins_ctrl_o. ins_esc changes gchar_cursor() so this if block is probably never entered. Issue: Pressing CTRL-O in insert mode at the end of the line and typing :startinsert moves the cursor 1 column back, when I expect the cursor to remain at the end of the line This is a regression from Vim behavior. Since at least Vim version 7.0, Vim returns you to insert mode at the end of the line. 091e7d033cbf0f4da068292ce4ac934f1c3dd91e is the first bad neovim commit Steps to reproduce using `nvim -u NORC`: `aaaa<C-o>:startinsert<CR>` Fixes #6962
-rw-r--r--src/nvim/edit.c2
-rw-r--r--test/functional/insert/ctrl_o_spec.lua43
2 files changed, 44 insertions, 1 deletions
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<C-o>')
+ feed(':let ctrlo = "test"<CR>')
+ 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<C-o>')
+ feed(':startinsert<CR>')
+ 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<C-o>')
+ feed(':startinsert<CR>')
+ 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<C-o>')
+ feed(':startinsert<CR>')
+ feed('ooo')
+ expect('hello oooworld')
+ end)
+end)