summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-09-05 21:29:01 +0200
committerBram Moolenaar <Bram@vim.org>2019-09-05 21:29:01 +0200
commit8d3b51084a5bdcd2ee9e31bc03cba0d16c43d428 (patch)
tree9d639842238d3d284834750ef03b4bc6e550903e
parenta0d1fef4ebb693696464c5e22e33269f724b8e0e (diff)
downloadvim-git-8d3b51084a5bdcd2ee9e31bc03cba0d16c43d428.tar.gz
patch 8.1.1988: :startinsert! does not work the same way as "A"v8.1.1988
Problem: :startinsert! does not work the same way as "A". Solution: Use the same code to move the cursor. (closes #4896)
-rw-r--r--src/ex_docmd.c12
-rw-r--r--src/normal.c35
-rw-r--r--src/proto/normal.pro1
-rw-r--r--src/testdir/test_edit.vim15
-rw-r--r--src/version.c2
5 files changed, 45 insertions, 20 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index ef86ae5fc..0e0e1b879 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -7596,16 +7596,14 @@ ex_startinsert(exarg_T *eap)
{
if (eap->forceit)
{
- /* cursor line can be zero on startup */
+ // cursor line can be zero on startup
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. */
+ // Ignore the command when already in Insert mode. Inserting an
+ // expression register that invokes a function can do this.
if (State & INSERT)
return;
@@ -7620,7 +7618,7 @@ ex_startinsert(exarg_T *eap)
{
if (eap->cmdidx == CMD_startinsert)
restart_edit = 'i';
- curwin->w_curswant = 0; /* avoid MAXCOL */
+ curwin->w_curswant = 0; // avoid MAXCOL
}
}
diff --git a/src/normal.c b/src/normal.c
index 1db1d16ab..7abd3fc99 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -8898,6 +8898,27 @@ nv_esc(cmdarg_T *cap)
}
/*
+ * 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)
+ {
+ 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(ml_get_cursor());
+}
+
+/*
* Handle "A", "a", "I", "i" and <Insert> commands.
* Also handle K_PS, start bracketed paste.
*/
@@ -8983,19 +9004,7 @@ nv_edit(cmdarg_T *cap)
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(ml_get_cursor());
+ set_cursor_for_append_to_line();
break;
case 'I': /* "I"nsert before the first non-blank */
diff --git a/src/proto/normal.pro b/src/proto/normal.pro
index cc4bf7dfc..dd6222609 100644
--- a/src/proto/normal.pro
+++ b/src/proto/normal.pro
@@ -23,4 +23,5 @@ void do_nv_ident(int c1, int c2);
int get_visual_text(cmdarg_T *cap, char_u **pp, int *lenp);
void start_selection(void);
void may_start_select(int c);
+void set_cursor_for_append_to_line(void);
/* vim: set ft=c : */
diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim
index 799642d3d..6ee584810 100644
--- a/src/testdir/test_edit.vim
+++ b/src/testdir/test_edit.vim
@@ -1480,3 +1480,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
diff --git a/src/version.c b/src/version.c
index 420d1ff52..52e12ee74 100644
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1988,
+/**/
1987,
/**/
1986,