Merge pull request #4117 from watiko/vim-7.4.963

Vim 7.4.{639,753,949,963}
This commit is contained in:
Justin M. Keyes
2016-01-29 20:41:03 -05:00
8 changed files with 261 additions and 86 deletions

View File

@@ -1430,6 +1430,9 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
|| VIsual_active
) && oap->op_type != OP_NOP) {
// Avoid a problem with unwanted linebreaks in block mode
if (curwin->w_p_lbr) {
curwin->w_valid &= ~VALID_VIRTCOL;
}
curwin->w_p_lbr = false;
oap->is_VIsual = VIsual_active;
if (oap->motion_force == 'V')
@@ -1598,55 +1601,7 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
virtual_op = virtual_active();
if (VIsual_active || redo_VIsual_busy) {
if (VIsual_mode == Ctrl_V) { /* block mode */
colnr_T start, end;
oap->motion_type = MBLOCK;
getvvcol(curwin, &(oap->start),
&oap->start_vcol, NULL, &oap->end_vcol);
if (!redo_VIsual_busy) {
getvvcol(curwin, &(oap->end), &start, NULL, &end);
if (start < oap->start_vcol)
oap->start_vcol = start;
if (end > oap->end_vcol) {
if (*p_sel == 'e' && start >= 1
&& start - 1 >= oap->end_vcol)
oap->end_vcol = start - 1;
else
oap->end_vcol = end;
}
}
/* if '$' was used, get oap->end_vcol from longest line */
if (curwin->w_curswant == MAXCOL) {
curwin->w_cursor.col = MAXCOL;
oap->end_vcol = 0;
for (curwin->w_cursor.lnum = oap->start.lnum;
curwin->w_cursor.lnum <= oap->end.lnum;
++curwin->w_cursor.lnum) {
getvvcol(curwin, &curwin->w_cursor, NULL, NULL, &end);
if (end > oap->end_vcol)
oap->end_vcol = end;
}
} else if (redo_VIsual_busy)
oap->end_vcol = oap->start_vcol + redo_VIsual_vcol - 1;
/*
* Correct oap->end.col and oap->start.col to be the
* upper-left and lower-right corner of the block area.
*
* (Actually, this does convert column positions into character
* positions)
*/
curwin->w_cursor.lnum = oap->end.lnum;
coladvance(oap->end_vcol);
oap->end = curwin->w_cursor;
curwin->w_cursor = oap->start;
coladvance(oap->start_vcol);
oap->start = curwin->w_cursor;
}
get_op_vcol(oap, redo_VIsual_vcol, true);
if (!redo_VIsual_busy && !gui_yank) {
/*
@@ -1894,9 +1849,14 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
else
restart_edit_save = 0;
restart_edit = 0;
// Restore linebreak, so that when the user edits it looks as before.
curwin->w_p_lbr = lbr_saved;
/* Reset finish_op now, don't want it set inside edit(). */
if (curwin->w_p_lbr != lbr_saved) {
curwin->w_p_lbr = lbr_saved;
get_op_vcol(oap, redo_VIsual_mode, false);
}
// Reset finish_op now, don't want it set inside edit().
finish_op = false;
if (op_change(oap)) /* will call edit() */
cap->retval |= CA_COMMAND_BUSY;
@@ -1974,7 +1934,10 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
restart_edit = 0;
// Restore linebreak, so that when the user edits it looks as before.
curwin->w_p_lbr = lbr_saved;
if (curwin->w_p_lbr != lbr_saved) {
curwin->w_p_lbr = lbr_saved;
get_op_vcol(oap, redo_VIsual_mode, false);
}
op_insert(oap, cap->count1);
@@ -1997,7 +1960,11 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
CancelRedo();
} else {
// Restore linebreak, so that when the user edits it looks as before.
curwin->w_p_lbr = lbr_saved;
if (curwin->w_p_lbr != lbr_saved) {
curwin->w_p_lbr = lbr_saved;
get_op_vcol(oap, redo_VIsual_mode, false);
}
op_replace(oap, cap->nchar);
}
break;
@@ -7698,6 +7665,71 @@ static void nv_open(cmdarg_T *cap)
n_opencmd(cap);
}
// calculate start/end virtual columns for operating in block mode
static void get_op_vcol(
oparg_T *oap,
colnr_T redo_VIsual_vcol,
bool initial // when true: adjust position for 'selectmode'
)
{
colnr_T start;
colnr_T end;
if (VIsual_mode != Ctrl_V) {
return;
}
oap->motion_type = MBLOCK;
// prevent from moving onto a trail byte
if (has_mbyte) {
mb_adjustpos(curwin->w_buffer, &oap->end);
}
getvvcol(curwin, &(oap->start), &oap->start_vcol, NULL, &oap->end_vcol);
getvvcol(curwin, &(oap->end), &start, NULL, &end);
if (start < oap->start_vcol) {
oap->start_vcol = start;
}
if (end > oap->end_vcol) {
if (initial && *p_sel == 'e'
&& start >= 1
&& start - 1 >= oap->end_vcol) {
oap->end_vcol = start - 1;
} else {
oap->end_vcol = end;
}
}
// if '$' was used, get oap->end_vcol from longest line
if (curwin->w_curswant == MAXCOL) {
curwin->w_cursor.col = MAXCOL;
oap->end_vcol = 0;
for (curwin->w_cursor.lnum = oap->start.lnum;
curwin->w_cursor.lnum <= oap->end.lnum; ++curwin->w_cursor.lnum) {
getvvcol(curwin, &curwin->w_cursor, NULL, NULL, &end);
if (end > oap->end_vcol) {
oap->end_vcol = end;
}
}
} else if (redo_VIsual_busy) {
oap->end_vcol = oap->start_vcol + redo_VIsual_vcol - 1;
}
// Correct oap->end.col and oap->start.col to be the
// upper-left and lower-right corner of the block area.
//
// (Actually, this does convert column positions into character
// positions)
curwin->w_cursor.lnum = oap->end.lnum;
coladvance(oap->end_vcol);
oap->end = curwin->w_cursor;
curwin->w_cursor = oap->start;
coladvance(oap->start_vcol);
oap->start = curwin->w_cursor;
}
// Handle an arbitrary event in normal mode
static void nv_event(cmdarg_T *cap)
{

View File

@@ -3410,7 +3410,7 @@ win_line (
int i;
int saved_nextra = n_extra;
if ((is_concealing || boguscols > 0) && vcol_off > 0) {
if (vcol_off > 0) {
// there are characters to conceal
tab_len += vcol_off;
}
@@ -3440,25 +3440,31 @@ win_line (
// n_extra will be increased by FIX_FOX_BOGUSCOLS
// macro below, so need to adjust for that here
if ((is_concealing || boguscols > 0) && vcol_off > 0) {
if (vcol_off > 0) {
n_extra -= vcol_off;
}
}
/* Tab alignment should be identical regardless of
* 'conceallevel' value. So tab compensates of all
* previous concealed characters, and thus resets vcol_off
* and boguscols accumulated so far in the line. Note that
* the tab can be longer than 'tabstop' when there
* are concealed characters. */
FIX_FOR_BOGUSCOLS;
// Make sure that the highlighting for the tab char will be correctly
// set further below (effectively reverts the FIX_FOR_BOGSUCOLS
// macro).
if (old_boguscols > 0 && n_extra > tab_len && wp->w_p_list
&& lcs_tab1) {
tab_len += n_extra - tab_len;
{
int vc_saved = vcol_off;
// Tab alignment should be identical regardless of
// 'conceallevel' value. So tab compensates of all
// previous concealed characters, and thus resets
// vcol_off and boguscols accumulated so far in the
// line. Note that the tab can be longer than
// 'tabstop' when there are concealed characters.
FIX_FOR_BOGUSCOLS;
// Make sure, the highlighting for the tab char will be
// correctly set further below (effectively reverts the
// FIX_FOR_BOGSUCOLS macro.
if (n_extra == tab_len + vc_saved && wp->w_p_list && lcs_tab1) {
tab_len += vc_saved;
}
}
mb_utf8 = FALSE; /* don't draw as UTF-8 */
mb_utf8 = (int)false; // don't draw as UTF-8
if (wp->w_p_list) {
c = lcs_tab1;
if (wp->w_p_lbr) {
@@ -3969,20 +3975,24 @@ win_line (
ScreenAttrs[off] = char_attr;
if (has_mbyte && (*mb_char2cells)(mb_c) > 1) {
/* Need to fill two screen columns. */
++off;
++col;
if (enc_utf8)
/* UTF-8: Put a 0 in the second screen char. */
// Need to fill two screen columns.
off++;
col++;
if (enc_utf8) {
// UTF-8: Put a 0 in the second screen char.
ScreenLines[off] = 0;
else
/* DBCS: Put second byte in the second screen char. */
} else {
// DBCS: Put second byte in the second screen char.
ScreenLines[off] = mb_c & 0xff;
++vcol;
/* When "tocol" is halfway through a character, set it to the end of
* the character, otherwise highlighting won't stop. */
if (tocol == vcol)
++tocol;
}
if (draw_state > WL_NR && filler_todo <= 0) {
vcol++;
}
// When "tocol" is halfway through a character, set it to the end of
// the character, otherwise highlighting won't stop.
if (tocol == vcol) {
tocol++;
}
if (wp->w_p_rl) {
/* now it's time to backup one cell */
--off;

View File

@@ -71,6 +71,17 @@ GGk
:set lbr
:normal $
GGk
:set list listchars=tab:>-
:normal 0
GGk
:normal W
GGk
:normal W
GGk
:normal W
GGk
:normal $
GGk
:" Display result.
:call append('$', 'end:')
:call append('$', positions)

View File

@@ -22,3 +22,8 @@ end:
9:25
9:26
9:26
9:1
9:9
9:17
9:25
9:26

View File

@@ -60,11 +60,21 @@ STARTTEST
:set cpo&vim linebreak
:let g:test ="Test 6: set linebreak with visual block mode"
:let line="REMOVE: this not"
:$put =g:test
:$put =line
:let line="REMOVE: aaaaaaaaaaaaa"
:$put =line
:1/^REMOVE:
0jf x:$put
:set cpo&vim linebreak
:let g:test ="Test 7: set linebreak with visual block mode and v_b_A"
:$put =g:test
Golong line: 40afoobar aTARGET at end
:exe "norm! $3B\<C-v>eAx\<Esc>"
:set cpo&vim linebreak sbr=
:let g:test ="Test 8: set linebreak with visual char mode and changing block"
:$put =g:test
Go1111-1111-1111-11-1111-1111-11110f-lv3lc2222bgj.
:%w! test.out
:qa!
ENDTEST

View File

@@ -32,7 +32,12 @@ Sabbbbbb bla
~
~
~
Test 6: set linebreak with visual block mode
this not
aaaaaaaaaaaaa
REMOVE:
REMOVE:
Test 7: set linebreak with visual block mode and v_b_A
long line: foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar TARGETx at end
Test 8: set linebreak with visual char mode and changing block
1111-2222-1111-11-1111-2222-1111

View File

@@ -171,7 +171,7 @@ static int included_patches[] = {
// 966 NA
// 965 NA
// 964 NA
// 963,
963,
// 962 NA
// 961,
// 960 NA
@@ -185,7 +185,7 @@ static int included_patches[] = {
// 952,
// 951,
950,
// 949,
949,
// 948 NA
// 947,
946,
@@ -381,7 +381,7 @@ static int included_patches[] = {
// 756 NA
// 755,
// 754,
// 753,
753,
// 752,
// 751 NA
// 750 NA
@@ -495,7 +495,7 @@ static int included_patches[] = {
642,
// 641 NA
640,
// 639,
639,
// 638 NA
637,
636,