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:
committed by
Christian Brabandt
parent
c62dacb7ed
commit
7ac1145fbe
26
src/edit.c
26
src/edit.c
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user