mirror of
https://github.com/vim/vim.git
synced 2025-09-26 04:04:07 -04:00
patch 7.4.1283
Problem: The job feature isn't available on MS-Windows. Solution: Add the job feature. Fix argument of job_stop(). (Yasuhiro Matsumoto)
This commit is contained in:
@@ -8205,7 +8205,7 @@ static struct fst
|
||||
#ifdef FEAT_JOB
|
||||
{"job_start", 1, 2, f_job_start},
|
||||
{"job_status", 1, 1, f_job_status},
|
||||
{"job_stop", 1, 1, f_job_stop},
|
||||
{"job_stop", 1, 2, f_job_stop},
|
||||
#endif
|
||||
{"join", 1, 2, f_join},
|
||||
{"jsdecode", 1, 1, f_jsdecode},
|
||||
@@ -14286,7 +14286,7 @@ f_job_start(typval_T *argvars UNUSED, typval_T *rettv)
|
||||
|
||||
rettv->vval.v_job->jv_status = JOB_FAILED;
|
||||
#ifndef USE_ARGV
|
||||
ga_init2(&ga, 200);
|
||||
ga_init2(&ga, (int)sizeof(char*), 20);
|
||||
#endif
|
||||
|
||||
if (argvars[0].v_type == VAR_STRING)
|
||||
|
@@ -1262,9 +1262,9 @@
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The +job feature requires Unix and +eval.
|
||||
* The +job feature requires +eval and Unix or MS-Widndows.
|
||||
*/
|
||||
#if defined(UNIX) && defined(FEAT_EVAL)
|
||||
#if (defined(UNIX) || defined(WIN32)) && defined(FEAT_EVAL)
|
||||
# define FEAT_JOB
|
||||
#endif
|
||||
|
||||
|
@@ -4155,7 +4155,7 @@ mch_system_classic(char *cmd, int options)
|
||||
si.cbReserved2 = 0;
|
||||
si.lpReserved2 = NULL;
|
||||
|
||||
/* There is a strange error on Windows 95 when using "c:\\command.com".
|
||||
/* There is a strange error on Windows 95 when using "c:\command.com".
|
||||
* When the "c:\\" is left out it works OK...? */
|
||||
if (mch_windows95()
|
||||
&& (STRNICMP(cmd, "c:/command.com", 14) == 0
|
||||
@@ -5032,6 +5032,59 @@ mch_call_shell(
|
||||
return x;
|
||||
}
|
||||
|
||||
#if defined(FEAT_JOB) || defined(PROTO)
|
||||
void
|
||||
mch_start_job(char *cmd, job_T *job)
|
||||
{
|
||||
STARTUPINFO si;
|
||||
PROCESS_INFORMATION pi;
|
||||
|
||||
ZeroMemory(&si, sizeof(si));
|
||||
si.cb = sizeof(si);
|
||||
|
||||
if (!vim_create_process(cmd, FALSE,
|
||||
CREATE_DEFAULT_ERROR_MODE |
|
||||
CREATE_NEW_PROCESS_GROUP |
|
||||
CREATE_NO_WINDOW,
|
||||
&si, &pi))
|
||||
job->jv_status = JOB_FAILED;
|
||||
else
|
||||
{
|
||||
job->jf_pi = pi;
|
||||
job->jv_status = JOB_STARTED;
|
||||
}
|
||||
}
|
||||
|
||||
char *
|
||||
mch_job_status(job_T *job)
|
||||
{
|
||||
DWORD dwExitCode = 0;
|
||||
|
||||
if (!GetExitCodeProcess(job->jf_pi.hProcess, &dwExitCode))
|
||||
return "dead";
|
||||
if (dwExitCode != STILL_ACTIVE)
|
||||
{
|
||||
CloseHandle(job->jf_pi.hProcess);
|
||||
CloseHandle(job->jf_pi.hThread);
|
||||
return "dead";
|
||||
}
|
||||
return "run";
|
||||
}
|
||||
|
||||
int
|
||||
mch_stop_job(job_T *job, char_u *how)
|
||||
{
|
||||
if (STRCMP(how, "kill") == 0)
|
||||
TerminateProcess(job->jf_pi.hProcess, 0);
|
||||
else
|
||||
return GenerateConsoleCtrlEvent(
|
||||
STRCMP(how, "hup") == 0 ?
|
||||
CTRL_BREAK_EVENT : CTRL_C_EVENT,
|
||||
job->jf_pi.dwProcessId) ? OK : FAIL;
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef FEAT_GUI_W32
|
||||
|
||||
|
@@ -40,6 +40,9 @@ void mch_set_shellsize(void);
|
||||
void mch_new_shellsize(void);
|
||||
void mch_set_winsize_now(void);
|
||||
int mch_call_shell(char_u *cmd, int options);
|
||||
void mch_start_job(char *cmd, job_T *job);
|
||||
char *mch_job_status(job_T *job);
|
||||
int mch_stop_job(job_T *job, char_u *how);
|
||||
void mch_set_normal_colors(void);
|
||||
void mch_write(char_u *s, int len);
|
||||
void mch_delay(long msec, int ignoreinput);
|
||||
|
@@ -747,6 +747,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
1283,
|
||||
/**/
|
||||
1282,
|
||||
/**/
|
||||
|
Reference in New Issue
Block a user