mirror of
https://github.com/vim/vim.git
synced 2025-07-25 10:54:51 -04:00
patch 8.2.0109: corrupted text properties when expanding spaces
Problem: Corrupted text properties when expanding spaces. Solution: Reallocate the line. (Nobuhiro Takasaki, closes #5457)
This commit is contained in:
parent
bf0acff012
commit
ac15fd8c67
20
src/edit.c
20
src/edit.c
@ -5604,9 +5604,25 @@ ins_tab(void)
|
|||||||
#ifdef FEAT_PROP_POPUP
|
#ifdef FEAT_PROP_POPUP
|
||||||
if (!(State & VREPLACE_FLAG))
|
if (!(State & VREPLACE_FLAG))
|
||||||
{
|
{
|
||||||
mch_memmove(ptr, ptr + i, curbuf->b_ml.ml_line_len - i
|
char_u *newp;
|
||||||
- (ptr - curbuf->b_ml.ml_line_ptr));
|
int col;
|
||||||
|
|
||||||
|
newp = alloc(curbuf->b_ml.ml_line_len - i);
|
||||||
|
if (newp == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
col = ptr - curbuf->b_ml.ml_line_ptr;
|
||||||
|
if (col > 0)
|
||||||
|
mch_memmove(newp, ptr - col, col);
|
||||||
|
mch_memmove(newp + col, ptr + i,
|
||||||
|
curbuf->b_ml.ml_line_len - col - i);
|
||||||
|
|
||||||
|
if (curbuf->b_ml.ml_flags & ML_LINE_DIRTY)
|
||||||
|
vim_free(curbuf->b_ml.ml_line_ptr);
|
||||||
|
curbuf->b_ml.ml_line_ptr = newp;
|
||||||
curbuf->b_ml.ml_line_len -= i;
|
curbuf->b_ml.ml_line_len -= i;
|
||||||
|
curbuf->b_ml.ml_flags =
|
||||||
|
(curbuf->b_ml.ml_flags | ML_LINE_DIRTY) & ~ML_EMPTY;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
@ -926,19 +926,32 @@ func Test_proptype_substitute2()
|
|||||||
bwipe!
|
bwipe!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func SaveOptions()
|
||||||
|
let d = #{tabstop: &tabstop,
|
||||||
|
\ softtabstop: &softtabstop,
|
||||||
|
\ shiftwidth: &shiftwidth,
|
||||||
|
\ expandtab: &expandtab,
|
||||||
|
\ foldmethod: '"' .. &foldmethod .. '"',
|
||||||
|
\ }
|
||||||
|
return d
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func RestoreOptions(dict)
|
||||||
|
for name in keys(a:dict)
|
||||||
|
exe 'let &' .. name .. ' = ' .. a:dict[name]
|
||||||
|
endfor
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_textprop_noexpandtab()
|
func Test_textprop_noexpandtab()
|
||||||
%bwipe!
|
|
||||||
new
|
new
|
||||||
let save_ts = &tabstop
|
let save_dict = SaveOptions()
|
||||||
|
|
||||||
set tabstop=8
|
set tabstop=8
|
||||||
let save_sts = &softtabstop
|
|
||||||
set softtabstop=4
|
set softtabstop=4
|
||||||
let save_sw = &shiftwidth
|
|
||||||
set shiftwidth=4
|
set shiftwidth=4
|
||||||
let save_et = &expandtab
|
|
||||||
set noexpandtab
|
set noexpandtab
|
||||||
let save_fdm = &foldmethod
|
|
||||||
set foldmethod=marker
|
set foldmethod=marker
|
||||||
|
|
||||||
call feedkeys("\<esc>\<esc>0Ca\<cr>\<esc>\<up>", "tx")
|
call feedkeys("\<esc>\<esc>0Ca\<cr>\<esc>\<up>", "tx")
|
||||||
call prop_type_add('test', {'highlight': 'ErrorMsg'})
|
call prop_type_add('test', {'highlight': 'ErrorMsg'})
|
||||||
call prop_add(1, 1, {'end_col': 2, 'type': 'test'})
|
call prop_add(1, 1, {'end_col': 2, 'type': 'test'})
|
||||||
@ -955,9 +968,51 @@ func Test_textprop_noexpandtab()
|
|||||||
catch /^Vim\%((\a\+)\)\=:E964/
|
catch /^Vim\%((\a\+)\)\=:E964/
|
||||||
endtry
|
endtry
|
||||||
call prop_remove({'type': 'test'})
|
call prop_remove({'type': 'test'})
|
||||||
let &foldmethod = save_fdm
|
call prop_type_delete('test')
|
||||||
let &expandtab = save_et
|
|
||||||
let &shiftwidth = save_sw
|
call RestoreOptions(save_dict)
|
||||||
let &softtabstop = save_sts
|
bwipe!
|
||||||
let &tabstop = save_ts
|
endfunc
|
||||||
|
|
||||||
|
func Test_textprop_noexpandtab_redraw()
|
||||||
|
new
|
||||||
|
let save_dict = SaveOptions()
|
||||||
|
|
||||||
|
set tabstop=8
|
||||||
|
set softtabstop=4
|
||||||
|
set shiftwidth=4
|
||||||
|
set noexpandtab
|
||||||
|
set foldmethod=marker
|
||||||
|
|
||||||
|
call feedkeys("\<esc>\<esc>0Ca\<cr>\<space>\<esc>\<up>", "tx")
|
||||||
|
call prop_type_add('test', {'highlight': 'ErrorMsg'})
|
||||||
|
call prop_add(1, 1, {'end_col': 2, 'type': 'test'})
|
||||||
|
call feedkeys("0i\<tab>", "tx")
|
||||||
|
" Internally broken at the next line
|
||||||
|
call feedkeys("A\<left>\<tab>", "tx")
|
||||||
|
redraw
|
||||||
|
" Index calculation failed internally on next line
|
||||||
|
call prop_add(1, 1, {'end_col': 2, 'type': 'test'})
|
||||||
|
call prop_remove({'type': 'test', 'all': v:true})
|
||||||
|
call prop_type_delete('test')
|
||||||
|
call prop_type_delete('test')
|
||||||
|
|
||||||
|
call RestoreOptions(save_dict)
|
||||||
|
bwipe!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func Test_textprop_ins_str()
|
||||||
|
new
|
||||||
|
call setline(1, 'just some text')
|
||||||
|
call prop_type_add('test', {'highlight': 'ErrorMsg'})
|
||||||
|
call prop_add(1, 1, {'end_col': 2, 'type': 'test'})
|
||||||
|
call assert_equal([{'id': 0, 'col': 1, 'end': 1, 'type': 'test', 'length': 1, 'start': 1}], prop_list(1))
|
||||||
|
|
||||||
|
call feedkeys("foi\<F8>\<Esc>", "tx")
|
||||||
|
call assert_equal('just s<F8>ome text', getline(1))
|
||||||
|
call assert_equal([{'id': 0, 'col': 1, 'end': 1, 'type': 'test', 'length': 1, 'start': 1}], prop_list(1))
|
||||||
|
|
||||||
|
bwipe!
|
||||||
|
call prop_remove({'type': 'test'})
|
||||||
|
call prop_type_delete('test')
|
||||||
endfunc
|
endfunc
|
||||||
|
@ -742,6 +742,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 */
|
||||||
|
/**/
|
||||||
|
109,
|
||||||
/**/
|
/**/
|
||||||
108,
|
108,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user