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 -- [email protected] -- 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    ///

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui