]> granicus.if.org Git - vim/commitdiff
patch 8.0.0821: cannot get the title and status of a terminal window v8.0.0821
authorBram Moolenaar <Bram@vim.org>
Sun, 30 Jul 2017 17:38:21 +0000 (19:38 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 30 Jul 2017 17:38:21 +0000 (19:38 +0200)
Problem:    Cannot get the title and status of a terminal window.
Solution:   Implement term_gettitle() and term_getstatus().

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

index adaa8176e74ca331b05492f990f2972dae16cd2b..f43e7164a4ffe408808e2e5d3d1a7f64840aa3d3 100644 (file)
@@ -2374,6 +2374,8 @@ 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
+term_getstatus({buf})          String  get the status of a terminal
+term_gettitle({buf})           String  get the title of a terminal
 term_list()                    List    get the list of terminal buffers
 term_scrape({buf}[, {row}])    List    get row of a terminal screen
 term_sendkeys({buf}, {keys})   none    send keystrokes to a terminal
@@ -7945,6 +7947,26 @@ term_getsize({buf})                                      *term_getsize()*
                buffer does not exist or is not a terminal window, an empty
                list is returned.
 
+term_getstatus({buf})                                  *term_getstatus()*
+               Get the status of terminal {buf}. This returns a comma
+               separated list of these items:
+                       running         job is running
+                       finished        job has finished
+                       terminal        in Terminal-Normal mode
+               One of "running" or "finished" is always present.
+
+               {buf} must be the buffer number of a terminal window. If the
+               buffer does not exist or is not a terminal window, an empty
+               string is returned.
+
+term_gettitle({buf})                                   *term_gettitle()*
+               Get the title of terminal {buf}. This is the title that the
+               job in the terminal has set.
+
+               {buf} must be the buffer number of a terminal window. If the
+               buffer does not exist or is not a terminal window, an empty
+               string is returned.
+
 term_list()                                            *term_list()*
                Return a list with the buffer numbers of all buffers for
                terminal windows.
index 2c11de1916a30be569a3c578333e4af5c67dd948..fc0e05dad61748c2ce3f02c6513126066b40b722 100644 (file)
@@ -836,6 +836,8 @@ static struct fst
     {"term_getjob",    1, 1, f_term_getjob},
     {"term_getline",   1, 2, f_term_getline},
     {"term_getsize",   1, 1, f_term_getsize},
+    {"term_getstatus", 1, 1, f_term_getstatus},
+    {"term_gettitle",  1, 1, f_term_gettitle},
     {"term_list",      0, 0, f_term_list},
     {"term_scrape",    1, 2, f_term_scrape},
     {"term_sendkeys",  2, 2, f_term_sendkeys},
index 63cda59cafab8b0b325a7cb7e8b5b94732e8d77d..24789293dfefa5bcb72a266c01d48aad38b8ab24 100644 (file)
@@ -20,6 +20,8 @@ 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);
+void f_term_getstatus(typval_T *argvars, typval_T *rettv);
+void f_term_gettitle(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);
index b289f6c994d2768fba40ba101cf11f833e2b1044..d04b99ec6986a0407704350bc10229be4e253959 100644 (file)
  * that buffer, attributes come from the scrollback buffer tl_scrollback.
  *
  * TODO:
- * - Problem with statusline (Zyx, Christian)
  * - Make CTRL-W "" paste register content to the job?
  * - in bash mouse clicks are inserting characters.
  * - mouse scroll: when over other window, scroll that window.
  * - For the scrollback buffer store lines in the buffer, only attributes in
  *   tl_scrollback.
- * - Add term_status(): "" if not a terminal, "running" if job running,
- *   "finished" if finished, "running,vim" when job is running and in
- *   Terminal mode, "running,vim,pending" when job output is pending.
  * - When the job ends:
  *   - Need an option or argument to drop the window+buffer right away, to be
  *     used for a shell or Vim. 'termfinish'; "close", "open" (open window when
@@ -560,7 +556,7 @@ term_convert_key(term_T *term, int c, char *buf)
 }
 
 /*
- * Return TRUE if the job for "buf" is still running.
+ * Return TRUE if the job for "term" is still running.
  */
     static int
 term_job_running(term_T *term)
@@ -1798,6 +1794,46 @@ f_term_getsize(typval_T *argvars, typval_T *rettv)
     list_append_number(l, buf->b_term->tl_cols);
 }
 
+/*
+ * "term_getstatus(buf)" function
+ */
+    void
+f_term_getstatus(typval_T *argvars, typval_T *rettv)
+{
+    buf_T      *buf = term_get_buf(argvars);
+    term_T     *term;
+    char_u     val[100];
+
+    rettv->v_type = VAR_STRING;
+    if (buf == NULL)
+       return;
+    term = buf->b_term;
+
+    if (term_job_running(term))
+       STRCPY(val, "running");
+    else
+       STRCPY(val, "finished");
+    if (term->tl_terminal_mode)
+       STRCAT(val, ",terminal");
+    rettv->vval.v_string = vim_strsave(val);
+}
+
+/*
+ * "term_gettitle(buf)" function
+ */
+    void
+f_term_gettitle(typval_T *argvars, typval_T *rettv)
+{
+    buf_T      *buf = term_get_buf(argvars);
+
+    rettv->v_type = VAR_STRING;
+    if (buf == NULL)
+       return;
+
+    if (buf->b_term->tl_title != NULL)
+       rettv->vval.v_string = vim_strsave(buf->b_term->tl_title);
+}
+
 /*
  * "term_list()" function
  */
index 8733db28edf2847062622a3d60898879a4456087..875119f4164621d1fe3298dbd358ee786be94c13 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    821,
 /**/
     820,
 /**/