changeset 11876:3704ca24c9a2 v8.0.0818

patch 8.0.0818: cannot get the cursor position of a terminal commit https://github.com/vim/vim/commit/97870002d30a9846374d1ff7d73fbef351046f20 Author: Bram Moolenaar <Bram@vim.org> 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().
author Christian Brabandt <cb@256bit.org>
date Sun, 30 Jul 2017 18:30:05 +0200
parents 6b4752527e9e
children 756b19fccb6a
files runtime/doc/eval.txt src/evalfunc.c src/proto/terminal.pro src/terminal.c src/version.c
diffstat 5 files changed, 50 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- 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()|.
--- 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},
--- 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);
--- 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
 }
 
 /*
- * 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);
 }
 
 /*
--- 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,