# HG changeset patch # User Christian Brabandt # Date 1501432205 -7200 # Node ID 3704ca24c9a22ea71f892cfa4481d98a5a136b1e # Parent 6b4752527e9e2c2619d63f779f642b9a2e23caba patch 8.0.0818: cannot get the cursor position of a terminal commit https://github.com/vim/vim/commit/97870002d30a9846374d1ff7d73fbef351046f20 Author: Bram Moolenaar Date: Sun Jul 30 18:28:38 2017 +0200 patch 8.0.0818: cannot get the cursor position of a terminal Problem: Cannot get the cursor position of a terminal. Solution: Add term_getcursor(). diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -2370,6 +2370,7 @@ tan({expr}) Float tangent of {expr} tanh({expr}) Float hyperbolic tangent of {expr} tempname() String name for a temporary file term_getattr({attr}, {what} Number get the value of attribute {what} +term_getcursor({buf}) List get the cursor position of a terminal term_getjob({buf}) Job get the job associated with a terminal term_getline({buf}[, {row}]) String get a line of text from a terminal term_getsize({buf}) List get the size of a terminal @@ -7910,6 +7911,19 @@ term_getattr({attr}, {what}) *term_ge strike reverse +term_getcursor({buf}) *term_getcursor()* + Get the cusor position of terminal {buf}. Returns a list with + three numbers: [rows, cols, visible]. "rows" and "cols" are + zero based. "visible" is one when the cursor is visible, zero + when it is hidden. + + This is the cursor position of the terminal itself, not of the + Vim window. + + {buf} must be the buffer number of a terminal window. If the + buffer does not exist or is not a terminal window, an empty + list is returned. + term_getjob({buf}) *term_getjob()* Get the Job associated with terminal window {buf}. {buf} is used as with |term_getsize()|. diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -832,6 +832,7 @@ static struct fst {"tempname", 0, 0, f_tempname}, #ifdef FEAT_TERMINAL {"term_getattr", 2, 2, f_term_getattr}, + {"term_getcursor", 1, 1, f_term_getcursor}, {"term_getjob", 1, 1, f_term_getjob}, {"term_getline", 1, 2, f_term_getline}, {"term_getsize", 1, 1, f_term_getsize}, diff --git a/src/proto/terminal.pro b/src/proto/terminal.pro --- a/src/proto/terminal.pro +++ b/src/proto/terminal.pro @@ -16,6 +16,7 @@ int term_get_attr(buf_T *buf, linenr_T l char_u *term_get_status_text(term_T *term); int set_ref_in_term(int copyID); 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_getsize(typval_T *argvars, typval_T *rettv); diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -53,7 +53,6 @@ * :term <24x80> vim notes.txt * - To set BS correctly, check get_stty(); Pass the fd of the pty. * - do not store terminal window in viminfo. Or prefix term:// ? - * - add term_getcursor() - return cursor position: [row, col, visible] * - add a character in :ls output * - add 't' to mode() * - when closing window and job has not ended, make terminal hidden? @@ -1637,6 +1636,24 @@ set_ref_in_term(int copyID) } /* + * Get the buffer from the first argument in "argvars". + * Returns NULL when the buffer is not for a terminal window. + */ + static buf_T * +term_get_buf(typval_T *argvars) +{ + buf_T *buf; + + (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ + ++emsg_off; + buf = get_buf_tv(&argvars[0], FALSE); + --emsg_off; + if (buf == NULL || buf->b_term == NULL) + return NULL; + return buf; +} + +/* * "term_getattr(attr, name)" function */ void @@ -1671,21 +1688,23 @@ f_term_getattr(typval_T *argvars, typval } /* - * Get the buffer from the first argument in "argvars". - * Returns NULL when the buffer is not for a terminal window. + * "term_getcursor(buf)" function */ - static buf_T * -term_get_buf(typval_T *argvars) + void +f_term_getcursor(typval_T *argvars, typval_T *rettv) { - buf_T *buf; + buf_T *buf = term_get_buf(argvars); + list_T *l; - (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ - ++emsg_off; - buf = get_buf_tv(&argvars[0], FALSE); - --emsg_off; - if (buf == NULL || buf->b_term == NULL) - return NULL; - return buf; + if (rettv_list_alloc(rettv) == FAIL) + return; + if (buf == NULL) + return; + + l = rettv->vval.v_list; + list_append_number(l, buf->b_term->tl_cursor_pos.row); + list_append_number(l, buf->b_term->tl_cursor_pos.col); + list_append_number(l, buf->b_term->tl_cursor_visible); } /* diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -770,6 +770,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 818, +/**/ 817, /**/ 816,