Patch 8.1.2251

24 views
Skip to first unread message

Bram Moolenaar

unread,
Nov 3, 2019, 5:37:50 PM11/3/19
to vim...@googlegroups.com

Patch 8.1.2251
Problem: ":term command" may not work without a shell.
Solution: Add the ++shell option to :term. (closes #3340)
Files: runtime/doc/terminal.txt, src/terminal.c,
src/os_unix.c, src/proto/os_unix.pro,
src/testdir/test_terminal.vim


*** ../vim-8.1.2250/runtime/doc/terminal.txt 2019-10-20 21:15:07.457905609 +0200
--- runtime/doc/terminal.txt 2019-11-03 23:36:29.993161387 +0100
***************
*** 210,215 ****
--- 210,219 ----
no window will be used.
++norestore Do not include this terminal window
in a session file.
+ ++shell Instead of executing {command}
+ directly, use a shell, like with
+ `:!command` *E279*
+ {only works on Unix currently}
++kill={how} When trying to close the terminal
window kill the job with {how}. See
|term_setkill()| for the values.
*** ../vim-8.1.2250/src/terminal.c 2019-11-03 21:19:38.080721214 +0100
--- src/terminal.c 2019-11-03 23:21:35.669530139 +0100
***************
*** 703,708 ****
--- 703,709 ----
{
typval_T argvar[2];
jobopt_T opt;
+ int opt_shell = FALSE;
char_u *cmd;
char_u *tofree = NULL;

***************
*** 738,743 ****
--- 739,746 ----
opt.jo_hidden = 1;
else if (OPTARG_HAS("norestore"))
opt.jo_term_norestore = 1;
+ else if (OPTARG_HAS("shell"))
+ opt_shell = TRUE;
else if (OPTARG_HAS("kill") && ep != NULL)
{
opt.jo_set2 |= JO2_TERM_KILL;
***************
*** 831,840 ****
opt.jo_in_bot = eap->line2;
}

! argvar[0].v_type = VAR_STRING;
! argvar[0].vval.v_string = cmd;
! argvar[1].v_type = VAR_UNKNOWN;
! term_start(argvar, NULL, &opt, eap->forceit ? TERM_START_FORCEIT : 0);
vim_free(tofree);

theend:
--- 834,863 ----
opt.jo_in_bot = eap->line2;
}

! if (opt_shell && tofree == NULL)
! {
! #ifdef UNIX
! char **argv = NULL;
! char_u *tofree1 = NULL;
! char_u *tofree2 = NULL;
!
! // :term ++shell command
! if (unix_build_argv(cmd, &argv, &tofree1, &tofree2) == OK)
! term_start(NULL, argv, &opt, eap->forceit ? TERM_START_FORCEIT : 0);
! vim_free(tofree1);
! vim_free(tofree2);
! #else
! emsg(_("E279: Sorry, ++shell is not supported on this system"));
! #endif
! }
! else
! {
! argvar[0].v_type = VAR_STRING;
! argvar[0].vval.v_string = cmd;
! argvar[1].v_type = VAR_UNKNOWN;
! term_start(argvar, NULL, &opt, eap->forceit ? TERM_START_FORCEIT : 0);
! }
!
vim_free(tofree);

theend:
***************
*** 6474,6480 ****
term_and_job_init(
term_T *term,
typval_T *argvar,
! char **argv UNUSED,
jobopt_T *opt,
jobopt_T *orig_opt)
{
--- 6497,6503 ----
term_and_job_init(
term_T *term,
typval_T *argvar,
! char **argv,
jobopt_T *opt,
jobopt_T *orig_opt)
{
*** ../vim-8.1.2250/src/os_unix.c 2019-11-02 22:54:37.405188813 +0100
--- src/os_unix.c 2019-11-03 23:20:57.381685076 +0100
***************
*** 4299,4308 ****
# endif
}

! #if !defined(USE_SYSTEM) || (defined(FEAT_GUI) && defined(FEAT_TERMINAL))

! static int
! build_argv(
char_u *cmd,
char ***argvp,
char_u **sh_tofree,
--- 4299,4308 ----
# endif
}

! #if !defined(USE_SYSTEM) || defined(FEAT_TERMINAL) || defined(PROTO)

! int
! unix_build_argv(
char_u *cmd,
char ***argvp,
char_u **sh_tofree,
***************
*** 4369,4375 ****
aco_save_T aco;
oparg_T oa; /* operator arguments */

! if (build_argv(cmd, &argv, &tofree1, &tofree2) == FAIL)
goto theend;

init_job_options(&opt);
--- 4369,4375 ----
aco_save_T aco;
oparg_T oa; /* operator arguments */

! if (unix_build_argv(cmd, &argv, &tofree1, &tofree2) == FAIL)
goto theend;

init_job_options(&opt);
***************
*** 4546,4552 ****
if (options & SHELL_COOKED)
settmode(TMODE_COOK); /* set to normal mode */

! if (build_argv(cmd, &argv, &tofree1, &tofree2) == FAIL)
goto error;

/*
--- 4546,4552 ----
if (options & SHELL_COOKED)
settmode(TMODE_COOK); /* set to normal mode */

! if (unix_build_argv(cmd, &argv, &tofree1, &tofree2) == FAIL)
goto error;

/*
*** ../vim-8.1.2250/src/proto/os_unix.pro 2019-09-10 21:27:15.175646978 +0200
--- src/proto/os_unix.pro 2019-11-03 23:21:02.201665551 +0100
***************
*** 59,64 ****
--- 59,65 ----
int mch_report_winsize(int fd, int rows, int cols);
void mch_set_shellsize(void);
void mch_new_shellsize(void);
+ int unix_build_argv(char_u *cmd, char ***argvp, char_u **sh_tofree, char_u **shcf_tofree);
int mch_call_shell(char_u *cmd, int options);
void mch_job_start(char **argv, job_T *job, jobopt_T *options, int is_terminal);
char *mch_job_status(job_T *job);
*** ../vim-8.1.2250/src/testdir/test_terminal.vim 2019-10-28 00:42:17.645477101 +0100
--- src/testdir/test_terminal.vim 2019-11-03 23:32:22.914755807 +0100
***************
*** 2214,2219 ****
--- 2214,2231 ----
call delete('Xtext')
endfunc

+ func Test_terminal_shell_option()
+ CheckUnix
+ " exec is a shell builtin command, should fail without a shell.
+ term exec ls runtest.vim
+ call WaitForAssert({-> assert_match('job failed', term_getline(bufnr(), 1))})
+ bwipe!
+
+ term ++shell exec ls runtest.vim
+ call WaitForAssert({-> assert_match('runtest.vim', term_getline(bufnr(), 1))})
+ bwipe!
+ endfunc
+
func Test_terminal_setapi_and_call()
if !CanRunVimInTerminal()
return
*** ../vim-8.1.2250/src/version.c 2019-11-03 22:29:19.469793561 +0100
--- src/version.c 2019-11-03 23:35:18.229599630 +0100
***************
*** 743,744 ****
--- 743,746 ----
{ /* Add new patch number below this line */
+ /**/
+ 2251,
/**/

--
How To Keep A Healthy Level Of Insanity:
17. When the money comes out the ATM, scream "I won!, I won! 3rd
time this week!!!!!"

/// Bram Moolenaar -- Br...@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

Bram Moolenaar

unread,
Nov 3, 2019, 5:48:26 PM11/3/19
to vim...@googlegroups.com, Bram Moolenaar

I wrote:

> Patch 8.1.2251
> Problem: ":term command" may not work without a shell.
> Solution: Add the ++shell option to :term. (closes #3340)
> Files: runtime/doc/terminal.txt, src/terminal.c,
> src/os_unix.c, src/proto/os_unix.pro,
> src/testdir/test_terminal.vim

This only supports Unix. I have a first change to make it work on
MS-Windows, but not sure how to test it. Someone wants to have a go at
it?


--- ../../git/vim81/src/terminal.c 2019-11-03 23:37:08.292934356 +0100
+++ terminal.c 2019-11-03 23:44:31.294556861 +0100
@@ -846,21 +846,31 @@
term_start(NULL, argv, &opt, eap->forceit ? TERM_START_FORCEIT : 0);
vim_free(tofree1);
vim_free(tofree2);
+ goto theend;
#else
+# ifdef MSWIN
+ long_u cmdlen = STRLEN(p_sh) + STRLEN(p_shcf) + STRLEN(cmd) + 10;
+ char_u *newcmd;
+
+ newcmd = alloc(cmdlen);
+ if (newcmd == NULL)
+ goto theend;
+ tofree = newcmd;
+ vim_snprintf((char *)newcmd, cmdlen, "%s %s %s", p_sh, p_shcf, cmd);
+ cmd = newcmd;
+# else
emsg(_("E279: Sorry, ++shell is not supported on this system"));
+ goto theend;
+# endif
#endif
}
- else
- {
- argvar[0].v_type = VAR_STRING;
- argvar[0].vval.v_string = cmd;
- argvar[1].v_type = VAR_UNKNOWN;
- term_start(argvar, NULL, &opt, eap->forceit ? TERM_START_FORCEIT : 0);
- }
-
- vim_free(tofree);
+ argvar[0].v_type = VAR_STRING;
+ argvar[0].vval.v_string = cmd;
+ argvar[1].v_type = VAR_UNKNOWN;
+ term_start(argvar, NULL, &opt, eap->forceit ? TERM_START_FORCEIT : 0);

theend:
+ vim_free(tofree);
vim_free(opt.jo_eof_chars);
}


--
How To Keep A Healthy Level Of Insanity:
18. When leaving the zoo, start running towards the parking lot,
yelling "run for your lives, they're loose!!"
Reply all
Reply to author
Forward
0 new messages