diff src/terminal.c @ 15746:c017195b121b v8.1.0880

patch 8.1.0880: MS-Windows: inconsistent selection of winpty/conpty commit https://github.com/vim/vim/commit/c6ddce3f2cf6daa3a545405373b661f8a9bccad9 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Feb 8 12:47:03 2019 +0100 patch 8.1.0880: MS-Windows: inconsistent selection of winpty/conpty Problem: MS-Windows: inconsistent selection of winpty/conpty. Solution: Name option 'termwintype', use ++type argument and "term_pty" for term_start(). (Hirohito Higashi, closes #3915)
author Bram Moolenaar <Bram@vim.org>
date Fri, 08 Feb 2019 13:00:08 +0100
parents a3e2e7948ee4
children ec39beb7e61f
line wrap: on
line diff
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -742,16 +742,26 @@ ex_terminal(exarg_T *eap)
 	    vim_free(buf);
 	    *p = ' ';
 	}
-	else if ((int)(p - cmd) == 6 && STRNICMP(cmd, "winpty", 6) == 0)
+#ifdef WIN3264
+	else if ((int)(p - cmd) == 4 && STRNICMP(cmd, "type", 4) == 0
+								 && ep != NULL)
 	{
-	    opt.jo_set2 |= JO2_TERM_MODE;
-	    opt.jo_term_mode = 'w';
+	    int tty_type = NUL;
+
+	    p = skiptowhite(cmd);
+	    if (STRNICMP(ep + 1, "winpty", p - (ep + 1)) == 0)
+		tty_type = 'w';
+	    else if (STRNICMP(ep + 1, "conpty", p - (ep + 1)) == 0)
+		tty_type = 'c';
+	    else
+	    {
+		semsg(e_invargval, "type");
+		goto theend;
+	    }
+	    opt.jo_set2 |= JO2_TTY_TYPE;
+	    opt.jo_tty_type = tty_type;
 	}
-	else if ((int)(p - cmd) == 6 && STRNICMP(cmd, "conpty", 6) == 0)
-	{
-	    opt.jo_set2 |= JO2_TERM_MODE;
-	    opt.jo_term_mode = 'c';
-	}
+#endif
 	else
 	{
 	    if (*p)
@@ -809,9 +819,8 @@ term_write_session(FILE *fd, win_T *wp)
 		term->tl_cols, term->tl_rows) < 0)
 	return FAIL;
 #ifdef WIN3264
-    if (*wp->w_p_tmod != NUL)
-	if (fprintf(fd, "++%s ", wp->w_p_tmod) < 0)
-	    return FAIL;
+    if (fprintf(fd, "++type=%s ", term->tl_job->jv_tty_type) < 0)
+	return FAIL;
 #endif
     if (term->tl_command != NULL && fputs((char *)term->tl_command, fd) < 0)
 	return FAIL;
@@ -5369,7 +5378,7 @@ f_term_start(typval_T *argvars, typval_T
 		    + JO2_TERM_COLS + JO2_TERM_ROWS + JO2_VERTICAL + JO2_CURWIN
 		    + JO2_CWD + JO2_ENV + JO2_EOF_CHARS
 		    + JO2_NORESTORE + JO2_TERM_KILL
-		    + JO2_ANSI_COLORS + JO2_TERM_MODE) == FAIL)
+		    + JO2_ANSI_COLORS + JO2_TTY_TYPE) == FAIL)
 	return;
 
     buf = term_start(&argvars[0], NULL, &opt, 0);
@@ -5713,6 +5722,7 @@ conpty_term_and_job_init(
     job->jv_proc_info = proc_info;
     job->jv_job_object = jo;
     job->jv_status = JOB_STARTED;
+    job->jv_tty_type = vim_strsave("conpty");
     ++job->jv_refcount;
     term->tl_job = job;
 
@@ -6046,6 +6056,7 @@ winpty_term_and_job_init(
 	    (short_u *)winpty_conin_name(term->tl_winpty), NULL);
     job->jv_tty_out = utf16_to_enc(
 	    (short_u *)winpty_conout_name(term->tl_winpty), NULL);
+    job->jv_tty_type = vim_strsave("winpty");
     ++job->jv_refcount;
     term->tl_job = job;
 
@@ -6113,6 +6124,7 @@ term_and_job_init(
 {
     int		    use_winpty = FALSE;
     int		    use_conpty = FALSE;
+    int		    tty_type = *p_twt;
 
     has_winpty = dyn_winpty_init(FALSE) != FAIL ? TRUE : FALSE;
     has_conpty = dyn_conpty_init(FALSE) != FAIL ? TRUE : FALSE;
@@ -6122,14 +6134,10 @@ term_and_job_init(
 	// conpty is not available it can't be installed either.
 	return dyn_winpty_init(TRUE);
 
-    if (opt->jo_term_mode == 'w')
-	set_string_option_direct((char_u *)"tmod", -1, (char_u *)"winpty",
-							OPT_FREE|OPT_LOCAL, 0);
-    if (opt->jo_term_mode == 'c')
-	set_string_option_direct((char_u *)"tmod", -1, (char_u *)"conpty",
-							OPT_FREE|OPT_LOCAL, 0);
-
-    if (curwin->w_p_tmod == NULL || *curwin->w_p_tmod == NUL)
+    if (opt->jo_tty_type != NUL)
+	tty_type = opt->jo_tty_type;
+
+    if (tty_type == NUL)
     {
 	if (has_conpty)
 	    use_conpty = TRUE;
@@ -6137,12 +6145,12 @@ term_and_job_init(
 	    use_winpty = TRUE;
 	// else: error
     }
-    else if (STRICMP(curwin->w_p_tmod, "winpty") == 0)
+    else if (tty_type == 'w')	// winpty
     {
 	if (has_winpty)
 	    use_winpty = TRUE;
     }
-    else if (STRICMP(curwin->w_p_tmod, "conpty") == 0)
+    else if (tty_type == 'c')	// conpty
     {
 	if (has_conpty)
 	    use_conpty = TRUE;
@@ -6151,18 +6159,10 @@ term_and_job_init(
     }
 
     if (use_conpty)
-    {
-	set_string_option_direct((char_u *)"tmod", -1, (char_u *)"conpty",
-							OPT_FREE|OPT_LOCAL, 0);
 	return conpty_term_and_job_init(term, argvar, argv, opt, orig_opt);
-    }
 
     if (use_winpty)
-    {
-	set_string_option_direct((char_u *)"tmod", -1, (char_u *)"winpty",
-							OPT_FREE|OPT_LOCAL, 0);
 	return winpty_term_and_job_init(term, argvar, argv, opt, orig_opt);
-    }
 
     // error
     return dyn_winpty_init(TRUE);