Mercurial > vim
changeset 31012:4ba2890de10d v9.0.0841
patch 9.0.0841: deletebufline() does not always return 1 on failure
Commit: https://github.com/vim/vim/commit/7af3ee2b83545169d78a28ab1cd89aff1127f8b3
Author: zeertzjq <zeertzjq@outlook.com>
Date: Sun Nov 6 22:26:05 2022 +0000
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 https://github.com/vim/vim/issues/11511)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 06 Nov 2022 23:30:03 +0100 |
parents | 768705736aab |
children | a818f6703bef |
files | src/evalbuffer.c src/testdir/test_bufline.vim src/version.c |
diffstat | 3 files changed, 40 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/src/evalbuffer.c +++ b/src/evalbuffer.c @@ -535,6 +535,7 @@ f_deletebufline(typval_T *argvars, typva || 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, typva } 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 (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); - } + 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 } /*
--- 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