1 To: [email protected] |
|
2 Subject: Patch 7.2.121 |
|
3 Fcc: outbox |
|
4 From: Bram Moolenaar <[email protected]> |
|
5 Mime-Version: 1.0 |
|
6 Content-Type: text/plain; charset=ISO-8859-1 |
|
7 Content-Transfer-Encoding: 8bit |
|
8 ------------ |
|
9 |
|
10 Patch 7.2.121 |
|
11 Problem: In gvim "!grep a *.c" spews out a lot of text that can't be |
|
12 stopped with CTRL-C. |
|
13 Solution: When looping to read and show text, do check for typed characters |
|
14 every two seconds. |
|
15 Files: src/os_unix.c |
|
16 |
|
17 |
|
18 *** ../vim-7.2.120/src/os_unix.c Wed Feb 4 14:18:44 2009 |
|
19 --- src/os_unix.c Sun Feb 22 00:54:05 2009 |
|
20 *************** |
|
21 *** 4092,4097 **** |
|
22 --- 4092,4100 ---- |
|
23 int fromshell_fd; |
|
24 garray_T ga; |
|
25 int noread_cnt; |
|
26 + # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) |
|
27 + struct timeval start_tv; |
|
28 + # endif |
|
29 |
|
30 # ifdef FEAT_GUI |
|
31 if (pty_master_fd >= 0) |
|
32 *************** |
|
33 *** 4201,4207 **** |
|
34 ga_init2(&ga, 1, BUFLEN); |
|
35 |
|
36 noread_cnt = 0; |
|
37 ! |
|
38 for (;;) |
|
39 { |
|
40 /* |
|
41 --- 4204,4212 ---- |
|
42 ga_init2(&ga, 1, BUFLEN); |
|
43 |
|
44 noread_cnt = 0; |
|
45 ! # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) |
|
46 ! gettimeofday(&start_tv, NULL); |
|
47 ! # endif |
|
48 for (;;) |
|
49 { |
|
50 /* |
|
51 *************** |
|
52 *** 4214,4238 **** |
|
53 * that a typed password is echoed for ssh or gpg command. |
|
54 * Don't get characters when the child has already |
|
55 * finished (wait_pid == 0). |
|
56 - * Don't get extra characters when we already have one. |
|
57 * Don't read characters unless we didn't get output for a |
|
58 ! * while, avoids that ":r !ls" eats typeahead. |
|
59 */ |
|
60 len = 0; |
|
61 if (!(options & SHELL_EXPAND) |
|
62 && ((options & |
|
63 (SHELL_READ|SHELL_WRITE|SHELL_COOKED)) |
|
64 != (SHELL_READ|SHELL_WRITE|SHELL_COOKED) |
|
65 ! #ifdef FEAT_GUI |
|
66 || gui.in_use |
|
67 ! #endif |
|
68 ) |
|
69 && wait_pid == 0 |
|
70 ! && (ta_len > 0 |
|
71 ! || (noread_cnt > 4 |
|
72 ! && (len = ui_inchar(ta_buf, |
|
73 ! BUFLEN, 10L, 0)) > 0))) |
|
74 { |
|
75 /* |
|
76 * For pipes: |
|
77 * Check for CTRL-C: send interrupt signal to child. |
|
78 --- 4219,4252 ---- |
|
79 * that a typed password is echoed for ssh or gpg command. |
|
80 * Don't get characters when the child has already |
|
81 * finished (wait_pid == 0). |
|
82 * Don't read characters unless we didn't get output for a |
|
83 ! * while (noread_cnt > 4), avoids that ":r !ls" eats |
|
84 ! * typeahead. |
|
85 */ |
|
86 len = 0; |
|
87 if (!(options & SHELL_EXPAND) |
|
88 && ((options & |
|
89 (SHELL_READ|SHELL_WRITE|SHELL_COOKED)) |
|
90 != (SHELL_READ|SHELL_WRITE|SHELL_COOKED) |
|
91 ! # ifdef FEAT_GUI |
|
92 || gui.in_use |
|
93 ! # endif |
|
94 ) |
|
95 && wait_pid == 0 |
|
96 ! && (ta_len > 0 || noread_cnt > 4)) |
|
97 { |
|
98 + if (ta_len == 0) |
|
99 + { |
|
100 + /* Get extra characters when we don't have any. |
|
101 + * Reset the counter and timer. */ |
|
102 + noread_cnt = 0; |
|
103 + # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) |
|
104 + gettimeofday(&start_tv, NULL); |
|
105 + # endif |
|
106 + len = ui_inchar(ta_buf, BUFLEN, 10L, 0); |
|
107 + } |
|
108 + if (ta_len > 0 || len > 0) |
|
109 + { |
|
110 /* |
|
111 * For pipes: |
|
112 * Check for CTRL-C: send interrupt signal to child. |
|
113 *************** |
|
114 *** 4334,4342 **** |
|
115 { |
|
116 ta_len -= len; |
|
117 mch_memmove(ta_buf, ta_buf + len, ta_len); |
|
118 - noread_cnt = 0; |
|
119 } |
|
120 } |
|
121 } |
|
122 |
|
123 if (got_int) |
|
124 --- 4348,4356 ---- |
|
125 { |
|
126 ta_len -= len; |
|
127 mch_memmove(ta_buf, ta_buf + len, ta_len); |
|
128 } |
|
129 } |
|
130 + } |
|
131 } |
|
132 |
|
133 if (got_int) |
|
134 *************** |
|
135 *** 4444,4449 **** |
|
136 --- 4458,4482 ---- |
|
137 out_flush(); |
|
138 if (got_int) |
|
139 break; |
|
140 + |
|
141 + # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) |
|
142 + { |
|
143 + struct timeval now_tv; |
|
144 + long msec; |
|
145 + |
|
146 + /* Avoid that we keep looping here without |
|
147 + * checking for a CTRL-C for a long time. Don't |
|
148 + * break out too often to avoid losing typeahead. */ |
|
149 + gettimeofday(&now_tv, NULL); |
|
150 + msec = (now_tv.tv_sec - start_tv.tv_sec) * 1000L |
|
151 + + (now_tv.tv_usec - start_tv.tv_usec) / 1000L; |
|
152 + if (msec > 2000) |
|
153 + { |
|
154 + noread_cnt = 5; |
|
155 + break; |
|
156 + } |
|
157 + } |
|
158 + # endif |
|
159 } |
|
160 |
|
161 /* If we already detected the child has finished break the |
|
162 *** ../vim-7.2.120/src/version.c Sun Feb 22 02:36:36 2009 |
|
163 --- src/version.c Sun Feb 22 02:48:03 2009 |
|
164 *************** |
|
165 *** 678,679 **** |
|
166 --- 678,681 ---- |
|
167 { /* Add new patch number below this line */ |
|
168 + /**/ |
|
169 + 121, |
|
170 /**/ |
|
171 |
|
172 -- |
|
173 hundred-and-one symptoms of being an internet addict: |
|
174 111. You and your friends get together regularly on IRC, even though |
|
175 all of you live in the same city. |
|
176 |
|
177 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\ |
|
178 /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
|
179 \\\ download, build and distribute -- http://www.A-A-P.org /// |
|
180 \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |
|