To: vim-dev@vim.org Subject: Patch 7.2.121 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit ------------ Patch 7.2.121 Problem: In gvim "!grep a *.c" spews out a lot of text that can't be stopped with CTRL-C. Solution: When looping to read and show text, do check for typed characters every two seconds. Files: src/os_unix.c *** ../vim-7.2.120/src/os_unix.c Wed Feb 4 14:18:44 2009 --- src/os_unix.c Sun Feb 22 00:54:05 2009 *************** *** 4092,4097 **** --- 4092,4100 ---- int fromshell_fd; garray_T ga; int noread_cnt; + # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) + struct timeval start_tv; + # endif # ifdef FEAT_GUI if (pty_master_fd >= 0) *************** *** 4201,4207 **** ga_init2(&ga, 1, BUFLEN); noread_cnt = 0; ! for (;;) { /* --- 4204,4212 ---- ga_init2(&ga, 1, BUFLEN); noread_cnt = 0; ! # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) ! gettimeofday(&start_tv, NULL); ! # endif for (;;) { /* *************** *** 4214,4238 **** * that a typed password is echoed for ssh or gpg command. * Don't get characters when the child has already * 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 ! * while, avoids that ":r !ls" eats typeahead. */ len = 0; if (!(options & SHELL_EXPAND) && ((options & (SHELL_READ|SHELL_WRITE|SHELL_COOKED)) != (SHELL_READ|SHELL_WRITE|SHELL_COOKED) ! #ifdef FEAT_GUI || gui.in_use ! #endif ) && wait_pid == 0 ! && (ta_len > 0 ! || (noread_cnt > 4 ! && (len = ui_inchar(ta_buf, ! BUFLEN, 10L, 0)) > 0))) { /* * For pipes: * Check for CTRL-C: send interrupt signal to child. --- 4219,4252 ---- * that a typed password is echoed for ssh or gpg command. * Don't get characters when the child has already * finished (wait_pid == 0). * Don't read characters unless we didn't get output for a ! * while (noread_cnt > 4), avoids that ":r !ls" eats ! * typeahead. */ len = 0; if (!(options & SHELL_EXPAND) && ((options & (SHELL_READ|SHELL_WRITE|SHELL_COOKED)) != (SHELL_READ|SHELL_WRITE|SHELL_COOKED) ! # ifdef FEAT_GUI || gui.in_use ! # endif ) && wait_pid == 0 ! && (ta_len > 0 || noread_cnt > 4)) { + 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: * Check for CTRL-C: send interrupt signal to child. *************** *** 4334,4342 **** { ta_len -= len; mch_memmove(ta_buf, ta_buf + len, ta_len); - noread_cnt = 0; } } } if (got_int) --- 4348,4356 ---- { ta_len -= len; mch_memmove(ta_buf, ta_buf + len, ta_len); } } + } } if (got_int) *************** *** 4444,4449 **** --- 4458,4482 ---- out_flush(); if (got_int) 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 *** ../vim-7.2.120/src/version.c Sun Feb 22 02:36:36 2009 --- src/version.c Sun Feb 22 02:48:03 2009 *************** *** 678,679 **** --- 678,681 ---- { /* Add new patch number below this line */ + /**/ + 121, /**/ -- hundred-and-one symptoms of being an internet addict: 111. You and your friends get together regularly on IRC, even though all of you live in the same city. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ download, build and distribute -- http://www.A-A-P.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///