0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

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 #4896)
This commit is contained in:
Bram Moolenaar 2019-09-05 21:29:01 +02:00
parent a0d1fef4eb
commit 8d3b51084a
5 changed files with 45 additions and 20 deletions

View File

@ -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
}
}

View File

@ -8897,6 +8897,27 @@ 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)
{
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 */

View File

@ -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 : */

View File

@ -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

View File

@ -757,6 +757,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1988,
/**/
1987,
/**/