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, {})