From: Bram Moolenaar Date: Fri, 4 Sep 2020 16:34:09 +0000 (+0200) Subject: patch 8.2.1589: term_start() options for size are overruled by 'termwinsize' X-Git-Tag: v8.2.1589 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b936b79424d435b83cdebed5507a9d3800e66e6c;p=vim patch 8.2.1589: term_start() options for size are overruled by 'termwinsize' Problem: Term_start() options for size are overruled by 'termwinsize'. (Sergey Vlasov) Solution: Set 'termwinsize' to the specified size. --- diff --git a/src/terminal.c b/src/terminal.c index bd5fd41ee..7856ad586 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -280,8 +280,11 @@ parse_termwinsize(win_T *wp, int *rows, int *cols) * Determine the terminal size from 'termwinsize' and the current window. */ static void -set_term_and_win_size(term_T *term) +set_term_and_win_size(term_T *term, jobopt_T *opt) { + int rows, cols; + int minsize; + #ifdef FEAT_GUI if (term->tl_system) { @@ -292,21 +295,39 @@ set_term_and_win_size(term_T *term) return; } #endif - if (parse_termwinsize(curwin, &term->tl_rows, &term->tl_cols)) - { - if (term->tl_rows != 0) - term->tl_rows = MAX(term->tl_rows, curwin->w_height); - if (term->tl_cols != 0) - term->tl_cols = MAX(term->tl_cols, curwin->w_width); - } - if (term->tl_rows == 0) - term->tl_rows = curwin->w_height; - else + term->tl_rows = curwin->w_height; + term->tl_cols = curwin->w_width; + + minsize = parse_termwinsize(curwin, &rows, &cols); + if (minsize) + { + if (term->tl_rows < rows) + term->tl_rows = rows; + if (term->tl_cols < cols) + term->tl_cols = cols; + } + if ((opt->jo_set2 & JO2_TERM_ROWS)) + term->tl_rows = opt->jo_term_rows; + else if (rows != 0) + term->tl_rows = rows; + if ((opt->jo_set2 & JO2_TERM_COLS)) + term->tl_cols = opt->jo_term_cols; + else if (cols != 0) + term->tl_cols = cols; + + if (term->tl_rows != curwin->w_height) win_setheight_win(term->tl_rows, curwin); - if (term->tl_cols == 0) - term->tl_cols = curwin->w_width; - else + if (term->tl_cols != curwin->w_width) win_setwidth_win(term->tl_cols, curwin); + + // Set 'winsize' now to avoid a resize at the next redraw. + if (!minsize && *curwin->w_p_tws != NUL) + { + char_u buf[100]; + + vim_snprintf((char *)buf, 100, "%dx%d", term->tl_rows, term->tl_cols); + set_option_value((char_u *)"termwinsize", 0L, buf, OPT_LOCAL); + } } /* @@ -603,7 +624,7 @@ term_start( // the job finished. curbuf->b_p_ma = FALSE; - set_term_and_win_size(term); + set_term_and_win_size(term, opt); #ifdef MSWIN mch_memmove(orig_opt.jo_io, opt->jo_io, sizeof(orig_opt.jo_io)); #endif diff --git a/src/testdir/term_util.vim b/src/testdir/term_util.vim index 17f9752a9..4a5e64989 100644 --- a/src/testdir/term_util.vim +++ b/src/testdir/term_util.vim @@ -73,7 +73,8 @@ func RunVimInTerminal(arguments, options) set t_Co=256 background=light hi Normal ctermfg=NONE ctermbg=NONE - " Make the window 20 lines high and 75 columns, unless told otherwise. + " Make the window 20 lines high and 75 columns, unless told otherwise or + " 'termwinsize' is set. let rows = get(a:options, 'rows', 20) let cols = get(a:options, 'cols', 75) let statusoff = get(a:options, 'statusoff', 1) @@ -86,11 +87,12 @@ func RunVimInTerminal(arguments, options) let cmd = GetVimCommandCleanTerm() .. reset_u7 .. a:arguments - let options = { - \ 'curwin': 1, - \ 'term_rows': rows, - \ 'term_cols': cols, - \ } + let options = #{curwin: 1} + if &termwinsize == '' + let options.term_rows = rows + let options.term_cols = cols + endif + " Accept other options whose name starts with 'term_'. call extend(options, filter(copy(a:options), 'v:key =~# "^term_"')) diff --git a/src/testdir/test_terminal2.vim b/src/testdir/test_terminal2.vim index 93ace42d8..f9f221b5c 100644 --- a/src/testdir/test_terminal2.vim +++ b/src/testdir/test_terminal2.vim @@ -109,6 +109,27 @@ func Test_terminal_termwinsize_minimum() set termwinsize= endfunc +func Test_terminal_termwinsize_overruled() + let cmd = GetDummyCmd() + set termwinsize=5x43 + let buf = term_start(cmd, #{term_rows: 7, term_cols: 50}) + call TermWait(buf) + call assert_equal([7, 50], term_getsize(buf)) + exe "bwipe! " .. buf + + let buf = term_start(cmd, #{term_cols: 50}) + call TermWait(buf) + call assert_equal([5, 50], term_getsize(buf)) + exe "bwipe! " .. buf + + let buf = term_start(cmd, #{term_rows: 7}) + call TermWait(buf) + call assert_equal([7, 43], term_getsize(buf)) + exe "bwipe! " .. buf + + set termwinsize= +endfunc + func Test_terminal_termwinkey() " make three tabpages, terminal in the middle 0tabnew @@ -397,13 +418,17 @@ func Test_terminal_does_not_truncate_last_newlines() call delete('Xfile') endfunc -func Test_terminal_no_job() +func GetDummyCmd() if has('win32') - let cmd = 'cmd /c ""' + return 'cmd /c ""' else CheckExecutable false - let cmd = 'false' + return 'false' endif +endfunc + +func Test_terminal_no_job() + let cmd = GetDummyCmd() let term = term_start(cmd, {'term_finish': 'close'}) call WaitForAssert({-> assert_equal(v:null, term_getjob(term)) }) endfunc diff --git a/src/version.c b/src/version.c index 2c6e47efc..26a30c152 100644 --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1589, /**/ 1588, /**/