aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2019-09-06 23:01:25 -0400
committerJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2019-09-06 23:27:14 -0400
commita96b3677c689c8382dde20cb8919bf0dab12a3aa (patch)
treef9d166b2b9d3dfcf3c49e160ed01cd62da9524d4 /src
parent158b78062e9daa65203b4591dae733dd6c11ad2c (diff)
downloadrneovim-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.c13
-rw-r--r--src/nvim/normal.c31
-rw-r--r--src/nvim/testdir/test_edit.vim15
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