# HG changeset patch # User Bram Moolenaar # Date 1667692804 -3600 # Node ID eb145a4d6bf83c2466fd2413c699d8967dc9322f # Parent bcf955fec2e1104409dbce4702e12bc76501a7f8 patch 9.0.0837: append() reports failure when not appending anything Commit: https://github.com/vim/vim/commit/cd9c8d400c1eb9cbb4ff6a33be02f91a30ab13b2 Author: Bram Moolenaar Date: Sat Nov 5 23:46:43 2022 +0000 patch 9.0.0837: append() reports failure when not appending anything Problem: append() reports failure when not appending anything. Solution: Only report failure when appending something. (closes https://github.com/vim/vim/issues/11498) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -806,8 +806,10 @@ append({lnum}, {text}) *append()* {lnum} can be zero to insert a line before the first one. {lnum} is used like with |getline()|. Returns 1 for failure ({lnum} out of range or out of memory), - 0 for success. In |Vim9| script an invalid argument or - negative number results in an error. Example: > + 0 for success. When {text} is an empty list zero is returned, + no matter the value of {lnum}. + In |Vim9| script an invalid argument or negative number + results in an error. Example: > :let failed = append(line('$'), "# THE END") :let failed = append(0, ["Chapter 1", "the beginning"]) @@ -835,7 +837,9 @@ appendbufline({buf}, {lnum}, {text}) * If {buf} is not a valid buffer or {lnum} is not valid, an error message is given. Example: > :let failed = appendbufline(13, 0, "# THE START") -< +< However, when {text} is an empty list then no error is given + for an invalid {lnum}, since {lnum} isn't actually used. + Can also be used as a |method| after a List, the base is passed as the second argument: > mylist->appendbufline(buf, lnum) @@ -981,7 +985,7 @@ autocmd_add({acmds}) *autocmd_add()* let acmd.bufnr = 5 let acmd.cmd = 'call BufEnterFunc()' call autocmd_add([acmd]) - +< Can also be used as a |method|: > GetAutocmdList()->autocmd_add() < @@ -7873,9 +7877,10 @@ setbufline({buf}, {lnum}, {text}) *set To insert lines use |appendbufline()|. Any text properties in {lnum} are cleared. - {text} can be a string to set one line, or a list of strings - to set multiple lines. If the list extends below the last - line then those lines are added. + {text} can be a string to set one line, or a List of strings + to set multiple lines. If the List extends below the last + line then those lines are added. If the List is empty then + nothing is changed and zero is returned. For the use of {buf}, see |bufname()| above. @@ -8060,7 +8065,8 @@ setline({lnum}, {text}) *setline()* When {lnum} is just below the last line the {text} will be added below the last line. {text} can be any type or a List of any type, each item is - converted to a String. + converted to a String. When {text} is an empty List then + nothing is changed and FALSE is returned. If this succeeds, FALSE is returned. If this fails (most likely because {lnum} is invalid) TRUE is returned. diff --git a/src/evalbuffer.c b/src/evalbuffer.c --- a/src/evalbuffer.c +++ b/src/evalbuffer.c @@ -175,9 +175,7 @@ set_buffer_lines( l = lines->vval.v_list; if (l == NULL || list_len(l) == 0) { - // set proper return code - if (lnum > curbuf->b_ml.ml_line_count) - rettv->vval.v_number = 1; // FAIL + // not appending anything always succeeds goto done; } CHECK_LIST_MATERIALIZE(l); diff --git a/src/testdir/test_bufline.vim b/src/testdir/test_bufline.vim --- a/src/testdir/test_bufline.vim +++ b/src/testdir/test_bufline.vim @@ -23,8 +23,8 @@ func Test_setbufline_getbufline() call assert_equal(1, setbufline(b, 5, 'x')) call assert_equal(1, setbufline(b, 5, ['x'])) - call assert_equal(1, setbufline(b, 5, [])) - call assert_equal(1, setbufline(b, 5, test_null_list())) + call assert_equal(0, setbufline(b, 5, [])) + call assert_equal(0, setbufline(b, 5, test_null_list())) call assert_equal(1, 'x'->setbufline(bufnr('$') + 1, 1)) call assert_equal(1, ['x']->setbufline(bufnr('$') + 1, 1)) @@ -86,6 +86,11 @@ func Test_setline_startup() sleep 50m call assert_equal(['Hello'], readfile('Xtest')) + call assert_equal(0, setline(1, [])) + call assert_equal(0, setline(1, test_null_list())) + call assert_equal(0, setline(5, [])) + call assert_equal(0, setline(6, test_null_list())) + call delete('Xtest') endfunc @@ -112,8 +117,8 @@ func Test_appendbufline() call assert_equal(1, appendbufline(b, 4, 'x')) call assert_equal(1, appendbufline(b, 4, ['x'])) - call assert_equal(1, appendbufline(b, 4, [])) - call assert_equal(1, appendbufline(b, 4, test_null_list())) + call assert_equal(0, appendbufline(b, 4, [])) + call assert_equal(0, appendbufline(b, 4, test_null_list())) call assert_equal(1, appendbufline(1234, 1, 'x')) call assert_equal(1, appendbufline(1234, 1, ['x'])) @@ -122,8 +127,8 @@ func Test_appendbufline() call assert_equal(0, appendbufline(b, 1, [])) call assert_equal(0, appendbufline(b, 1, test_null_list())) - call assert_equal(1, appendbufline(b, 3, [])) - call assert_equal(1, appendbufline(b, 3, test_null_list())) + call assert_equal(0, appendbufline(b, 3, [])) + call assert_equal(0, appendbufline(b, 3, test_null_list())) call assert_equal(['a', 'b', 'c'], getbufline(b, 1, '$')) diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -939,9 +939,13 @@ endfunc func Test_append() enew! split - call append(0, ["foo"]) - call append(1, []) - call append(1, test_null_list()) + call assert_equal(0, append(1, [])) + call assert_equal(0, append(1, test_null_list())) + call assert_equal(0, append(0, ["foo"])) + call assert_equal(0, append(1, [])) + call assert_equal(0, append(1, test_null_list())) + call assert_equal(0, append(8, [])) + call assert_equal(0, append(9, test_null_list())) call assert_equal(['foo', ''], getline(1, '$')) split only diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -3721,8 +3721,8 @@ def Test_set_get_bufline() assert_equal(1, setbufline(b, 5, 'x')) assert_equal(1, setbufline(b, 5, ['x'])) - assert_equal(1, setbufline(b, 5, [])) - assert_equal(1, setbufline(b, 5, test_null_list())) + assert_equal(0, setbufline(b, 5, [])) + assert_equal(0, setbufline(b, 5, test_null_list())) assert_equal(1, 'x'->setbufline(bufnr('$') + 1, 1)) assert_equal(1, ['x']->setbufline(bufnr('$') + 1, 1)) diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 837, +/**/ 836, /**/ 835,