From 264631c4c1bace2b6a67293d9635504db1378464 Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Sun, 21 Jun 2026 20:27:50 -0400 Subject: [PATCH] vim-patch:8.2.1888: Vim9: getbufline(-1, 1, '$') gives an error Problem: Vim9: Getbufline(-1, 1, '$') gives an error. Solution: Return an empty list. (closes vim/vim#7180) https://github.com/vim/vim/commit/e6e70a10f118ecfa9df2425e8724bc009bd09929 Co-authored-by: Bram Moolenaar --- src/nvim/eval/buffer.c | 16 ++++++++++------ test/functional/vimscript/buf_functions_spec.lua | 4 ++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/nvim/eval/buffer.c b/src/nvim/eval/buffer.c index 4ee6b39698..df9b37af58 100644 --- a/src/nvim/eval/buffer.c +++ b/src/nvim/eval/buffer.c @@ -714,15 +714,19 @@ static void get_buffer_lines(buf_T *buf, linenr_T start, linenr_T end, bool retl /// false: "getbufoneline()" function static void getbufline(typval_T *argvars, typval_T *rettv, bool retlist) { + linenr_T lnum = 1; + linenr_T end = 1; const int did_emsg_before = did_emsg; buf_T *const buf = tv_get_buf_from_arg(&argvars[0]); - const linenr_T lnum = tv_get_lnum_buf(&argvars[1], buf); - if (did_emsg > did_emsg_before) { - return; + if (buf != NULL) { + lnum = tv_get_lnum_buf(&argvars[1], buf); + if (did_emsg > did_emsg_before) { + return; + } + end = (argvars[2].v_type == VAR_UNKNOWN + ? lnum + : tv_get_lnum_buf(&argvars[2], buf)); } - const linenr_T end = (argvars[2].v_type == VAR_UNKNOWN - ? lnum - : tv_get_lnum_buf(&argvars[2], buf)); get_buffer_lines(buf, lnum, end, retlist, rettv); } diff --git a/test/functional/vimscript/buf_functions_spec.lua b/test/functional/vimscript/buf_functions_spec.lua index a4389ca97a..d2907cd22b 100644 --- a/test/functional/vimscript/buf_functions_spec.lua +++ b/test/functional/vimscript/buf_functions_spec.lua @@ -191,11 +191,15 @@ describe('getbufline() function', function() end) it('returns empty list when range is invalid', function() eq({}, fn.getbufline(1, 0)) + eq({}, fn.getbufline(-1, 1, '$')) + eq({}, fn.getbufline(-1, '$', '$')) api.nvim_buf_set_lines(0, 0, 1, false, { 'foo', 'bar', 'baz' }) eq({}, fn.getbufline(1, 2, 1)) eq({}, fn.getbufline(1, -10, -20)) eq({}, fn.getbufline(1, -2, -1)) eq({}, fn.getbufline(1, -1, 9999)) + eq({}, fn.getbufline(-1, 1, '$')) + eq({}, fn.getbufline(-1, '$', '$')) end) it('returns expected lines', function() api.nvim_set_option_value('hidden', true, {})