summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-07-30 18:28:38 +0200
committerBram Moolenaar <Bram@vim.org>2017-07-30 18:28:38 +0200
commit97870002d30a9846374d1ff7d73fbef351046f20 (patch)
tree656a30d4acf1c25d9709440c50c02659a099b15e
parent22aad2f8806acf390568b8e524e53260a322aaa5 (diff)
patch 8.0.0818: cannot get the cursor position of a terminalv8.0.0818
Problem: Cannot get the cursor position of a terminal. Solution: Add term_getcursor().
-rw-r--r--runtime/doc/eval.txt14
-rw-r--r--src/evalfunc.c1
-rw-r--r--src/proto/terminal.pro1
-rw-r--r--src/terminal.c45
-rw-r--r--src/version.c2
5 files changed, 50 insertions, 13 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index dee7b64fa1..adaa8176e7 100644
--- 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_getattr()*
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
index f1de7e5c35..2c11de1916 100644
--- 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
index 6f5b3ab707..63cda59caf 100644
--- a/src/proto/terminal.pro
+++ b/src/proto/terminal.pro
@@ -16,6 +16,7 @@ int term_get_attr(buf_T *buf, linenr_T lnum, int col);
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
index 8febb8d277..45c6175708 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -53,7 +53,6 @@
* :term <24x80> <close> 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_T *rettv)
}
/*
- * 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
index 21cd3e29aa..5b831d4187 100644
--- 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,