diff options
author | Bram Moolenaar <Bram@vim.org> | 2014-02-22 23:03:55 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2014-02-22 23:03:55 +0100 |
commit | b1d90a3d770c5e513e6cad8284a5168ac5535883 (patch) | |
tree | 5cf472c7e8c9b9c43ddabaeef69927364eafdbc5 /src | |
parent | 631abc35dfc7ad87255c940fd22eee416c731658 (diff) | |
download | vim-git-b1d90a3d770c5e513e6cad8284a5168ac5535883.tar.gz |
updated for version 7.4.186v7.4.186
Problem: Insert in Visual mode sometimes gives incorrect results.
(Dominique Pelle)
Solution: Remember the original insert start position. (Christian Brabandt,
Dominique Pelle)
Diffstat (limited to 'src')
-rw-r--r-- | src/edit.c | 9 | ||||
-rw-r--r-- | src/globals.h | 6 | ||||
-rw-r--r-- | src/ops.c | 10 | ||||
-rw-r--r-- | src/structs.h | 1 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 23 insertions, 5 deletions
diff --git a/src/edit.c b/src/edit.c index 29d8d3e65..57bd7761e 100644 --- a/src/edit.c +++ b/src/edit.c @@ -264,6 +264,7 @@ static char_u *do_insert_char_pre __ARGS((int c)); 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; diff --git a/src/globals.h b/src/globals.h index f72915411..fd4e70c74 100644 --- a/src/globals.h +++ b/src/globals.h @@ -752,6 +752,12 @@ EXTERN pos_T saved_cursor /* w_cursor before formatting text. */ */ 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. @@ -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) diff --git a/src/structs.h b/src/structs.h index c3f0312c1..5de3a683e 100644 --- a/src/structs.h +++ b/src/structs.h @@ -1449,6 +1449,7 @@ struct file_buffer * start and end of an operator, also used for '[ and '] */ pos_T b_op_start; + pos_T b_op_start_orig; /* used for Insstart_orig */ pos_T b_op_end; #ifdef FEAT_VIMINFO diff --git a/src/version.c b/src/version.c index 221df4238..8dcd656ca 100644 --- a/src/version.c +++ b/src/version.c @@ -739,6 +739,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 186, +/**/ 185, /**/ 184, |