summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/evalbuffer.c46
-rw-r--r--src/testdir/test_bufline.vim16
-rw-r--r--src/version.c2
3 files changed, 40 insertions, 24 deletions
diff --git a/src/evalbuffer.c b/src/evalbuffer.c
index 9ce1d41ae..4a9d5989e 100644
--- a/src/evalbuffer.c
+++ b/src/evalbuffer.c
@@ -535,6 +535,7 @@ f_deletebufline(typval_T *argvars, typval_T *rettv)
|| first > buf->b_ml.ml_line_count || last < first)
return;
+ // After this don't use "return", goto "cleanup"!
if (!is_curbuf)
{
VIsual_active = FALSE;
@@ -556,38 +557,35 @@ f_deletebufline(typval_T *argvars, typval_T *rettv)
}
if (u_save(first - 1, last + 1) == FAIL)
- {
- rettv->vval.v_number = 1; // FAIL
- }
- else
- {
- for (lnum = first; lnum <= last; ++lnum)
- ml_delete_flags(first, ML_DEL_MESSAGE);
+ goto cleanup;
- 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);
- }
+ for (lnum = first; lnum <= last; ++lnum)
+ ml_delete_flags(first, ML_DEL_MESSAGE);
+
+ 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)
{
curbuf = curbuf_save;
curwin = curwin_save;
VIsual_active = save_VIsual_active;
}
- rettv->vval.v_number = 0; // OK
}
/*
diff --git a/src/testdir/test_bufline.vim b/src/testdir/test_bufline.vim
index 13e891bcf..da8c4a5aa 100644
--- a/src/testdir/test_bufline.vim
+++ b/src/testdir/test_bufline.vim
@@ -279,4 +279,20 @@ func Test_setbufline_startup_nofile()
call delete('Xresult')
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
diff --git a/src/version.c b/src/version.c
index e7dc5a5b5..0e59a7874 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 841,
+/**/
840,
/**/
839,