vim-patch:7.4.616

Problem:    Cannot insert a tab in front of a block.
Solution:   Correctly compute aop->start. (Christian Brabandt)

f2c03d7301
This commit is contained in:
watiko
2016-01-18 21:22:49 +09:00
parent ee0e214427
commit c90784836b
4 changed files with 33 additions and 11 deletions

View File

@@ -1991,6 +1991,7 @@ void op_insert(oparg_T *oap, long count1)
char_u *firstline, *ins_text; char_u *firstline, *ins_text;
struct block_def bd; struct block_def bd;
int i; int i;
pos_T t1;
/* edit() changes this - record it for OP_APPEND */ /* edit() changes this - record it for OP_APPEND */
bd.is_MAX = (curwin->w_curswant == MAXCOL); bd.is_MAX = (curwin->w_curswant == MAXCOL);
@@ -2053,7 +2054,16 @@ void op_insert(oparg_T *oap, long count1)
} }
} }
edit(NUL, FALSE, (linenr_T)count1); t1 = oap->start;
edit(NUL, false, (linenr_T)count1);
// When a tab was inserted, and the characters in front of the tab
// have been converted to a tab as well, the column of the cursor
// might have actually been reduced, so need to adjust here. */
if (t1.lnum == curbuf->b_op_start_orig.lnum &&
lt(curbuf->b_op_start_orig, t1)) {
oap->start = curbuf->b_op_start_orig;
}
/* If user has moved off this line, we don't know what to do, so do /* If user has moved off this line, we don't know what to do, so do
* nothing. * nothing.
@@ -2070,20 +2080,22 @@ void op_insert(oparg_T *oap, long count1)
if (oap->op_type == OP_INSERT if (oap->op_type == OP_INSERT
&& oap->start.col + oap->start.coladd && oap->start.col + oap->start.coladd
!= curbuf->b_op_start_orig.col + curbuf->b_op_start_orig.coladd) { != curbuf->b_op_start_orig.col + curbuf->b_op_start_orig.coladd) {
size_t t = getviscol2(curbuf->b_op_start_orig.col,
curbuf->b_op_start_orig.coladd);
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) pre_textlen -= t - oap->start_vcol;
- oap->start_vcol; oap->start_vcol = t;
oap->start_vcol = getviscol2(oap->start.col, oap->start.coladd);
} else if (oap->op_type == OP_APPEND } else if (oap->op_type == OP_APPEND
&& oap->end.col + oap->end.coladd && oap->end.col + oap->end.coladd
>= curbuf->b_op_start_orig.col >= curbuf->b_op_start_orig.col
+ curbuf->b_op_start_orig.coladd) { + curbuf->b_op_start_orig.coladd) {
size_t t = getviscol2(curbuf->b_op_start_orig.col,
curbuf->b_op_start_orig.coladd);
oap->start.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 */ /* reset pre_textlen to the value of OP_INSERT */
pre_textlen += bd.textlen; pre_textlen += bd.textlen;
pre_textlen -= getviscol2(oap->start.col, oap->start.coladd) pre_textlen -= t - oap->start_vcol;
- oap->start_vcol; oap->start_vcol = t;
oap->start_vcol = getviscol2(oap->start.col, oap->start.coladd);
oap->op_type = OP_INSERT; oap->op_type = OP_INSERT;
} }
} }

View File

@@ -2,6 +2,10 @@
Test Visual block mode commands Test Visual block mode commands
And test "U" in Visual mode, also on German sharp S. And test "U" in Visual mode, also on German sharp S.
#define BO_ALL 0x0001
#define BO_BS 0x0002
#define BO_CRSR 0x0004
STARTTEST STARTTEST
:so small.vim :so small.vim
:so mbyte.vim :so mbyte.vim
@@ -68,6 +72,12 @@ G3o987652k02l2jr
:set ve=block :set ve=block
:exe ":norm! 2k\<C-V>$gj\<Esc>" :exe ":norm! 2k\<C-V>$gj\<Esc>"
:let cpos=getpos("'>") :let cpos=getpos("'>")
:$put ='col:'.cpos[2].' off:'.cpos[3]
:"
:" block_insert when replacing spaces in front of the block with tabs
:set ts=8 sts=4 sw=4
:4,7y
Gp
:exe ":norm! f0\<C-V>2jI\<tab>\<esc>" :exe ":norm! f0\<C-V>2jI\<tab>\<esc>"
:/^the/,$w >> test.out :/^the/,$w >> test.out
:qa! :qa!

Binary file not shown.

View File

@@ -508,7 +508,7 @@ static int included_patches[] = {
// 619 NA // 619 NA
// 618 NA // 618 NA
617, 617,
// 616, 616,
615, 615,
614, 614,
// 613, // 613,