mirror of
https://github.com/vim/vim.git
synced 2025-07-25 10:54:51 -04:00
patch 8.2.1690: text properties not adjusted for "I" in Visual block mode
Problem: Text properties not adjusted for "I" in Visual block mode. Solution: Call inserted_bytes().
This commit is contained in:
parent
ad5e5631c5
commit
8b51b7f0f1
@ -693,7 +693,7 @@ changed_bytes(linenr_T lnum, colnr_T col)
|
|||||||
* Like changed_bytes() but also adjust text properties for "added" bytes.
|
* Like changed_bytes() but also adjust text properties for "added" bytes.
|
||||||
* When "added" is negative text was deleted.
|
* When "added" is negative text was deleted.
|
||||||
*/
|
*/
|
||||||
static void
|
void
|
||||||
inserted_bytes(linenr_T lnum, colnr_T col, int added UNUSED)
|
inserted_bytes(linenr_T lnum, colnr_T col, int added UNUSED)
|
||||||
{
|
{
|
||||||
#ifdef FEAT_PROP_POPUP
|
#ifdef FEAT_PROP_POPUP
|
||||||
|
@ -481,6 +481,7 @@ block_insert(
|
|||||||
int count = 0; // extra spaces to replace a cut TAB
|
int count = 0; // extra spaces to replace a cut TAB
|
||||||
int spaces = 0; // non-zero if cutting a TAB
|
int spaces = 0; // non-zero if cutting a TAB
|
||||||
colnr_T offset; // pointer along new line
|
colnr_T offset; // pointer along new line
|
||||||
|
colnr_T startcol; // column where insert starts
|
||||||
unsigned s_len; // STRLEN(s)
|
unsigned s_len; // STRLEN(s)
|
||||||
char_u *newp, *oldp; // new, old lines
|
char_u *newp, *oldp; // new, old lines
|
||||||
linenr_T lnum; // loop var
|
linenr_T lnum; // loop var
|
||||||
@ -553,9 +554,10 @@ block_insert(
|
|||||||
|
|
||||||
// insert pre-padding
|
// insert pre-padding
|
||||||
vim_memset(newp + offset, ' ', (size_t)spaces);
|
vim_memset(newp + offset, ' ', (size_t)spaces);
|
||||||
|
startcol = offset + spaces;
|
||||||
|
|
||||||
// copy the new text
|
// copy the new text
|
||||||
mch_memmove(newp + offset + spaces, s, (size_t)s_len);
|
mch_memmove(newp + startcol, s, (size_t)s_len);
|
||||||
offset += s_len;
|
offset += s_len;
|
||||||
|
|
||||||
if (spaces && !bdp->is_short)
|
if (spaces && !bdp->is_short)
|
||||||
@ -574,6 +576,10 @@ block_insert(
|
|||||||
|
|
||||||
ml_replace(lnum, newp, FALSE);
|
ml_replace(lnum, newp, FALSE);
|
||||||
|
|
||||||
|
if (b_insert)
|
||||||
|
// correct any text properties
|
||||||
|
inserted_bytes(lnum, startcol, s_len);
|
||||||
|
|
||||||
if (lnum == oap->end.lnum)
|
if (lnum == oap->end.lnum)
|
||||||
{
|
{
|
||||||
// Set "']" mark to the end of the block instead of the end of
|
// Set "']" mark to the end of the block instead of the end of
|
||||||
|
@ -9,6 +9,7 @@ void may_invoke_listeners(buf_T *buf, linenr_T lnum, linenr_T lnume, int added);
|
|||||||
void invoke_listeners(buf_T *buf);
|
void invoke_listeners(buf_T *buf);
|
||||||
void remove_listeners(buf_T *buf);
|
void remove_listeners(buf_T *buf);
|
||||||
void changed_bytes(linenr_T lnum, colnr_T col);
|
void changed_bytes(linenr_T lnum, colnr_T col);
|
||||||
|
void inserted_bytes(linenr_T lnum, colnr_T col, int added);
|
||||||
void appended_lines(linenr_T lnum, long count);
|
void appended_lines(linenr_T lnum, long count);
|
||||||
void appended_lines_mark(linenr_T lnum, long count);
|
void appended_lines_mark(linenr_T lnum, long count);
|
||||||
void deleted_lines(linenr_T lnum, long count);
|
void deleted_lines(linenr_T lnum, long count);
|
||||||
|
@ -1314,4 +1314,35 @@ func Test_prop_increment_decrement()
|
|||||||
call prop_type_delete('test')
|
call prop_type_delete('test')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_prop_block_insert()
|
||||||
|
new
|
||||||
|
call prop_type_add('test', {'highlight': 'ErrorMsg'})
|
||||||
|
call setline(1, ['one ', 'two '])
|
||||||
|
call prop_add(1, 1, {'length': 3, 'type': 'test'})
|
||||||
|
call prop_add(2, 1, {'length': 3, 'type': 'test'})
|
||||||
|
|
||||||
|
" insert "xx" in the first column of both lines
|
||||||
|
exe "normal! gg0\<C-V>jIxx\<Esc>"
|
||||||
|
eval getline(1, 2)->assert_equal(['xxone ', 'xxtwo '])
|
||||||
|
let expected = [#{id: 0, col: 3, end: 1, type: 'test', length: 3, start: 1}]
|
||||||
|
eval prop_list(1)->assert_equal(expected)
|
||||||
|
eval prop_list(2)->assert_equal(expected)
|
||||||
|
|
||||||
|
" insert "yy" inside the text props to make them longer
|
||||||
|
exe "normal! gg03l\<C-V>jIyy\<Esc>"
|
||||||
|
eval getline(1, 2)->assert_equal(['xxoyyne ', 'xxtyywo '])
|
||||||
|
let expected[0].length = 5
|
||||||
|
eval prop_list(1)->assert_equal(expected)
|
||||||
|
eval prop_list(2)->assert_equal(expected)
|
||||||
|
|
||||||
|
" insert "zz" after the text props, text props don't change
|
||||||
|
exe "normal! gg07l\<C-V>jIzz\<Esc>"
|
||||||
|
eval getline(1, 2)->assert_equal(['xxoyynezz ', 'xxtyywozz '])
|
||||||
|
eval prop_list(1)->assert_equal(expected)
|
||||||
|
eval prop_list(2)->assert_equal(expected)
|
||||||
|
|
||||||
|
bwipe!
|
||||||
|
call prop_type_delete('test')
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@ -750,6 +750,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 */
|
||||||
|
/**/
|
||||||
|
1690,
|
||||||
/**/
|
/**/
|
||||||
1689,
|
1689,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user