mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 9.0.0841: deletebufline() does not always return 1 on failure
Problem: deletebufline() does not always return 1 on failure. Solution: Refactor the code to make it work more predictable. (closes #11511)
This commit is contained in:
@@ -535,6 +535,7 @@ f_deletebufline(typval_T *argvars, typval_T *rettv)
|
|||||||
|| first > buf->b_ml.ml_line_count || last < first)
|
|| first > buf->b_ml.ml_line_count || last < first)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// After this don't use "return", goto "cleanup"!
|
||||||
if (!is_curbuf)
|
if (!is_curbuf)
|
||||||
{
|
{
|
||||||
VIsual_active = FALSE;
|
VIsual_active = FALSE;
|
||||||
@@ -556,38 +557,35 @@ f_deletebufline(typval_T *argvars, typval_T *rettv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (u_save(first - 1, last + 1) == FAIL)
|
if (u_save(first - 1, last + 1) == FAIL)
|
||||||
{
|
goto cleanup;
|
||||||
rettv->vval.v_number = 1; // FAIL
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (lnum = first; lnum <= last; ++lnum)
|
|
||||||
ml_delete_flags(first, ML_DEL_MESSAGE);
|
|
||||||
|
|
||||||
FOR_ALL_TAB_WINDOWS(tp, wp)
|
for (lnum = first; lnum <= last; ++lnum)
|
||||||
if (wp->w_buffer == buf)
|
ml_delete_flags(first, ML_DEL_MESSAGE);
|
||||||
{
|
|
||||||
if (wp->w_cursor.lnum > last)
|
|
||||||
wp->w_cursor.lnum -= count;
|
|
||||||
else if (wp->w_cursor.lnum > first)
|
|
||||||
wp->w_cursor.lnum = first;
|
|
||||||
if (wp->w_cursor.lnum > wp->w_buffer->b_ml.ml_line_count)
|
|
||||||
wp->w_cursor.lnum = wp->w_buffer->b_ml.ml_line_count;
|
|
||||||
wp->w_valid = 0;
|
|
||||||
if (wp->w_cursor.lnum <= wp->w_topline)
|
|
||||||
wp->w_topline = 1;
|
|
||||||
}
|
|
||||||
check_cursor_col();
|
|
||||||
deleted_lines_mark(first, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
FOR_ALL_TAB_WINDOWS(tp, wp)
|
||||||
|
if (wp->w_buffer == buf)
|
||||||
|
{
|
||||||
|
if (wp->w_cursor.lnum > last)
|
||||||
|
wp->w_cursor.lnum -= count;
|
||||||
|
else if (wp->w_cursor.lnum > first)
|
||||||
|
wp->w_cursor.lnum = first;
|
||||||
|
if (wp->w_cursor.lnum > wp->w_buffer->b_ml.ml_line_count)
|
||||||
|
wp->w_cursor.lnum = wp->w_buffer->b_ml.ml_line_count;
|
||||||
|
wp->w_valid = 0;
|
||||||
|
if (wp->w_cursor.lnum <= wp->w_topline)
|
||||||
|
wp->w_topline = 1;
|
||||||
|
}
|
||||||
|
check_cursor_col();
|
||||||
|
deleted_lines_mark(first, count);
|
||||||
|
rettv->vval.v_number = 0; // OK
|
||||||
|
|
||||||
|
cleanup:
|
||||||
if (!is_curbuf)
|
if (!is_curbuf)
|
||||||
{
|
{
|
||||||
curbuf = curbuf_save;
|
curbuf = curbuf_save;
|
||||||
curwin = curwin_save;
|
curwin = curwin_save;
|
||||||
VIsual_active = save_VIsual_active;
|
VIsual_active = save_VIsual_active;
|
||||||
}
|
}
|
||||||
rettv->vval.v_number = 0; // OK
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -279,4 +279,20 @@ func Test_setbufline_startup_nofile()
|
|||||||
call delete('Xresult')
|
call delete('Xresult')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test that setbufline(), appendbufline() and deletebufline() should fail and
|
||||||
|
" return 1 when "textlock" is active.
|
||||||
|
func Test_change_bufline_with_textlock()
|
||||||
|
new
|
||||||
|
inoremap <buffer> <expr> <F2> setbufline('', 1, '')
|
||||||
|
call assert_fails("normal a\<F2>", 'E565:')
|
||||||
|
call assert_equal('1', getline(1))
|
||||||
|
inoremap <buffer> <expr> <F2> appendbufline('', 1, '')
|
||||||
|
call assert_fails("normal a\<F2>", 'E565:')
|
||||||
|
call assert_equal('11', getline(1))
|
||||||
|
inoremap <buffer> <expr> <F2> deletebufline('', 1)
|
||||||
|
call assert_fails("normal a\<F2>", 'E565:')
|
||||||
|
call assert_equal('111', getline(1))
|
||||||
|
bwipe!
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@@ -695,6 +695,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 */
|
||||||
|
/**/
|
||||||
|
841,
|
||||||
/**/
|
/**/
|
||||||
840,
|
840,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user