Mercurial > vim
changeset 5680:4d12112c5efa v7.4.186
updated for version 7.4.186
Problem: Insert in Visual mode sometimes gives incorrect results.
(Dominique Pelle)
Solution: Remember the original insert start position. (Christian Brabandt,
Dominique Pelle)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Sat, 22 Feb 2014 23:03:55 +0100 |
parents | 5fdabe005490 |
children | 0f96a9dc02e1 |
files | src/edit.c src/globals.h src/ops.c src/structs.h src/version.c |
diffstat | 5 files changed, 23 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/edit.c +++ b/src/edit.c @@ -264,6 +264,7 @@ static char_u *do_insert_char_pre __ARGS static colnr_T Insstart_textlen; /* length of line when insert started */ static colnr_T Insstart_blank_vcol; /* vcol for first inserted blank */ +static int update_Insstart_orig = TRUE; /* set Insstart_orig to Insstart */ static char_u *last_insert = NULL; /* the text of the previous insert, K_SPECIAL and CSI are escaped */ @@ -340,6 +341,9 @@ edit(cmdchar, startln, count) * error message */ check_for_delay(TRUE); + /* set Insstart_orig to Insstart */ + update_Insstart_orig = TRUE; + #ifdef HAVE_SANDBOX /* Don't allow inserting in the sandbox. */ if (sandbox != 0) @@ -631,6 +635,9 @@ edit(cmdchar, startln, count) if (arrow_used) /* don't repeat insert when arrow key used */ count = 0; + if (update_Insstart_orig) + Insstart_orig = Insstart; + if (stop_insert_mode) { /* ":stopinsert" used or 'insertmode' reset */ @@ -6923,6 +6930,7 @@ stop_insert(end_insert_pos, esc, nomove) if (end_insert_pos != NULL) { curbuf->b_op_start = Insstart; + curbuf->b_op_start_orig = Insstart_orig; curbuf->b_op_end = *end_insert_pos; } } @@ -8257,6 +8265,7 @@ ins_ctrl_g() /* Need to reset Insstart, esp. because a BS that joins * a line to the previous one must save for undo. */ + update_Insstart_orig = FALSE; Insstart = curwin->w_cursor; break;
--- a/src/globals.h +++ b/src/globals.h @@ -752,6 +752,12 @@ EXTERN pos_T saved_cursor /* w_cursor b */ EXTERN pos_T Insstart; /* This is where the latest * insert/append mode started. */ + +/* This is where the latest insert/append mode started. In contrast to + * Insstart, this won't be reset by certain keys and is needed for + * op_insert(), to detect correctly where inserting by the user started. */ +EXTERN pos_T Insstart_orig; + #ifdef FEAT_VREPLACE /* * Stuff for VREPLACE mode.
--- a/src/ops.c +++ b/src/ops.c @@ -2643,20 +2643,20 @@ op_insert(oap, count1) /* The user may have moved the cursor before inserting something, try * to adjust the block for that. */ - if (oap->start.lnum == curbuf->b_op_start.lnum && !bd.is_MAX) + if (oap->start.lnum == curbuf->b_op_start_orig.lnum && !bd.is_MAX) { if (oap->op_type == OP_INSERT - && oap->start.col != curbuf->b_op_start.col) + && oap->start.col != curbuf->b_op_start_orig.col) { - oap->start.col = curbuf->b_op_start.col; + oap->start.col = curbuf->b_op_start_orig.col; pre_textlen -= getviscol2(oap->start.col, oap->start.coladd) - oap->start_vcol; oap->start_vcol = getviscol2(oap->start.col, oap->start.coladd); } else if (oap->op_type == OP_APPEND - && oap->end.col >= curbuf->b_op_start.col) + && oap->end.col >= curbuf->b_op_start_orig.col) { - oap->start.col = curbuf->b_op_start.col; + oap->start.col = curbuf->b_op_start_orig.col; /* reset pre_textlen to the value of OP_INSERT */ pre_textlen += bd.textlen; pre_textlen -= getviscol2(oap->start.col, oap->start.coladd)