mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 8.1.1343: text properties not adjusted for Visual block mode delete
Problem: Text properties not adjusted for Visual block mode delete. Solution: Call adjust_prop_columns(). (closes #4384)
This commit is contained in:
11
src/misc1.c
11
src/misc1.c
@@ -434,8 +434,15 @@ set_indent(
|
|||||||
saved_cursor.col = (colnr_T)(s - newline);
|
saved_cursor.col = (colnr_T)(s - newline);
|
||||||
}
|
}
|
||||||
#ifdef FEAT_TEXT_PROP
|
#ifdef FEAT_TEXT_PROP
|
||||||
adjust_prop_columns(curwin->w_cursor.lnum, (colnr_T)(p - oldline),
|
{
|
||||||
ind_len - (colnr_T)(p - oldline));
|
int added = ind_len - (colnr_T)(p - oldline);
|
||||||
|
|
||||||
|
// When increasing indent this behaves like spaces were inserted at
|
||||||
|
// the old indent, when decreasing indent it behaves like spaces
|
||||||
|
// were deleted at the new indent.
|
||||||
|
adjust_prop_columns(curwin->w_cursor.lnum,
|
||||||
|
(colnr_T)(added > 0 ? (p - oldline) : ind_len), added);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
retval = TRUE;
|
retval = TRUE;
|
||||||
}
|
}
|
||||||
|
12
src/ops.c
12
src/ops.c
@@ -1916,10 +1916,9 @@ op_delete(oparg_T *oap)
|
|||||||
curwin->w_cursor.coladd = 0;
|
curwin->w_cursor.coladd = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* n == number of chars deleted
|
// "n" == number of chars deleted
|
||||||
* If we delete a TAB, it may be replaced by several characters.
|
// If we delete a TAB, it may be replaced by several characters.
|
||||||
* Thus the number of characters may increase!
|
// Thus the number of characters may increase!
|
||||||
*/
|
|
||||||
n = bd.textlen - bd.startspaces - bd.endspaces;
|
n = bd.textlen - bd.startspaces - bd.endspaces;
|
||||||
oldp = ml_get(lnum);
|
oldp = ml_get(lnum);
|
||||||
newp = alloc_check((unsigned)STRLEN(oldp) + 1 - n);
|
newp = alloc_check((unsigned)STRLEN(oldp) + 1 - n);
|
||||||
@@ -1935,6 +1934,11 @@ op_delete(oparg_T *oap)
|
|||||||
STRMOVE(newp + bd.textcol + bd.startspaces + bd.endspaces, oldp);
|
STRMOVE(newp + bd.textcol + bd.startspaces + bd.endspaces, oldp);
|
||||||
/* replace the line */
|
/* replace the line */
|
||||||
ml_replace(lnum, newp, FALSE);
|
ml_replace(lnum, newp, FALSE);
|
||||||
|
|
||||||
|
#ifdef FEAT_TEXT_PROP
|
||||||
|
if (curbuf->b_has_textprop && n != 0)
|
||||||
|
adjust_prop_columns(lnum, bd.textcol, -n);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
check_cursor_col();
|
check_cursor_col();
|
||||||
|
12
src/testdir/dumps/Test_textprop_vis_01.dump
Normal file
12
src/testdir/dumps/Test_textprop_vis_01.dump
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
|x+0&#ffffff0@4>x@1| |1+0&#ffff4012|2|3| +0&#ffffff0|x| @61
|
||||||
|
|x@5| |1+0&#ffff4012|2|3| +0&#ffffff0|x| @62
|
||||||
|
|x@4| |1+0&#ffff4012|2|3| +0&#ffffff0|x| @63
|
||||||
|
|x@4|1+0&#ffff4012|2|3| +0&#ffffff0|x| @64
|
||||||
|
|x@4|2+0&#ffff4012|3| +0&#ffffff0|x| @65
|
||||||
|
|x@3| |3+0&#ffff4012| +0&#ffffff0|x@1| @65
|
||||||
|
|x@2| |1+0&#ffff4012| +0&#ffffff0|x@2| @65
|
||||||
|
|x@1| |1+0&#ffff4012|2|x+0&#ffffff0@3| @65
|
||||||
|
|x| |1+0&#ffff4012|2|3|x+0&#ffffff0@3| @65
|
||||||
|
@1|1+0&#ffff4012|2|3| +0&#ffffff0|x@3| @65
|
||||||
|
|~+0#4040ff13&| @73
|
||||||
|
| +0#0000000&@56|1|,|6| @10|A|l@1|
|
12
src/testdir/dumps/Test_textprop_vis_02.dump
Normal file
12
src/testdir/dumps/Test_textprop_vis_02.dump
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
|x+0&#ffffff0@4> |1+0&#ffff4012|2|3| +0&#ffffff0|x| @63
|
||||||
|
|x@4|1+0&#ffff4012|2|3| +0&#ffffff0|x| @64
|
||||||
|
|x@4|2+0&#ffff4012|3| +0&#ffffff0|x| @65
|
||||||
|
|x@4|3+0&#ffff4012| +0&#ffffff0|x| @66
|
||||||
|
|x@4| |x| @67
|
||||||
|
|x@3| |x@1| @67
|
||||||
|
|x@2| |1+0&#ffff4012|x+0&#ffffff0@1| @67
|
||||||
|
|x@1| |1+0&#ffff4012|2|x+0&#ffffff0@1| @67
|
||||||
|
|x| |1+0&#ffff4012|2|3|x+0&#ffffff0@1| @67
|
||||||
|
@1|1+0&#ffff4012|2|3| +0&#ffffff0|x@1| @67
|
||||||
|
|~+0#4040ff13&| @73
|
||||||
|
| +0#0000000&@56|1|,|6| @10|A|l@1|
|
@@ -613,7 +613,7 @@ func Test_prop_undo()
|
|||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
" screenshot test with textprop highlighting
|
" screenshot test with textprop highlighting
|
||||||
funct Test_textprop_screenshots()
|
func Test_textprop_screenshot_various()
|
||||||
" The Vim running in the terminal needs to use utf-8.
|
" The Vim running in the terminal needs to use utf-8.
|
||||||
if !CanRunVimInTerminal() || g:orig_encoding != 'utf-8'
|
if !CanRunVimInTerminal() || g:orig_encoding != 'utf-8'
|
||||||
return
|
return
|
||||||
@@ -671,3 +671,52 @@ funct Test_textprop_screenshots()
|
|||||||
call StopVimInTerminal(buf)
|
call StopVimInTerminal(buf)
|
||||||
call delete('XtestProp')
|
call delete('XtestProp')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func RunTestVisualBlock(width, dump)
|
||||||
|
call writefile([
|
||||||
|
\ "call setline(1, ["
|
||||||
|
\ .. "'xxxxxxxxx 123 x',"
|
||||||
|
\ .. "'xxxxxxxx 123 x',"
|
||||||
|
\ .. "'xxxxxxx 123 x',"
|
||||||
|
\ .. "'xxxxxx 123 x',"
|
||||||
|
\ .. "'xxxxx 123 x',"
|
||||||
|
\ .. "'xxxx 123 xx',"
|
||||||
|
\ .. "'xxx 123 xxx',"
|
||||||
|
\ .. "'xx 123 xxxx',"
|
||||||
|
\ .. "'x 123 xxxxx',"
|
||||||
|
\ .. "' 123 xxxxxx',"
|
||||||
|
\ .. "])",
|
||||||
|
\ "hi SearchProp ctermbg=yellow",
|
||||||
|
\ "call prop_type_add('search', {'highlight': 'SearchProp'})",
|
||||||
|
\ "call prop_add(1, 11, {'length': 3, 'type': 'search'})",
|
||||||
|
\ "call prop_add(2, 10, {'length': 3, 'type': 'search'})",
|
||||||
|
\ "call prop_add(3, 9, {'length': 3, 'type': 'search'})",
|
||||||
|
\ "call prop_add(4, 8, {'length': 3, 'type': 'search'})",
|
||||||
|
\ "call prop_add(5, 7, {'length': 3, 'type': 'search'})",
|
||||||
|
\ "call prop_add(6, 6, {'length': 3, 'type': 'search'})",
|
||||||
|
\ "call prop_add(7, 5, {'length': 3, 'type': 'search'})",
|
||||||
|
\ "call prop_add(8, 4, {'length': 3, 'type': 'search'})",
|
||||||
|
\ "call prop_add(9, 3, {'length': 3, 'type': 'search'})",
|
||||||
|
\ "call prop_add(10, 2, {'length': 3, 'type': 'search'})",
|
||||||
|
\ "normal 1G6|\<C-V>" .. repeat('l', a:width - 1) .. "10jx",
|
||||||
|
\], 'XtestPropVis')
|
||||||
|
let buf = RunVimInTerminal('-S XtestPropVis', {'rows': 12})
|
||||||
|
call VerifyScreenDump(buf, 'Test_textprop_vis_' .. a:dump, {})
|
||||||
|
|
||||||
|
" clean up
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
call delete('XtestPropVis')
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" screenshot test with Visual block mode operations
|
||||||
|
func Test_textprop_screenshot_visual()
|
||||||
|
if !CanRunVimInTerminal()
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Delete two columns while text props are three chars wide.
|
||||||
|
call RunTestVisualBlock(2, '01')
|
||||||
|
|
||||||
|
" Same, but delete four columns
|
||||||
|
call RunTestVisualBlock(4, '02')
|
||||||
|
endfunc
|
||||||
|
@@ -957,7 +957,7 @@ clear_buf_prop_types(buf_T *buf)
|
|||||||
* shift by "bytes_added" (can be negative).
|
* shift by "bytes_added" (can be negative).
|
||||||
* Note that "col" is zero-based, while tp_col is one-based.
|
* Note that "col" is zero-based, while tp_col is one-based.
|
||||||
* Only for the current buffer.
|
* Only for the current buffer.
|
||||||
* Called is expected to check b_has_textprop and "bytes_added" being non-zero.
|
* Caller is expected to check b_has_textprop and "bytes_added" being non-zero.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
adjust_prop_columns(
|
adjust_prop_columns(
|
||||||
@@ -994,15 +994,28 @@ adjust_prop_columns(
|
|||||||
? 2 : 1))
|
? 2 : 1))
|
||||||
: (tmp_prop.tp_col > col + 1))
|
: (tmp_prop.tp_col > col + 1))
|
||||||
{
|
{
|
||||||
tmp_prop.tp_col += bytes_added;
|
if (tmp_prop.tp_col + bytes_added < col + 1)
|
||||||
|
{
|
||||||
|
tmp_prop.tp_len += (tmp_prop.tp_col - 1 - col) + bytes_added;
|
||||||
|
tmp_prop.tp_col = col + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
tmp_prop.tp_col += bytes_added;
|
||||||
dirty = TRUE;
|
dirty = TRUE;
|
||||||
|
if (tmp_prop.tp_len <= 0)
|
||||||
|
continue; // drop this text property
|
||||||
}
|
}
|
||||||
else if (tmp_prop.tp_len > 0
|
else if (tmp_prop.tp_len > 0
|
||||||
&& tmp_prop.tp_col + tmp_prop.tp_len > col
|
&& tmp_prop.tp_col + tmp_prop.tp_len > col
|
||||||
+ ((pt != NULL && (pt->pt_flags & PT_FLAG_INS_END_INCL))
|
+ ((pt != NULL && (pt->pt_flags & PT_FLAG_INS_END_INCL))
|
||||||
? 0 : 1))
|
? 0 : 1))
|
||||||
{
|
{
|
||||||
tmp_prop.tp_len += bytes_added;
|
int after = col - bytes_added
|
||||||
|
- (tmp_prop.tp_col - 1 + tmp_prop.tp_len);
|
||||||
|
if (after > 0)
|
||||||
|
tmp_prop.tp_len += bytes_added + after;
|
||||||
|
else
|
||||||
|
tmp_prop.tp_len += bytes_added;
|
||||||
dirty = TRUE;
|
dirty = TRUE;
|
||||||
if (tmp_prop.tp_len <= 0)
|
if (tmp_prop.tp_len <= 0)
|
||||||
continue; // drop this text property
|
continue; // drop this text property
|
||||||
|
@@ -767,6 +767,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1343,
|
||||||
/**/
|
/**/
|
||||||
1342,
|
1342,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user