0
0
mirror of https://github.com/vim/vim.git synced 2025-09-02 21:13:50 -04:00

updated for version 7.2-121

This commit is contained in:
Bram Moolenaar 2009-02-22 01:52:59 +00:00
parent 884ae6446f
commit b3dc8fd3fd
2 changed files with 45 additions and 10 deletions

View File

@ -4092,6 +4092,9 @@ mch_call_shell(cmd, options)
int fromshell_fd; int fromshell_fd;
garray_T ga; garray_T ga;
int noread_cnt; int noread_cnt;
# if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
struct timeval start_tv;
# endif
# ifdef FEAT_GUI # ifdef FEAT_GUI
if (pty_master_fd >= 0) if (pty_master_fd >= 0)
@ -4201,7 +4204,9 @@ mch_call_shell(cmd, options)
ga_init2(&ga, 1, BUFLEN); ga_init2(&ga, 1, BUFLEN);
noread_cnt = 0; noread_cnt = 0;
# if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
gettimeofday(&start_tv, NULL);
# endif
for (;;) for (;;)
{ {
/* /*
@ -4214,25 +4219,34 @@ mch_call_shell(cmd, options)
* that a typed password is echoed for ssh or gpg command. * that a typed password is echoed for ssh or gpg command.
* Don't get characters when the child has already * Don't get characters when the child has already
* finished (wait_pid == 0). * finished (wait_pid == 0).
* Don't get extra characters when we already have one.
* Don't read characters unless we didn't get output for a * Don't read characters unless we didn't get output for a
* while, avoids that ":r !ls" eats typeahead. * while (noread_cnt > 4), avoids that ":r !ls" eats
* typeahead.
*/ */
len = 0; len = 0;
if (!(options & SHELL_EXPAND) if (!(options & SHELL_EXPAND)
&& ((options & && ((options &
(SHELL_READ|SHELL_WRITE|SHELL_COOKED)) (SHELL_READ|SHELL_WRITE|SHELL_COOKED))
!= (SHELL_READ|SHELL_WRITE|SHELL_COOKED) != (SHELL_READ|SHELL_WRITE|SHELL_COOKED)
#ifdef FEAT_GUI # ifdef FEAT_GUI
|| gui.in_use || gui.in_use
#endif # endif
) )
&& wait_pid == 0 && wait_pid == 0
&& (ta_len > 0 && (ta_len > 0 || noread_cnt > 4))
|| (noread_cnt > 4
&& (len = ui_inchar(ta_buf,
BUFLEN, 10L, 0)) > 0)))
{ {
if (ta_len == 0)
{
/* Get extra characters when we don't have any.
* Reset the counter and timer. */
noread_cnt = 0;
# if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
gettimeofday(&start_tv, NULL);
# endif
len = ui_inchar(ta_buf, BUFLEN, 10L, 0);
}
if (ta_len > 0 || len > 0)
{
/* /*
* For pipes: * For pipes:
* Check for CTRL-C: send interrupt signal to child. * Check for CTRL-C: send interrupt signal to child.
@ -4334,9 +4348,9 @@ mch_call_shell(cmd, options)
{ {
ta_len -= len; ta_len -= len;
mch_memmove(ta_buf, ta_buf + len, ta_len); mch_memmove(ta_buf, ta_buf + len, ta_len);
noread_cnt = 0;
} }
} }
}
} }
if (got_int) if (got_int)
@ -4444,6 +4458,25 @@ mch_call_shell(cmd, options)
out_flush(); out_flush();
if (got_int) if (got_int)
break; break;
# if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
{
struct timeval now_tv;
long msec;
/* Avoid that we keep looping here without
* checking for a CTRL-C for a long time. Don't
* break out too often to avoid losing typeahead. */
gettimeofday(&now_tv, NULL);
msec = (now_tv.tv_sec - start_tv.tv_sec) * 1000L
+ (now_tv.tv_usec - start_tv.tv_usec) / 1000L;
if (msec > 2000)
{
noread_cnt = 5;
break;
}
}
# endif
} }
/* If we already detected the child has finished break the /* If we already detected the child has finished break the

View File

@ -676,6 +676,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
121,
/**/ /**/
120, 120,
/**/ /**/