1
0
forked from aniani/vim

updated for version 7.3.972

Problem:    Cursor not restored after InsertEnter autocommand if it moved to
            another line.
Solution:   Also restore if the saved line number is still valid.  Allow
            setting v:char to skip restoring.
This commit is contained in:
Bram Moolenaar 2013-05-19 21:15:15 +02:00
parent 884f6e44e0
commit 097c992c46
3 changed files with 19 additions and 6 deletions

View File

@ -691,8 +691,11 @@ InsertCharPre When a character is typed in Insert mode,
InsertEnter Just before starting Insert mode. Also for InsertEnter Just before starting Insert mode. Also for
Replace mode and Virtual Replace mode. The Replace mode and Virtual Replace mode. The
|v:insertmode| variable indicates the mode. |v:insertmode| variable indicates the mode.
Be careful not to move the cursor or do Be careful not to do anything else that the
anything else that the user does not expect. user does not expect.
The cursor is restored afterwards. If you do
not want that set |v:char| to a non-empty
string.
*InsertLeave* *InsertLeave*
InsertLeave When leaving Insert mode. Also when using InsertLeave When leaving Insert mode. Also when using
CTRL-O |i_CTRL-O|. But not for |i_CTRL-C|. CTRL-O |i_CTRL-O|. But not for |i_CTRL-C|.

View File

@ -382,13 +382,21 @@ edit(cmdchar, startln, count)
else else
ptr = (char_u *)"i"; ptr = (char_u *)"i";
set_vim_var_string(VV_INSERTMODE, ptr, 1); set_vim_var_string(VV_INSERTMODE, ptr, 1);
set_vim_var_string(VV_CHAR, NULL, -1); /* clear v:char */
# endif # endif
apply_autocmds(EVENT_INSERTENTER, NULL, NULL, FALSE, curbuf); apply_autocmds(EVENT_INSERTENTER, NULL, NULL, FALSE, curbuf);
/* Since Insert mode was not started yet a call to check_cursor_col() /* Make sure the cursor didn't move. Do call check_cursor_col() in
* may have moved the cursor, especially with the "A" command. */ * case the text was modified. Since Insert mode was not started yet
if (curwin->w_cursor.col != save_cursor.col * a call to check_cursor_col() may move the cursor, especially with
&& curwin->w_cursor.lnum == save_cursor.lnum) * the "A" command, thus set State to avoid that. Also check that the
* line number is still valid (lines may have been deleted).
* Do not restore if v:char was set to a non-empty string. */
if (!equalpos(curwin->w_cursor, save_cursor)
# ifdef FEAT_EVAL
&& *get_vim_var_str(VV_CHAR) == NUL
# endif
&& save_cursor.lnum <= curbuf->b_ml.ml_line_count)
{ {
int save_state = State; int save_state = State;

View File

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