1
0
forked from aniani/vim

patch 9.1.0153: Text properties corrupted with fo+=aw and backspace

Problem:  Text properties corrupted with fo+=aw and backspace
Solution: Allocate line and move text properties
          (zeertzjq)

closes: #14147

Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
zeertzjq
2024-03-06 20:54:22 +01:00
committed by Christian Brabandt
parent c62dacb7ed
commit 7ac1145fbe
4 changed files with 49 additions and 4 deletions

View File

@@ -4101,12 +4101,30 @@ ins_bs(
&& has_format_option(FO_WHITE_PAR)) && has_format_option(FO_WHITE_PAR))
{ {
char_u *ptr = ml_get_buf(curbuf, curwin->w_cursor.lnum, char_u *ptr = ml_get_buf(curbuf, curwin->w_cursor.lnum,
TRUE); FALSE);
int len; int len = ml_get_curline_len();
len = (int)STRLEN(ptr);
if (len > 0 && ptr[len - 1] == ' ') if (len > 0 && ptr[len - 1] == ' ')
ptr[len - 1] = NUL; {
char_u *newp = alloc(curbuf->b_ml.ml_line_len - 1);
if (newp != NULL)
{
mch_memmove(newp, ptr, len - 1);
newp[len - 1] = NUL;
if (curbuf->b_ml.ml_line_len > len + 1)
mch_memmove(newp + len, ptr + len + 1,
curbuf->b_ml.ml_line_len - len - 1);
if (curbuf->b_ml.ml_flags
& (ML_LINE_DIRTY | ML_ALLOCATED))
vim_free(curbuf->b_ml.ml_line_ptr);
curbuf->b_ml.ml_line_ptr = newp;
curbuf->b_ml.ml_line_len--;
curbuf->b_ml.ml_line_textlen--;
curbuf->b_ml.ml_flags |= ML_LINE_DIRTY;
}
}
} }
(void)do_join(2, FALSE, FALSE, FALSE, FALSE); (void)do_join(2, FALSE, FALSE, FALSE, FALSE);

View File

@@ -237,6 +237,12 @@ func Test_comment_autoformat()
call feedkeys("aone\ntwo\n", 'xt') call feedkeys("aone\ntwo\n", 'xt')
call assert_equal(['one', 'two', ''], getline(1, '$')) call assert_equal(['one', 'two', ''], getline(1, '$'))
set backspace=indent,eol,start
%d
call feedkeys("aone \n\<BS>", 'xt')
call assert_equal(['one'], getline(1, '$'))
set backspace&
close! close!
endfunc endfunc

View File

@@ -4466,4 +4466,23 @@ func Test_textprop_notype_join()
bwipe! bwipe!
endfunc endfunc
" This was causing text property corruption.
func Test_textprop_backspace_fo_aw()
new
call setline(1, 'foobar')
call prop_type_add('test', {'highlight': 'ErrorMsg'})
call prop_add(1, 1, {'type': 'test', 'length': 3})
set backspace=indent,eol,start
setlocal formatoptions+=aw
call feedkeys("A \<CR>\<BS>\<Esc>", 'tx')
call assert_equal('foobar', getline(1))
call assert_equal([
\ #{id: 0, col: 1, start: 1, end: 1, type_bufnr: 0,
\ type: 'test', length: 3}], prop_list(1))
bwipe!
set backspace&
call prop_type_delete('test')
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -704,6 +704,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 */
/**/
153,
/**/ /**/
152, 152,
/**/ /**/