diff options
author | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2019-09-06 23:01:25 -0400 |
---|---|---|
committer | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2019-09-06 23:27:14 -0400 |
commit | a96b3677c689c8382dde20cb8919bf0dab12a3aa (patch) | |
tree | f9d166b2b9d3dfcf3c49e160ed01cd62da9524d4 /src | |
parent | 158b78062e9daa65203b4591dae733dd6c11ad2c (diff) | |
download | rneovim-a96b3677c689c8382dde20cb8919bf0dab12a3aa.tar.gz rneovim-a96b3677c689c8382dde20cb8919bf0dab12a3aa.tar.bz2 rneovim-a96b3677c689c8382dde20cb8919bf0dab12a3aa.zip |
vim-patch:8.1.1988: :startinsert! does not work the same way as "A"
Problem: :startinsert! does not work the same way as "A".
Solution: Use the same code to move the cursor. (closes vim/vim#4896)
https://github.com/vim/vim/commit/8d3b51084a5bdcd2ee9e31bc03cba0d16c43d428
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/ex_docmd.c | 13 | ||||
-rw-r--r-- | src/nvim/normal.c | 31 | ||||
-rw-r--r-- | src/nvim/testdir/test_edit.vim | 15 |
3 files changed, 40 insertions, 19 deletions
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index b97c886094..d524c3d035 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -8305,15 +8305,14 @@ static void ex_startinsert(exarg_T *eap) if (!curwin->w_cursor.lnum) { curwin->w_cursor.lnum = 1; } - coladvance((colnr_T)MAXCOL); - curwin->w_curswant = MAXCOL; - curwin->w_set_curswant = FALSE; + set_cursor_for_append_to_line(); } - /* Ignore the command when already in Insert mode. Inserting an - * expression register that invokes a function can do this. */ - if (State & INSERT) + // Ignore the command when already in Insert mode. Inserting an + // expression register that invokes a function can do this. + if (State & INSERT) { return; + } if (eap->cmdidx == CMD_startinsert) restart_edit = 'a'; @@ -8325,7 +8324,7 @@ static void ex_startinsert(exarg_T *eap) if (!eap->forceit) { if (eap->cmdidx == CMD_startinsert) restart_edit = 'i'; - curwin->w_curswant = 0; /* avoid MAXCOL */ + curwin->w_curswant = 0; // avoid MAXCOL } if (VIsual_active) { diff --git a/src/nvim/normal.c b/src/nvim/normal.c index e6a4c38c59..e7e6d2b365 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -7508,6 +7508,23 @@ static void nv_esc(cmdarg_T *cap) restart_edit = 'a'; } +// Move the cursor for the "A" command. +void set_cursor_for_append_to_line(void) +{ + curwin->w_set_curswant = true; + if (ve_flags == VE_ALL) { + const int save_State = State; + + // Pretend Insert mode here to allow the cursor on the + // character past the end of the line + State = INSERT; + coladvance((colnr_T)MAXCOL); + State = save_State; + } else { + curwin->w_cursor.col += (colnr_T)STRLEN(get_cursor_pos_ptr()); + } +} + /// Handle "A", "a", "I", "i" and <Insert> commands. static void nv_edit(cmdarg_T *cap) { @@ -7529,18 +7546,8 @@ static void nv_edit(cmdarg_T *cap) clearop(cap->oap); } else if (!checkclearopq(cap->oap)) { switch (cap->cmdchar) { - case 'A': /* "A"ppend after the line */ - curwin->w_set_curswant = true; - if (ve_flags == VE_ALL) { - int save_State = State; - - /* Pretend Insert mode here to allow the cursor on the - * character past the end of the line */ - State = INSERT; - coladvance((colnr_T)MAXCOL); - State = save_State; - } else - curwin->w_cursor.col += (colnr_T)STRLEN(get_cursor_pos_ptr()); + case 'A': // "A"ppend after the line + set_cursor_for_append_to_line(); break; case 'I': /* "I"nsert before the first non-blank */ diff --git a/src/nvim/testdir/test_edit.vim b/src/nvim/testdir/test_edit.vim index 1010ae4e09..98fa9a3c47 100644 --- a/src/nvim/testdir/test_edit.vim +++ b/src/nvim/testdir/test_edit.vim @@ -1484,3 +1484,18 @@ func Test_edit_special_chars() close! endfunc + +func Test_edit_startinsert() + new + set backspace+=start + call setline(1, 'foobar') + call feedkeys("A\<C-U>\<Esc>", 'xt') + call assert_equal('', getline(1)) + + call setline(1, 'foobar') + call feedkeys(":startinsert!\<CR>\<C-U>\<Esc>", 'xt') + call assert_equal('', getline(1)) + + set backspace& + bwipe! +endfunc |