@@ -703,6 +703,7 @@ ex_terminal(exarg_T *eap)
703703{
704704 typval_T argvar [2 ];
705705 jobopt_T opt ;
706+ int opt_shell = FALSE;
706707 char_u * cmd ;
707708 char_u * tofree = NULL ;
708709
@@ -738,6 +739,8 @@ ex_terminal(exarg_T *eap)
738739 opt .jo_hidden = 1 ;
739740 else if (OPTARG_HAS ("norestore" ))
740741 opt .jo_term_norestore = 1 ;
742+ else if (OPTARG_HAS ("shell" ))
743+ opt_shell = TRUE;
741744 else if (OPTARG_HAS ("kill" ) && ep != NULL )
742745 {
743746 opt .jo_set2 |= JO2_TERM_KILL ;
@@ -831,10 +834,30 @@ ex_terminal(exarg_T *eap)
831834 opt .jo_in_bot = eap -> line2 ;
832835 }
833836
834- argvar [0 ].v_type = VAR_STRING ;
835- argvar [0 ].vval .v_string = cmd ;
836- argvar [1 ].v_type = VAR_UNKNOWN ;
837- term_start (argvar , NULL , & opt , eap -> forceit ? TERM_START_FORCEIT : 0 );
837+ if (opt_shell && tofree == NULL )
838+ {
839+ #ifdef UNIX
840+ char * * argv = NULL ;
841+ char_u * tofree1 = NULL ;
842+ char_u * tofree2 = NULL ;
843+
844+ // :term ++shell command
845+ if (unix_build_argv (cmd , & argv , & tofree1 , & tofree2 ) == OK )
846+ term_start (NULL , argv , & opt , eap -> forceit ? TERM_START_FORCEIT : 0 );
847+ vim_free (tofree1 );
848+ vim_free (tofree2 );
849+ #else
850+ emsg (_ ("E279: Sorry, ++shell is not supported on this system" ));
851+ #endif
852+ }
853+ else
854+ {
855+ argvar [0 ].v_type = VAR_STRING ;
856+ argvar [0 ].vval .v_string = cmd ;
857+ argvar [1 ].v_type = VAR_UNKNOWN ;
858+ term_start (argvar , NULL , & opt , eap -> forceit ? TERM_START_FORCEIT : 0 );
859+ }
860+
838861 vim_free (tofree );
839862
840863theend :
@@ -6474,7 +6497,7 @@ winpty_term_and_job_init(
64746497term_and_job_init (
64756498 term_T * term ,
64766499 typval_T * argvar ,
6477- char * * argv UNUSED ,
6500+ char * * argv ,
64786501 jobopt_T * opt ,
64796502 jobopt_T * orig_opt )
64806503{
0 commit comments