0
0
mirror of https://github.com/vim/vim.git synced 2025-07-04 23:07:33 -04:00

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.
This commit is contained in:
Bram Moolenaar 2020-09-04 18:34:09 +02:00
parent 077cc7aa0e
commit b936b79424
4 changed files with 72 additions and 22 deletions

View File

@ -280,8 +280,11 @@ parse_termwinsize(win_T *wp, int *rows, int *cols)
* Determine the terminal size from 'termwinsize' and the current window. * Determine the terminal size from 'termwinsize' and the current window.
*/ */
static void 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 #ifdef FEAT_GUI
if (term->tl_system) if (term->tl_system)
{ {
@ -292,21 +295,39 @@ set_term_and_win_size(term_T *term)
return; return;
} }
#endif #endif
if (parse_termwinsize(curwin, &term->tl_rows, &term->tl_cols)) term->tl_rows = curwin->w_height;
term->tl_cols = curwin->w_width;
minsize = parse_termwinsize(curwin, &rows, &cols);
if (minsize)
{ {
if (term->tl_rows != 0) if (term->tl_rows < rows)
term->tl_rows = MAX(term->tl_rows, curwin->w_height); term->tl_rows = rows;
if (term->tl_cols != 0) if (term->tl_cols < cols)
term->tl_cols = MAX(term->tl_cols, curwin->w_width); term->tl_cols = cols;
} }
if (term->tl_rows == 0) if ((opt->jo_set2 & JO2_TERM_ROWS))
term->tl_rows = curwin->w_height; term->tl_rows = opt->jo_term_rows;
else 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); win_setheight_win(term->tl_rows, curwin);
if (term->tl_cols == 0) if (term->tl_cols != curwin->w_width)
term->tl_cols = curwin->w_width;
else
win_setwidth_win(term->tl_cols, curwin); 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. // the job finished.
curbuf->b_p_ma = FALSE; curbuf->b_p_ma = FALSE;
set_term_and_win_size(term); set_term_and_win_size(term, opt);
#ifdef MSWIN #ifdef MSWIN
mch_memmove(orig_opt.jo_io, opt->jo_io, sizeof(orig_opt.jo_io)); mch_memmove(orig_opt.jo_io, opt->jo_io, sizeof(orig_opt.jo_io));
#endif #endif

View File

@ -73,7 +73,8 @@ func RunVimInTerminal(arguments, options)
set t_Co=256 background=light set t_Co=256 background=light
hi Normal ctermfg=NONE ctermbg=NONE 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 rows = get(a:options, 'rows', 20)
let cols = get(a:options, 'cols', 75) let cols = get(a:options, 'cols', 75)
let statusoff = get(a:options, 'statusoff', 1) let statusoff = get(a:options, 'statusoff', 1)
@ -86,11 +87,12 @@ func RunVimInTerminal(arguments, options)
let cmd = GetVimCommandCleanTerm() .. reset_u7 .. a:arguments let cmd = GetVimCommandCleanTerm() .. reset_u7 .. a:arguments
let options = { let options = #{curwin: 1}
\ 'curwin': 1, if &termwinsize == ''
\ 'term_rows': rows, let options.term_rows = rows
\ 'term_cols': cols, let options.term_cols = cols
\ } endif
" Accept other options whose name starts with 'term_'. " Accept other options whose name starts with 'term_'.
call extend(options, filter(copy(a:options), 'v:key =~# "^term_"')) call extend(options, filter(copy(a:options), 'v:key =~# "^term_"'))

View File

@ -109,6 +109,27 @@ func Test_terminal_termwinsize_minimum()
set termwinsize= set termwinsize=
endfunc 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() func Test_terminal_termwinkey()
" make three tabpages, terminal in the middle " make three tabpages, terminal in the middle
0tabnew 0tabnew
@ -397,13 +418,17 @@ func Test_terminal_does_not_truncate_last_newlines()
call delete('Xfile') call delete('Xfile')
endfunc endfunc
func Test_terminal_no_job() func GetDummyCmd()
if has('win32') if has('win32')
let cmd = 'cmd /c ""' return 'cmd /c ""'
else else
CheckExecutable false CheckExecutable false
let cmd = 'false' return 'false'
endif endif
endfunc
func Test_terminal_no_job()
let cmd = GetDummyCmd()
let term = term_start(cmd, {'term_finish': 'close'}) let term = term_start(cmd, {'term_finish': 'close'})
call WaitForAssert({-> assert_equal(v:null, term_getjob(term)) }) call WaitForAssert({-> assert_equal(v:null, term_getjob(term)) })
endfunc endfunc

View File

@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1589,
/**/ /**/
1588, 1588,
/**/ /**/