summaryrefslogtreecommitdiffstats
path: root/patches/source/vim/patches/7.4.186
blob: 84f0a3133c239660f26ea2b0ac2f851f30af71cc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
To: vim_dev@googlegroups.com
Subject: Patch 7.4.186
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------

Patch 7.4.186 (after 7.4.085)
Problem:    Insert in Visual mode sometimes gives incorrect results.
            (Dominique Pelle)
Solution:   Remember the original insert start position. (Christian Brabandt,
            Dominique Pelle)
Files:      src/edit.c, src/globals.h, src/ops.c, src/structs.h


*** ../vim-7.4.185/src/edit.c	2014-01-23 22:45:54.608127182 +0100
--- src/edit.c	2014-02-22 22:43:52.820903112 +0100
***************
*** 264,269 ****
--- 264,270 ----
  
  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,345 ****
--- 341,349 ----
       * 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,636 ****
--- 635,643 ----
  	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,6928 ****
--- 6930,6936 ----
      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,8262 ****
--- 8265,8271 ----
  
  		  /* 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;
  
*** ../vim-7.4.185/src/globals.h	2014-02-11 15:10:38.130111835 +0100
--- src/globals.h	2014-02-22 23:02:01.644901378 +0100
***************
*** 752,757 ****
--- 752,763 ----
   */
  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.
*** ../vim-7.4.185/src/ops.c	2014-02-11 19:33:03.358353098 +0100
--- src/ops.c	2014-02-22 22:39:47.588903502 +0100
***************
*** 2643,2662 ****
  
  	/* 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->op_type == OP_INSERT
! 		    && oap->start.col != curbuf->b_op_start.col)
  	    {
! 		oap->start.col = curbuf->b_op_start.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->start.col = curbuf->b_op_start.col;
  		/* reset pre_textlen to the value of OP_INSERT */
  		pre_textlen += bd.textlen;
  		pre_textlen -= getviscol2(oap->start.col, oap->start.coladd)
--- 2643,2662 ----
  
  	/* 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_orig.lnum && !bd.is_MAX)
  	{
  	    if (oap->op_type == OP_INSERT
! 		    && oap->start.col != curbuf->b_op_start_orig.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_orig.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)
*** ../vim-7.4.185/src/structs.h	2014-02-11 15:10:38.138111836 +0100
--- src/structs.h	2014-02-22 22:39:47.588903502 +0100
***************
*** 1449,1454 ****
--- 1449,1455 ----
       * 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
*** ../vim-7.4.185/src/version.c	2014-02-22 22:27:20.772904692 +0100
--- src/version.c	2014-02-22 22:39:08.932903564 +0100
***************
*** 740,741 ****
--- 740,743 ----
  {   /* Add new patch number below this line */
+ /**/
+     186,
  /**/

-- 
Individualists unite!

 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///