]> granicus.if.org Git - vim/commitdiff
patch 8.0.0818: cannot get the cursor position of a terminal v8.0.0818
authorBram Moolenaar <Bram@vim.org>
Sun, 30 Jul 2017 16:28:38 +0000 (18:28 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 30 Jul 2017 16:28:38 +0000 (18:28 +0200)
Problem:    Cannot get the cursor position of a terminal.
Solution:   Add term_getcursor().

runtime/doc/eval.txt
src/evalfunc.c
src/proto/terminal.pro
src/terminal.c
src/version.c

index dee7b64fa1e369f363c3df018367987ac83b9177..adaa8176e74ca331b05492f990f2972dae16cd2b 100644 (file)
@@ -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()|.
index f1de7e5c35a04b439305802bf066519b173feded..2c11de1916a30be569a3c578333e4af5c67dd948 100644 (file)
@@ -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},
index 6f5b3ab7074fa17275af1b283ab32f6c7d39dfe3..63cda59cafab8b0b325a7cb7e8b5b94732e8d77d 100644 (file)
@@ -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);
index 8febb8d2777b03e90f280dbb55dd715a273d250b..45c6175708b31012a36803e8eff8f0066e25c4b7 100644 (file)
@@ -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?
@@ -1636,6 +1635,24 @@ set_ref_in_term(int copyID)
     return abort;
 }
 
+/*
+ * 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
  */
@@ -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);
 }
 
 /*
index 21cd3e29aae632c19261314ad3f4feb5bc1a829f..5b831d41877552215c48cd3f621460d19009d953 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    818,
 /**/
     817,
 /**/