diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index 3fc744d94b..1b30522386 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -3595,8 +3595,8 @@ void f_jobstart(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) } } - uint16_t width = 0; - uint16_t height = 0; + uint16_t width = (uint16_t)tv_dict_get_number(job_opts, "width"); + uint16_t height = (uint16_t)tv_dict_get_number(job_opts, "height"); char *term_name = NULL; if (term) { @@ -3616,13 +3616,11 @@ void f_jobstart(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) overlapped = false; detach = false; stdin_mode = kChannelStdinPipe; - width = (uint16_t)MAX(0, curwin->w_view_width - win_col_off(curwin)); - height = (uint16_t)curwin->w_view_height; + width = width ? width : (uint16_t)MAX(0, curwin->w_view_width - win_col_off(curwin)); + height = height ? height : (uint16_t)curwin->w_view_height; } if (pty) { - width = width ? width : (uint16_t)tv_dict_get_number(job_opts, "width"); - height = height ? height : (uint16_t)tv_dict_get_number(job_opts, "height"); // Deprecated TERM field is from before `env` option existed. term_name = term_name ? term_name : tv_dict_get_string(job_opts, "TERM", false); term_name = term_name ? term_name : "ansi"; diff --git a/test/functional/core/job_spec.lua b/test/functional/core/job_spec.lua index 8caff81be4..81936f79bd 100644 --- a/test/functional/core/job_spec.lua +++ b/test/functional/core/job_spec.lua @@ -97,6 +97,28 @@ describe('jobs', function() command("call jobstart(['cat', '-'], { 'term': v:false })") end) + it('jobstart(term=true) accepts width/height (#33904)', function() + local buf = api.nvim_create_buf(false, true) + exec_lua(function() + vim.api.nvim_buf_call(buf, function() + vim.fn.jobstart({ + vim.v.progpath, + '--clean', + '--headless', + '+lua print(vim.uv.new_tty(1, false):get_winsize())', + }, { + term = true, + width = 11, + height = 12, + env = { VIMRUNTIME = os.getenv('VIMRUNTIME') }, + }) + end) + end) + retry(nil, nil, function() + eq({ '11 12' }, api.nvim_buf_get_lines(buf, 0, 1, false)) + end) + end) + it('must specify env option as a dict', function() command('let g:job_opts.env = v:true') local _, err = pcall(function()