# HG changeset patch # User Christian Brabandt # Date 1523718905 -7200 # Node ID 39fcaaa973dbd18bc74aebb1c69b31219e757fe9 # Parent 4efb4683ea71519985a5d09c3ce0b0bef66dd448 patch 8.0.1711: term_setsize() is not implemented yet commit https://github.com/vim/vim/commit/a42d363bac8a581afe769c370db70cf833767c41 Author: Bram Moolenaar Date: Sat Apr 14 17:05:38 2018 +0200 patch 8.0.1711: term_setsize() is not implemented yet Problem: Term_setsize() is not implemented yet. Solution: Implement it. diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -8402,6 +8402,24 @@ term_setansicolors({buf}, {colors}) *t color codes, like those accepted by |highlight-guifg|. Also see |term_getansicolors()| and |g:terminal_ansi_colors|. + The colors normally are: + 0 black + 1 dark red + 2 dark green + 3 brown + 4 dark blue + 5 dark magenta + 6 dark cyan + 7 light grey + 8 dark grey + 9 red + 10 green + 11 yellow + 12 blue + 13 magenta + 14 cyan + 15 white + These colors are used in the GUI and in the terminal when 'termguicolors' is set. When not using GUI colors (GUI mode or |termguicolors|), the terminal window always uses the 16 @@ -8431,8 +8449,15 @@ term_setrestore({buf}, {command}) *ter Use "NONE" to not restore this window. {only available when compiled with the |+terminal| feature} -term_setsize({buf}, {expr}) *term_setsize()* - Not implemented yet. +term_setsize({buf}, {rows}, {cols}) *term_setsize()* + Set the size of terminal {buf}. The size of the window + containing the terminal will also be adjusted, if possible. + If {rows} or {cols} is zero or negative, that dimension is not + changed. + + {buf} must be the buffer number of a terminal window. Use an + empty string for the current buffer. If the buffer does not + exist or is not a terminal window, an error is given. {only available when compiled with the |+terminal| feature} term_start({cmd}, {options}) *term_start()* diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -876,6 +876,7 @@ static struct fst # endif {"term_setkill", 2, 2, f_term_setkill}, {"term_setrestore", 2, 2, f_term_setrestore}, + {"term_setsize", 3, 3, f_term_setsize}, {"term_start", 1, 2, f_term_start}, {"term_wait", 1, 2, f_term_wait}, #endif diff --git a/src/proto/terminal.pro b/src/proto/terminal.pro --- a/src/proto/terminal.pro +++ b/src/proto/terminal.pro @@ -32,19 +32,20 @@ int term_swap_diff(void); void f_term_dumpdiff(typval_T *argvars, typval_T *rettv); void f_term_dumpload(typval_T *argvars, typval_T *rettv); void f_term_getaltscreen(typval_T *argvars, typval_T *rettv); -void f_term_getansicolors(typval_T *argvars, typval_T *rettv); void f_term_getattr(typval_T *argvars, typval_T *rettv); void f_term_getcursor(typval_T *argvars, typval_T *rettv); void f_term_getjob(typval_T *argvars, typval_T *rettv); void f_term_getline(typval_T *argvars, typval_T *rettv); void f_term_getscrolled(typval_T *argvars, typval_T *rettv); void f_term_getsize(typval_T *argvars, typval_T *rettv); +void f_term_setsize(typval_T *argvars, typval_T *rettv); void f_term_getstatus(typval_T *argvars, typval_T *rettv); void f_term_gettitle(typval_T *argvars, typval_T *rettv); void f_term_gettty(typval_T *argvars, typval_T *rettv); void f_term_list(typval_T *argvars, typval_T *rettv); void f_term_scrape(typval_T *argvars, typval_T *rettv); void f_term_sendkeys(typval_T *argvars, typval_T *rettv); +void f_term_getansicolors(typval_T *argvars, typval_T *rettv); void f_term_setansicolors(typval_T *argvars, typval_T *rettv); void f_term_setrestore(typval_T *argvars, typval_T *rettv); void f_term_setkill(typval_T *argvars, typval_T *rettv); diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -40,7 +40,6 @@ * TODO: * - Win32: Make terminal used for :!cmd in the GUI work better. Allow for * redirection. Probably in call to channel_set_pipes(). - * - implement term_setsize() * - add an optional limit for the scrollback size. When reaching it remove * 10% at the start. * - Copy text in the vterm to the Vim buffer once in a while, so that @@ -4603,6 +4602,31 @@ f_term_getsize(typval_T *argvars, typval } /* + * "term_setsize(buf, rows, cols)" function + */ + void +f_term_setsize(typval_T *argvars UNUSED, typval_T *rettv UNUSED) +{ + buf_T *buf = term_get_buf(argvars, "term_setsize()"); + term_T *term; + varnumber_T rows, cols; + + if (buf == NULL || buf->b_term->tl_vterm == NULL) + return; + term = buf->b_term; + rows = get_tv_number(&argvars[1]); + rows = rows <= 0 ? term->tl_rows : rows; + cols = get_tv_number(&argvars[2]); + cols = cols <= 0 ? term->tl_cols : cols; + vterm_set_size(term->tl_vterm, rows, cols); + /* handle_resize() will resize the windows */ + + /* Get and remember the size we ended up with. Update the pty. */ + vterm_get_size(term->tl_vterm, &term->tl_rows, &term->tl_cols); + term_report_winsize(term, term->tl_rows, term->tl_cols); +} + +/* * "term_getstatus(buf)" function */ void @@ -5432,7 +5456,7 @@ term_free_vterm(term_T *term) } /* - * Request size to terminal. + * Report the size to the terminal. */ static void term_report_winsize(term_T *term, int rows, int cols) @@ -5514,7 +5538,7 @@ term_free_vterm(term_T *term) } /* - * Request size to terminal. + * Report the size to the terminal. */ static void term_report_winsize(term_T *term, int rows, int cols) diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim --- a/src/testdir/test_terminal.vim +++ b/src/testdir/test_terminal.vim @@ -286,9 +286,18 @@ func Test_terminal_size() vsplit exe 'terminal ++rows=5 ++cols=33 ' . cmd - let size = term_getsize('') + call assert_equal([5, 33], term_getsize('')) + + call term_setsize('', 6, 0) + call assert_equal([6, 33], term_getsize('')) + + call term_setsize('', 0, 35) + call assert_equal([6, 35], term_getsize('')) + + call term_setsize('', 7, 30) + call assert_equal([7, 30], term_getsize('')) + bwipe! - call assert_equal([5, 33], size) call term_start(cmd, {'term_rows': 6, 'term_cols': 36}) let size = term_getsize('') diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1711, +/**/ 1710, /**/ 1709,