Mercurial > vim
annotate src/misc1.c @ 19280:669bd4306d67
Added tag v8.2.0198 for changeset 25cb7ab433c6211bf50b64317ee8d89d994a52a4
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 02 Feb 2020 16:00:09 +0100 |
parents | 94eda51ba9ba |
children | 9dc843109c97 |
rev | line source |
---|---|
10042
4aead6a9b7a9
commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents:
10002
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
7 | 2 * |
3 * VIM - Vi IMproved by Bram Moolenaar | |
4 * | |
5 * Do ":help uganda" in Vim to read copying and usage conditions. | |
6 * Do ":help credits" in Vim to see a list of people who contributed. | |
7 * See README.txt for an overview of the Vim source code. | |
8 */ | |
9 | |
10 /* | |
11 * misc1.c: functions that didn't seem to fit elsewhere | |
12 */ | |
13 | |
14 #include "vim.h" | |
15 #include "version.h" | |
16 | |
17781
04245f071792
patch 8.1.1887: the +cmdline_compl feature is not in the tiny version
Bram Moolenaar <Bram@vim.org>
parents:
17452
diff
changeset
|
17 #if defined(MSWIN) |
14133
352c2832d17f
patch 8.1.0084: user name completion does not work on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13942
diff
changeset
|
18 # include <lm.h> |
352c2832d17f
patch 8.1.0084: user name completion does not work on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13942
diff
changeset
|
19 #endif |
352c2832d17f
patch 8.1.0084: user name completion does not work on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13942
diff
changeset
|
20 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
21 #define URL_SLASH 1 // path_is_url() has found "://" |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
22 #define URL_BACKSLASH 2 // path_is_url() has found ":\\" |
15814
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
23 |
17781
04245f071792
patch 8.1.1887: the +cmdline_compl feature is not in the tiny version
Bram Moolenaar <Bram@vim.org>
parents:
17452
diff
changeset
|
24 // All user names (for ~user completion as done by shell). |
3744 | 25 static garray_T ga_users; |
26 | |
7 | 27 /* |
5403 | 28 * get_leader_len() returns the length in bytes of the prefix of the given |
29 * string which introduces a comment. If this string is not a comment then | |
30 * 0 is returned. | |
7 | 31 * When "flags" is not NULL, it is set to point to the flags of the recognized |
32 * comment leader. | |
33 * "backward" must be true for the "O" command. | |
3562 | 34 * If "include_space" is set, include trailing whitespace while calculating the |
35 * length. | |
7 | 36 */ |
37 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
38 get_leader_len( |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
39 char_u *line, |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
40 char_u **flags, |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
41 int backward, |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
42 int include_space) |
7 | 43 { |
44 int i, j; | |
3562 | 45 int result; |
7 | 46 int got_com = FALSE; |
47 int found_one; | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
48 char_u part_buf[COM_MAX_LEN]; // buffer for one option part |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
49 char_u *string; // pointer to comment string |
7 | 50 char_u *list; |
2809 | 51 int middle_match_len = 0; |
52 char_u *prev_list; | |
2813 | 53 char_u *saved_flags = NULL; |
7 | 54 |
3562 | 55 result = i = 0; |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
56 while (VIM_ISWHITE(line[i])) // leading white space is ignored |
7 | 57 ++i; |
58 | |
59 /* | |
60 * Repeat to match several nested comment strings. | |
61 */ | |
2809 | 62 while (line[i] != NUL) |
7 | 63 { |
64 /* | |
65 * scan through the 'comments' option for a match | |
66 */ | |
67 found_one = FALSE; | |
68 for (list = curbuf->b_p_com; *list; ) | |
69 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
70 // Get one option part into part_buf[]. Advance "list" to next |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
71 // one. Put "string" at start of string. |
2809 | 72 if (!got_com && flags != NULL) |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
73 *flags = list; // remember where flags started |
2809 | 74 prev_list = list; |
7 | 75 (void)copy_option_part(&list, part_buf, COM_MAX_LEN, ","); |
76 string = vim_strchr(part_buf, ':'); | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
77 if (string == NULL) // missing ':', ignore this part |
7 | 78 continue; |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
79 *string++ = NUL; // isolate flags from string |
7 | 80 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
81 // If we found a middle match previously, use that match when this |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
82 // is not a middle or end. |
2809 | 83 if (middle_match_len != 0 |
84 && vim_strchr(part_buf, COM_MIDDLE) == NULL | |
85 && vim_strchr(part_buf, COM_END) == NULL) | |
86 break; | |
87 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
88 // When we already found a nested comment, only accept further |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
89 // nested comments. |
7 | 90 if (got_com && vim_strchr(part_buf, COM_NEST) == NULL) |
91 continue; | |
92 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
93 // When 'O' flag present and using "O" command skip this one. |
7 | 94 if (backward && vim_strchr(part_buf, COM_NOBACK) != NULL) |
95 continue; | |
96 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
97 // Line contents and string must match. |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
98 // When string starts with white space, must have some white space |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
99 // (but the amount does not need to match, there might be a mix of |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
100 // TABs and spaces). |
11129
f4ea50924c6d
patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
101 if (VIM_ISWHITE(string[0])) |
f4ea50924c6d
patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
102 { |
f4ea50924c6d
patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
103 if (i == 0 || !VIM_ISWHITE(line[i - 1])) |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
104 continue; // missing white space |
11129
f4ea50924c6d
patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
105 while (VIM_ISWHITE(string[0])) |
7 | 106 ++string; |
107 } | |
108 for (j = 0; string[j] != NUL && string[j] == line[i + j]; ++j) | |
109 ; | |
110 if (string[j] != NUL) | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
111 continue; // string doesn't match |
2809 | 112 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
113 // When 'b' flag used, there must be white space or an |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
114 // end-of-line after the string in the line. |
7 | 115 if (vim_strchr(part_buf, COM_BLANK) != NULL |
11129
f4ea50924c6d
patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
116 && !VIM_ISWHITE(line[i + j]) && line[i + j] != NUL) |
7 | 117 continue; |
118 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
119 // We have found a match, stop searching unless this is a middle |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
120 // comment. The middle comment can be a substring of the end |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
121 // comment in which case it's better to return the length of the |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
122 // end comment and its flags. Thus we keep searching with middle |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
123 // and end matches and use an end match if it matches better. |
2809 | 124 if (vim_strchr(part_buf, COM_MIDDLE) != NULL) |
125 { | |
126 if (middle_match_len == 0) | |
127 { | |
128 middle_match_len = j; | |
129 saved_flags = prev_list; | |
130 } | |
131 continue; | |
132 } | |
133 if (middle_match_len != 0 && j > middle_match_len) | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
134 // Use this match instead of the middle match, since it's a |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
135 // longer thus better match. |
2809 | 136 middle_match_len = 0; |
137 | |
138 if (middle_match_len == 0) | |
139 i += j; | |
7 | 140 found_one = TRUE; |
141 break; | |
142 } | |
143 | |
2809 | 144 if (middle_match_len != 0) |
145 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
146 // Use the previously found middle match after failing to find a |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
147 // match with an end. |
2809 | 148 if (!got_com && flags != NULL) |
149 *flags = saved_flags; | |
150 i += middle_match_len; | |
151 found_one = TRUE; | |
152 } | |
153 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
154 // No match found, stop scanning. |
7 | 155 if (!found_one) |
156 break; | |
157 | |
3562 | 158 result = i; |
159 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
160 // Include any trailing white space. |
11129
f4ea50924c6d
patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
161 while (VIM_ISWHITE(line[i])) |
7 | 162 ++i; |
163 | |
3562 | 164 if (include_space) |
165 result = i; | |
166 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
167 // If this comment doesn't nest, stop here. |
2809 | 168 got_com = TRUE; |
7 | 169 if (vim_strchr(part_buf, COM_NEST) == NULL) |
170 break; | |
171 } | |
3562 | 172 return result; |
173 } | |
174 | |
175 /* | |
176 * Return the offset at which the last comment in line starts. If there is no | |
177 * comment in the whole line, -1 is returned. | |
178 * | |
179 * When "flags" is not null, it is set to point to the flags describing the | |
180 * recognized comment leader. | |
181 */ | |
182 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
183 get_last_leader_offset(char_u *line, char_u **flags) |
3562 | 184 { |
185 int result = -1; | |
186 int i, j; | |
187 int lower_check_bound = 0; | |
188 char_u *string; | |
189 char_u *com_leader; | |
190 char_u *com_flags; | |
191 char_u *list; | |
192 int found_one; | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
193 char_u part_buf[COM_MAX_LEN]; // buffer for one option part |
3562 | 194 |
195 /* | |
196 * Repeat to match several nested comment strings. | |
197 */ | |
198 i = (int)STRLEN(line); | |
199 while (--i >= lower_check_bound) | |
200 { | |
201 /* | |
202 * scan through the 'comments' option for a match | |
203 */ | |
204 found_one = FALSE; | |
205 for (list = curbuf->b_p_com; *list; ) | |
206 { | |
207 char_u *flags_save = list; | |
208 | |
209 /* | |
210 * Get one option part into part_buf[]. Advance list to next one. | |
211 * put string at start of string. | |
212 */ | |
213 (void)copy_option_part(&list, part_buf, COM_MAX_LEN, ","); | |
214 string = vim_strchr(part_buf, ':'); | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
215 if (string == NULL) // If everything is fine, this cannot actually |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
216 // happen. |
3562 | 217 continue; |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
218 *string++ = NUL; // Isolate flags from string. |
3562 | 219 com_leader = string; |
220 | |
221 /* | |
222 * Line contents and string must match. | |
223 * When string starts with white space, must have some white space | |
224 * (but the amount does not need to match, there might be a mix of | |
225 * TABs and spaces). | |
226 */ | |
11129
f4ea50924c6d
patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
227 if (VIM_ISWHITE(string[0])) |
f4ea50924c6d
patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
228 { |
f4ea50924c6d
patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
229 if (i == 0 || !VIM_ISWHITE(line[i - 1])) |
3562 | 230 continue; |
15119
6e9f37bf987b
patch 8.1.0570: 'commentstring' not used when adding fold marker
Bram Moolenaar <Bram@vim.org>
parents:
15046
diff
changeset
|
231 while (VIM_ISWHITE(*string)) |
3562 | 232 ++string; |
233 } | |
234 for (j = 0; string[j] != NUL && string[j] == line[i + j]; ++j) | |
235 /* do nothing */; | |
236 if (string[j] != NUL) | |
237 continue; | |
238 | |
239 /* | |
240 * When 'b' flag used, there must be white space or an | |
241 * end-of-line after the string in the line. | |
242 */ | |
243 if (vim_strchr(part_buf, COM_BLANK) != NULL | |
11129
f4ea50924c6d
patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
244 && !VIM_ISWHITE(line[i + j]) && line[i + j] != NUL) |
3562 | 245 continue; |
15119
6e9f37bf987b
patch 8.1.0570: 'commentstring' not used when adding fold marker
Bram Moolenaar <Bram@vim.org>
parents:
15046
diff
changeset
|
246 |
15127
31a0127813cb
patch 8.1.0574: 'commentstring' not used when adding fold marker in C
Bram Moolenaar <Bram@vim.org>
parents:
15119
diff
changeset
|
247 if (vim_strchr(part_buf, COM_MIDDLE) != NULL) |
31a0127813cb
patch 8.1.0574: 'commentstring' not used when adding fold marker in C
Bram Moolenaar <Bram@vim.org>
parents:
15119
diff
changeset
|
248 { |
31a0127813cb
patch 8.1.0574: 'commentstring' not used when adding fold marker in C
Bram Moolenaar <Bram@vim.org>
parents:
15119
diff
changeset
|
249 // For a middlepart comment, only consider it to match if |
31a0127813cb
patch 8.1.0574: 'commentstring' not used when adding fold marker in C
Bram Moolenaar <Bram@vim.org>
parents:
15119
diff
changeset
|
250 // everything before the current position in the line is |
31a0127813cb
patch 8.1.0574: 'commentstring' not used when adding fold marker in C
Bram Moolenaar <Bram@vim.org>
parents:
15119
diff
changeset
|
251 // whitespace. Otherwise we would think we are inside a |
31a0127813cb
patch 8.1.0574: 'commentstring' not used when adding fold marker in C
Bram Moolenaar <Bram@vim.org>
parents:
15119
diff
changeset
|
252 // comment if the middle part appears somewhere in the middle |
31a0127813cb
patch 8.1.0574: 'commentstring' not used when adding fold marker in C
Bram Moolenaar <Bram@vim.org>
parents:
15119
diff
changeset
|
253 // of the line. E.g. for C the "*" appears often. |
15119
6e9f37bf987b
patch 8.1.0570: 'commentstring' not used when adding fold marker
Bram Moolenaar <Bram@vim.org>
parents:
15046
diff
changeset
|
254 for (j = 0; VIM_ISWHITE(line[j]) && j <= i; j++) |
6e9f37bf987b
patch 8.1.0570: 'commentstring' not used when adding fold marker
Bram Moolenaar <Bram@vim.org>
parents:
15046
diff
changeset
|
255 ; |
6e9f37bf987b
patch 8.1.0570: 'commentstring' not used when adding fold marker
Bram Moolenaar <Bram@vim.org>
parents:
15046
diff
changeset
|
256 if (j < i) |
6e9f37bf987b
patch 8.1.0570: 'commentstring' not used when adding fold marker
Bram Moolenaar <Bram@vim.org>
parents:
15046
diff
changeset
|
257 continue; |
3562 | 258 } |
259 | |
260 /* | |
261 * We have found a match, stop searching. | |
262 */ | |
263 found_one = TRUE; | |
264 | |
265 if (flags) | |
266 *flags = flags_save; | |
267 com_flags = flags_save; | |
268 | |
269 break; | |
270 } | |
271 | |
272 if (found_one) | |
273 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
274 char_u part_buf2[COM_MAX_LEN]; // buffer for one option part |
3562 | 275 int len1, len2, off; |
276 | |
277 result = i; | |
278 /* | |
279 * If this comment nests, continue searching. | |
280 */ | |
281 if (vim_strchr(part_buf, COM_NEST) != NULL) | |
282 continue; | |
283 | |
284 lower_check_bound = i; | |
285 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
286 // Let's verify whether the comment leader found is a substring |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
287 // of other comment leaders. If it is, let's adjust the |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
288 // lower_check_bound so that we make sure that we have determined |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
289 // the comment leader correctly. |
3562 | 290 |
11129
f4ea50924c6d
patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
291 while (VIM_ISWHITE(*com_leader)) |
3562 | 292 ++com_leader; |
293 len1 = (int)STRLEN(com_leader); | |
294 | |
295 for (list = curbuf->b_p_com; *list; ) | |
296 { | |
297 char_u *flags_save = list; | |
298 | |
299 (void)copy_option_part(&list, part_buf2, COM_MAX_LEN, ","); | |
300 if (flags_save == com_flags) | |
301 continue; | |
302 string = vim_strchr(part_buf2, ':'); | |
303 ++string; | |
11129
f4ea50924c6d
patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
304 while (VIM_ISWHITE(*string)) |
3562 | 305 ++string; |
306 len2 = (int)STRLEN(string); | |
307 if (len2 == 0) | |
308 continue; | |
309 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
310 // Now we have to verify whether string ends with a substring |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
311 // beginning the com_leader. |
3562 | 312 for (off = (len2 > i ? i : len2); off > 0 && off + len1 > len2;) |
313 { | |
314 --off; | |
315 if (!STRNCMP(string + off, com_leader, len2 - off)) | |
316 { | |
317 if (i - off < lower_check_bound) | |
318 lower_check_bound = i - off; | |
319 } | |
320 } | |
321 } | |
322 } | |
323 } | |
324 return result; | |
7 | 325 } |
326 | |
327 /* | |
328 * Return the number of window lines occupied by buffer line "lnum". | |
329 */ | |
330 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
331 plines(linenr_T lnum) |
7 | 332 { |
333 return plines_win(curwin, lnum, TRUE); | |
334 } | |
335 | |
336 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
337 plines_win( |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
338 win_T *wp, |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
339 linenr_T lnum, |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
340 int winheight) // when TRUE limit to window height |
7 | 341 { |
342 #if defined(FEAT_DIFF) || defined(PROTO) | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
343 // Check for filler lines above this buffer line. When folded the result |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
344 // is one line anyway. |
7 | 345 return plines_win_nofill(wp, lnum, winheight) + diff_check_fill(wp, lnum); |
346 } | |
347 | |
348 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
349 plines_nofill(linenr_T lnum) |
7 | 350 { |
351 return plines_win_nofill(curwin, lnum, TRUE); | |
352 } | |
353 | |
354 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
355 plines_win_nofill( |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
356 win_T *wp, |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
357 linenr_T lnum, |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
358 int winheight) // when TRUE limit to window height |
7 | 359 { |
360 #endif | |
361 int lines; | |
362 | |
363 if (!wp->w_p_wrap) | |
364 return 1; | |
365 | |
366 if (wp->w_width == 0) | |
367 return 1; | |
368 | |
369 #ifdef FEAT_FOLDING | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
370 // A folded lines is handled just like an empty line. |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
371 // NOTE: Caller must handle lines that are MAYBE folded. |
7 | 372 if (lineFolded(wp, lnum) == TRUE) |
373 return 1; | |
374 #endif | |
375 | |
376 lines = plines_win_nofold(wp, lnum); | |
377 if (winheight > 0 && lines > wp->w_height) | |
378 return (int)wp->w_height; | |
379 return lines; | |
380 } | |
381 | |
382 /* | |
383 * Return number of window lines physical line "lnum" will occupy in window | |
384 * "wp". Does not care about folding, 'wrap' or 'diff'. | |
385 */ | |
386 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
387 plines_win_nofold(win_T *wp, linenr_T lnum) |
7 | 388 { |
389 char_u *s; | |
390 long col; | |
391 int width; | |
392 | |
393 s = ml_get_buf(wp->w_buffer, lnum, FALSE); | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
394 if (*s == NUL) // empty line |
7 | 395 return 1; |
396 col = win_linetabsize(wp, s, (colnr_T)MAXCOL); | |
397 | |
398 /* | |
399 * If list mode is on, then the '$' at the end of the line may take up one | |
400 * extra column. | |
401 */ | |
402 if (wp->w_p_list && lcs_eol != NUL) | |
403 col += 1; | |
404 | |
405 /* | |
2178
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2162
diff
changeset
|
406 * Add column offset for 'number', 'relativenumber' and 'foldcolumn'. |
7 | 407 */ |
12515
972ea22c946f
patch 8.0.1136: W_WIDTH() is always the same
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
408 width = wp->w_width - win_col_off(wp); |
7 | 409 if (width <= 0) |
410 return 32000; | |
411 if (col <= width) | |
412 return 1; | |
413 col -= width; | |
414 width += win_col_off2(wp); | |
415 return (col + (width - 1)) / width + 1; | |
416 } | |
417 | |
418 /* | |
419 * Like plines_win(), but only reports the number of physical screen lines | |
420 * used from the start of the line to the given column number. | |
421 */ | |
422 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
423 plines_win_col(win_T *wp, linenr_T lnum, long column) |
7 | 424 { |
425 long col; | |
426 char_u *s; | |
427 int lines = 0; | |
428 int width; | |
5995 | 429 char_u *line; |
7 | 430 |
431 #ifdef FEAT_DIFF | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
432 // Check for filler lines above this buffer line. When folded the result |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
433 // is one line anyway. |
7 | 434 lines = diff_check_fill(wp, lnum); |
435 #endif | |
436 | |
437 if (!wp->w_p_wrap) | |
438 return lines + 1; | |
439 | |
440 if (wp->w_width == 0) | |
441 return lines + 1; | |
442 | |
5995 | 443 line = s = ml_get_buf(wp->w_buffer, lnum, FALSE); |
7 | 444 |
445 col = 0; | |
446 while (*s != NUL && --column >= 0) | |
447 { | |
5995 | 448 col += win_lbr_chartabsize(wp, line, s, (colnr_T)col, NULL); |
11127
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11121
diff
changeset
|
449 MB_PTR_ADV(s); |
7 | 450 } |
451 | |
452 /* | |
453 * If *s is a TAB, and the TAB is not displayed as ^I, and we're not in | |
454 * INSERT mode, then col must be adjusted so that it represents the last | |
455 * screen position of the TAB. This only fixes an error when the TAB wraps | |
456 * from one screen line to the next (when 'columns' is not a multiple of | |
457 * 'ts') -- webb. | |
458 */ | |
459 if (*s == TAB && (State & NORMAL) && (!wp->w_p_list || lcs_tab1)) | |
5995 | 460 col += win_lbr_chartabsize(wp, line, s, (colnr_T)col, NULL) - 1; |
7 | 461 |
462 /* | |
2178
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2162
diff
changeset
|
463 * Add column offset for 'number', 'relativenumber', 'foldcolumn', etc. |
7 | 464 */ |
12515
972ea22c946f
patch 8.0.1136: W_WIDTH() is always the same
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
465 width = wp->w_width - win_col_off(wp); |
1023 | 466 if (width <= 0) |
467 return 9999; | |
468 | |
469 lines += 1; | |
470 if (col > width) | |
471 lines += (col - width) / (width + win_col_off2(wp)) + 1; | |
472 return lines; | |
7 | 473 } |
474 | |
475 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
476 plines_m_win(win_T *wp, linenr_T first, linenr_T last) |
7 | 477 { |
478 int count = 0; | |
479 | |
480 while (first <= last) | |
481 { | |
482 #ifdef FEAT_FOLDING | |
483 int x; | |
484 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
485 // Check if there are any really folded lines, but also included lines |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
486 // that are maybe folded. |
7 | 487 x = foldedCount(wp, first, NULL); |
488 if (x > 0) | |
489 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
490 ++count; // count 1 for "+-- folded" line |
7 | 491 first += x; |
492 } | |
493 else | |
494 #endif | |
495 { | |
496 #ifdef FEAT_DIFF | |
497 if (first == wp->w_topline) | |
498 count += plines_win_nofill(wp, first, TRUE) + wp->w_topfill; | |
499 else | |
500 #endif | |
501 count += plines_win(wp, first, TRUE); | |
502 ++first; | |
503 } | |
504 } | |
505 return (count); | |
506 } | |
507 | |
508 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
509 gchar_pos(pos_T *pos) |
7 | 510 { |
13082
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
511 char_u *ptr; |
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
512 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
513 // When searching columns is sometimes put at the end of a line. |
13082
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
514 if (pos->col == MAXCOL) |
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
515 return NUL; |
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
516 ptr = ml_get_pos(pos); |
7 | 517 if (has_mbyte) |
518 return (*mb_ptr2char)(ptr); | |
519 return (int)*ptr; | |
520 } | |
521 | |
522 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
523 gchar_cursor(void) |
7 | 524 { |
525 if (has_mbyte) | |
526 return (*mb_ptr2char)(ml_get_cursor()); | |
527 return (int)*ml_get_cursor(); | |
528 } | |
529 | |
530 /* | |
531 * Write a character at the current cursor position. | |
532 * It is directly written into the block. | |
533 */ | |
534 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
535 pchar_cursor(int c) |
7 | 536 { |
537 *(ml_get_buf(curbuf, curwin->w_cursor.lnum, TRUE) | |
538 + curwin->w_cursor.col) = c; | |
539 } | |
540 | |
541 /* | |
542 * Skip to next part of an option argument: Skip space and comma. | |
543 */ | |
544 char_u * | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
545 skip_to_option_part(char_u *p) |
7 | 546 { |
547 if (*p == ',') | |
548 ++p; | |
549 while (*p == ' ') | |
550 ++p; | |
551 return p; | |
552 } | |
553 | |
554 /* | |
555 * check_status: called when the status bars for the buffer 'buf' | |
556 * need to be updated | |
557 */ | |
558 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
559 check_status(buf_T *buf) |
7 | 560 { |
561 win_T *wp; | |
562 | |
9649
fd9727ae3c49
commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents:
9536
diff
changeset
|
563 FOR_ALL_WINDOWS(wp) |
7 | 564 if (wp->w_buffer == buf && wp->w_status_height) |
565 { | |
566 wp->w_redr_status = TRUE; | |
567 if (must_redraw < VALID) | |
568 must_redraw = VALID; | |
569 } | |
570 } | |
571 | |
572 /* | |
573 * Ask for a reply from the user, a 'y' or a 'n'. | |
574 * No other characters are accepted, the message is repeated until a valid | |
575 * reply is entered or CTRL-C is hit. | |
576 * If direct is TRUE, don't use vgetc() but ui_inchar(), don't get characters | |
577 * from any buffers but directly from the user. | |
578 * | |
579 * return the 'y' or 'n' | |
580 */ | |
581 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
582 ask_yesno(char_u *str, int direct) |
7 | 583 { |
584 int r = ' '; | |
585 int save_State = State; | |
586 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
587 if (exiting) // put terminal in raw mode for this question |
7 | 588 settmode(TMODE_RAW); |
589 ++no_wait_return; | |
590 #ifdef USE_ON_FLY_SCROLL | |
18135
1868ec23360e
patch 8.1.2062: the mouse code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
18104
diff
changeset
|
591 dont_scroll = TRUE; // disallow scrolling here |
7 | 592 #endif |
18135
1868ec23360e
patch 8.1.2062: the mouse code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
18104
diff
changeset
|
593 State = CONFIRM; // mouse behaves like with :confirm |
1868ec23360e
patch 8.1.2062: the mouse code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
18104
diff
changeset
|
594 setmouse(); // disables mouse for xterm |
7 | 595 ++no_mapping; |
18135
1868ec23360e
patch 8.1.2062: the mouse code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
18104
diff
changeset
|
596 ++allow_keys; // no mapping here, but recognize keys |
7 | 597 |
598 while (r != 'y' && r != 'n') | |
599 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
600 // same highlighting as for wait_return |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15420
diff
changeset
|
601 smsg_attr(HL_ATTR(HLF_R), "%s (y/n)?", str); |
7 | 602 if (direct) |
603 r = get_keystroke(); | |
604 else | |
1474 | 605 r = plain_vgetc(); |
7 | 606 if (r == Ctrl_C || r == ESC) |
607 r = 'n'; | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
608 msg_putchar(r); // show what you typed |
7 | 609 out_flush(); |
610 } | |
611 --no_wait_return; | |
612 State = save_State; | |
613 setmouse(); | |
614 --no_mapping; | |
615 --allow_keys; | |
616 | |
617 return r; | |
618 } | |
619 | |
18104
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
620 #if defined(FEAT_EVAL) || defined(PROTO) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
621 |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
622 /* |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
623 * "mode()" function |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
624 */ |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
625 void |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
626 f_mode(typval_T *argvars, typval_T *rettv) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
627 { |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
628 char_u buf[4]; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
629 |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
630 vim_memset(buf, 0, sizeof(buf)); |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
631 |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
632 if (time_for_testing == 93784) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
633 { |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
634 // Testing the two-character code. |
18104
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
635 buf[0] = 'x'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
636 buf[1] = '!'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
637 } |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
638 #ifdef FEAT_TERMINAL |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
639 else if (term_use_loop()) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
640 buf[0] = 't'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
641 #endif |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
642 else if (VIsual_active) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
643 { |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
644 if (VIsual_select) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
645 buf[0] = VIsual_mode + 's' - 'v'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
646 else |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
647 buf[0] = VIsual_mode; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
648 } |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
649 else if (State == HITRETURN || State == ASKMORE || State == SETWSIZE |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
650 || State == CONFIRM) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
651 { |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
652 buf[0] = 'r'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
653 if (State == ASKMORE) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
654 buf[1] = 'm'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
655 else if (State == CONFIRM) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
656 buf[1] = '?'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
657 } |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
658 else if (State == EXTERNCMD) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
659 buf[0] = '!'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
660 else if (State & INSERT) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
661 { |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
662 if (State & VREPLACE_FLAG) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
663 { |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
664 buf[0] = 'R'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
665 buf[1] = 'v'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
666 } |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
667 else |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
668 { |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
669 if (State & REPLACE_FLAG) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
670 buf[0] = 'R'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
671 else |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
672 buf[0] = 'i'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
673 if (ins_compl_active()) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
674 buf[1] = 'c'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
675 else if (ctrl_x_mode_not_defined_yet()) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
676 buf[1] = 'x'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
677 } |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
678 } |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
679 else if ((State & CMDLINE) || exmode_active) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
680 { |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
681 buf[0] = 'c'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
682 if (exmode_active == EXMODE_VIM) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
683 buf[1] = 'v'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
684 else if (exmode_active == EXMODE_NORMAL) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
685 buf[1] = 'e'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
686 } |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
687 else |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
688 { |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
689 buf[0] = 'n'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
690 if (finish_op) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
691 { |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
692 buf[1] = 'o'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
693 // to be able to detect force-linewise/blockwise/characterwise operations |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
694 buf[2] = motion_force; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
695 } |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
696 else if (restart_edit == 'I' || restart_edit == 'R' |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
697 || restart_edit == 'V') |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
698 { |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
699 buf[1] = 'i'; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
700 buf[2] = restart_edit; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
701 } |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
702 } |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
703 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
704 // Clear out the minor mode when the argument is not a non-zero number or |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
705 // non-empty string. |
18104
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
706 if (!non_zero_arg(&argvars[0])) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
707 buf[1] = NUL; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
708 |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
709 rettv->vval.v_string = vim_strsave(buf); |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
710 rettv->v_type = VAR_STRING; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
711 } |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
712 |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
713 static void |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
714 may_add_state_char(garray_T *gap, char_u *include, int c) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
715 { |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
716 if (include == NULL || vim_strchr(include, c) != NULL) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
717 ga_append(gap, c); |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
718 } |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
719 |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
720 /* |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
721 * "state()" function |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
722 */ |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
723 void |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
724 f_state(typval_T *argvars, typval_T *rettv) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
725 { |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
726 garray_T ga; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
727 char_u *include = NULL; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
728 int i; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
729 |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
730 ga_init2(&ga, 1, 20); |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
731 if (argvars[0].v_type != VAR_UNKNOWN) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
732 include = tv_get_string(&argvars[0]); |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
733 |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
734 if (!(stuff_empty() && typebuf.tb_len == 0 && scriptin[curscript] == NULL)) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
735 may_add_state_char(&ga, include, 'm'); |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
736 if (op_pending()) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
737 may_add_state_char(&ga, include, 'o'); |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
738 if (autocmd_busy) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
739 may_add_state_char(&ga, include, 'x'); |
18143
2416e1a887ca
patch 8.1.2066: no tests for state()
Bram Moolenaar <Bram@vim.org>
parents:
18135
diff
changeset
|
740 if (ins_compl_active()) |
18104
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
741 may_add_state_char(&ga, include, 'a'); |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
742 |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
743 # ifdef FEAT_JOB_CHANNEL |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
744 if (channel_in_blocking_wait()) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
745 may_add_state_char(&ga, include, 'w'); |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
746 # endif |
18135
1868ec23360e
patch 8.1.2062: the mouse code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
18104
diff
changeset
|
747 if (!get_was_safe_state()) |
1868ec23360e
patch 8.1.2062: the mouse code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
18104
diff
changeset
|
748 may_add_state_char(&ga, include, 'S'); |
18104
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
749 for (i = 0; i < get_callback_depth() && i < 3; ++i) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
750 may_add_state_char(&ga, include, 'c'); |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
751 if (msg_scrolled > 0) |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
752 may_add_state_char(&ga, include, 's'); |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
753 |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
754 rettv->v_type = VAR_STRING; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
755 rettv->vval.v_string = ga.ga_data; |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
756 } |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
757 |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
758 #endif // FEAT_EVAL |
e59ff7b5d7a7
patch 8.1.2047: cannot check the current state
Bram Moolenaar <Bram@vim.org>
parents:
18051
diff
changeset
|
759 |
7 | 760 /* |
761 * Get a key stroke directly from the user. | |
762 * Ignores mouse clicks and scrollbar events, except a click for the left | |
763 * button (used at the more prompt). | |
764 * Doesn't use vgetc(), because it syncs undo and eats mapped characters. | |
765 * Disadvantage: typeahead is ignored. | |
766 * Translates the interrupt character for unix to ESC. | |
767 */ | |
768 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
769 get_keystroke(void) |
7 | 770 { |
3328 | 771 char_u *buf = NULL; |
772 int buflen = 150; | |
773 int maxlen; | |
7 | 774 int len = 0; |
775 int n; | |
776 int save_mapped_ctrl_c = mapped_ctrl_c; | |
964 | 777 int waited = 0; |
7 | 778 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
779 mapped_ctrl_c = FALSE; // mappings are not used here |
7 | 780 for (;;) |
781 { | |
782 cursor_on(); | |
783 out_flush(); | |
784 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
785 // Leave some room for check_termcode() to insert a key code into (max |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
786 // 5 chars plus NUL). And fix_input_buffer() can triple the number of |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
787 // bytes. |
3328 | 788 maxlen = (buflen - 6 - len) / 3; |
789 if (buf == NULL) | |
790 buf = alloc(buflen); | |
791 else if (maxlen < 10) | |
792 { | |
6596 | 793 char_u *t_buf = buf; |
794 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
795 // Need some more space. This might happen when receiving a long |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
796 // escape sequence. |
3328 | 797 buflen += 100; |
798 buf = vim_realloc(buf, buflen); | |
6596 | 799 if (buf == NULL) |
800 vim_free(t_buf); | |
3328 | 801 maxlen = (buflen - 6 - len) / 3; |
802 } | |
803 if (buf == NULL) | |
804 { | |
805 do_outofmem_msg((long_u)buflen); | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
806 return ESC; // panic! |
3328 | 807 } |
808 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
809 // First time: blocking wait. Second time: wait up to 100ms for a |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
810 // terminal code to complete. |
3328 | 811 n = ui_inchar(buf + len, maxlen, len == 0 ? -1L : 100L, 0); |
7 | 812 if (n > 0) |
813 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
814 // Replace zero and CSI by a special key code. |
9896
7b39615c0db1
commit https://github.com/vim/vim/commit/6bff02eb530aa29aafa2cb5627399837be7a5dd5
Christian Brabandt <cb@256bit.org>
parents:
9649
diff
changeset
|
815 n = fix_input_buffer(buf + len, n); |
7 | 816 len += n; |
964 | 817 waited = 0; |
818 } | |
819 else if (len > 0) | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
820 ++waited; // keep track of the waiting time |
964 | 821 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
822 // Incomplete termcode and not timed out yet: get more characters |
3328 | 823 if ((n = check_termcode(1, buf, buflen, &len)) < 0 |
964 | 824 && (!p_ttimeout || waited * 100L < (p_ttm < 0 ? p_tm : p_ttm))) |
7 | 825 continue; |
964 | 826 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
827 if (n == KEYLEN_REMOVED) // key code removed |
2721 | 828 { |
2723 | 829 if (must_redraw != 0 && !need_wait_return && (State & CMDLINE) == 0) |
2721 | 830 { |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
831 // Redrawing was postponed, do it now. |
2721 | 832 update_screen(0); |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
833 setcursor(); // put cursor back where it belongs |
2721 | 834 } |
2672 | 835 continue; |
2721 | 836 } |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
837 if (n > 0) // found a termcode: adjust length |
7 | 838 len = n; |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
839 if (len == 0) // nothing typed yet |
7 | 840 continue; |
841 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
842 // Handle modifier and/or special key code. |
7 | 843 n = buf[0]; |
844 if (n == K_SPECIAL) | |
845 { | |
846 n = TO_SPECIAL(buf[1], buf[2]); | |
847 if (buf[1] == KS_MODIFIER | |
848 || n == K_IGNORE | |
4221 | 849 || (is_mouse_key(n) && n != K_LEFTMOUSE) |
850 #ifdef FEAT_GUI | |
7 | 851 || n == K_VER_SCROLLBAR |
852 || n == K_HOR_SCROLLBAR | |
853 #endif | |
854 ) | |
855 { | |
856 if (buf[1] == KS_MODIFIER) | |
857 mod_mask = buf[2]; | |
858 len -= 3; | |
859 if (len > 0) | |
860 mch_memmove(buf, buf + 3, (size_t)len); | |
861 continue; | |
862 } | |
828 | 863 break; |
7 | 864 } |
865 if (has_mbyte) | |
866 { | |
867 if (MB_BYTE2LEN(n) > len) | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
868 continue; // more bytes to get |
3328 | 869 buf[len >= buflen ? buflen - 1 : len] = NUL; |
7 | 870 n = (*mb_ptr2char)(buf); |
871 } | |
872 #ifdef UNIX | |
873 if (n == intr_char) | |
874 n = ESC; | |
875 #endif | |
876 break; | |
877 } | |
3328 | 878 vim_free(buf); |
7 | 879 |
880 mapped_ctrl_c = save_mapped_ctrl_c; | |
881 return n; | |
882 } | |
883 | |
884 /* | |
374 | 885 * Get a number from the user. |
886 * When "mouse_used" is not NULL allow using the mouse. | |
7 | 887 */ |
888 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
889 get_number( |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
890 int colon, // allow colon to abort |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
891 int *mouse_used) |
7 | 892 { |
893 int n = 0; | |
894 int c; | |
810 | 895 int typed = 0; |
7 | 896 |
374 | 897 if (mouse_used != NULL) |
898 *mouse_used = FALSE; | |
899 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
900 // When not printing messages, the user won't know what to type, return a |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
901 // zero (as if CR was hit). |
7 | 902 if (msg_silent != 0) |
903 return 0; | |
904 | |
905 #ifdef USE_ON_FLY_SCROLL | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
906 dont_scroll = TRUE; // disallow scrolling here |
7 | 907 #endif |
908 ++no_mapping; | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
909 ++allow_keys; // no mapping here, but recognize keys |
7 | 910 for (;;) |
911 { | |
912 windgoto(msg_row, msg_col); | |
913 c = safe_vgetc(); | |
914 if (VIM_ISDIGIT(c)) | |
915 { | |
916 n = n * 10 + c - '0'; | |
917 msg_putchar(c); | |
810 | 918 ++typed; |
7 | 919 } |
920 else if (c == K_DEL || c == K_KDEL || c == K_BS || c == Ctrl_H) | |
921 { | |
810 | 922 if (typed > 0) |
923 { | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15525
diff
changeset
|
924 msg_puts("\b \b"); |
810 | 925 --typed; |
926 } | |
7 | 927 n /= 10; |
928 } | |
374 | 929 else if (mouse_used != NULL && c == K_LEFTMOUSE) |
930 { | |
931 *mouse_used = TRUE; | |
932 n = mouse_row + 1; | |
933 break; | |
934 } | |
7 | 935 else if (n == 0 && c == ':' && colon) |
936 { | |
937 stuffcharReadbuff(':'); | |
938 if (!exmode_active) | |
939 cmdline_row = msg_row; | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
940 skip_redraw = TRUE; // skip redraw once |
7 | 941 do_redraw = FALSE; |
942 break; | |
943 } | |
944 else if (c == CAR || c == NL || c == Ctrl_C || c == ESC) | |
945 break; | |
946 } | |
947 --no_mapping; | |
948 --allow_keys; | |
949 return n; | |
950 } | |
951 | |
323 | 952 /* |
953 * Ask the user to enter a number. | |
374 | 954 * When "mouse_used" is not NULL allow using the mouse and in that case return |
955 * the line number. | |
323 | 956 */ |
957 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
958 prompt_for_number(int *mouse_used) |
323 | 959 { |
960 int i; | |
344 | 961 int save_cmdline_row; |
962 int save_State; | |
323 | 963 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
964 // When using ":silent" assume that <CR> was entered. |
375 | 965 if (mouse_used != NULL) |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15525
diff
changeset
|
966 msg_puts(_("Type number and <Enter> or click with mouse (empty cancels): ")); |
375 | 967 else |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15525
diff
changeset
|
968 msg_puts(_("Type number and <Enter> (empty cancels): ")); |
344 | 969 |
14629
100a44722322
patch 8.1.0328: inputlist() doesn't work with a timer
Christian Brabandt <cb@256bit.org>
parents:
14585
diff
changeset
|
970 // Set the state such that text can be selected/copied/pasted and we still |
100a44722322
patch 8.1.0328: inputlist() doesn't work with a timer
Christian Brabandt <cb@256bit.org>
parents:
14585
diff
changeset
|
971 // get mouse events. redraw_after_callback() will not redraw if cmdline_row |
100a44722322
patch 8.1.0328: inputlist() doesn't work with a timer
Christian Brabandt <cb@256bit.org>
parents:
14585
diff
changeset
|
972 // is zero. |
344 | 973 save_cmdline_row = cmdline_row; |
957 | 974 cmdline_row = 0; |
344 | 975 save_State = State; |
14629
100a44722322
patch 8.1.0328: inputlist() doesn't work with a timer
Christian Brabandt <cb@256bit.org>
parents:
14585
diff
changeset
|
976 State = CMDLINE; |
100a44722322
patch 8.1.0328: inputlist() doesn't work with a timer
Christian Brabandt <cb@256bit.org>
parents:
14585
diff
changeset
|
977 // May show different mouse shape. |
13768
bcef80912112
patch 8.0.1756: GUI: after prompting for a number the mouse shape is wrong
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
978 setmouse(); |
bcef80912112
patch 8.0.1756: GUI: after prompting for a number the mouse shape is wrong
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
979 |
374 | 980 i = get_number(TRUE, mouse_used); |
981 if (KeyTyped) | |
982 { | |
17018
b1263192461f
patch 8.1.1509: cmdline_row can become negative, causing a crash
Bram Moolenaar <Bram@vim.org>
parents:
16782
diff
changeset
|
983 // don't call wait_return() now |
b1263192461f
patch 8.1.1509: cmdline_row can become negative, causing a crash
Bram Moolenaar <Bram@vim.org>
parents:
16782
diff
changeset
|
984 if (msg_row > 0) |
b1263192461f
patch 8.1.1509: cmdline_row can become negative, causing a crash
Bram Moolenaar <Bram@vim.org>
parents:
16782
diff
changeset
|
985 cmdline_row = msg_row - 1; |
323 | 986 need_wait_return = FALSE; |
18528
6ad15a9b7c89
patch 8.1.2258: may get hit-enter prompt after entering a number
Bram Moolenaar <Bram@vim.org>
parents:
18463
diff
changeset
|
987 msg_didany = FALSE; |
6ad15a9b7c89
patch 8.1.2258: may get hit-enter prompt after entering a number
Bram Moolenaar <Bram@vim.org>
parents:
18463
diff
changeset
|
988 msg_didout = FALSE; |
323 | 989 } |
344 | 990 else |
991 cmdline_row = save_cmdline_row; | |
992 State = save_State; | |
14629
100a44722322
patch 8.1.0328: inputlist() doesn't work with a timer
Christian Brabandt <cb@256bit.org>
parents:
14585
diff
changeset
|
993 // May need to restore mouse shape. |
13768
bcef80912112
patch 8.0.1756: GUI: after prompting for a number the mouse shape is wrong
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
994 setmouse(); |
344 | 995 |
323 | 996 return i; |
997 } | |
998 | |
7 | 999 void |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1000 msgmore(long n) |
7 | 1001 { |
1002 long pn; | |
1003 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1004 if (global_busy // no messages now, wait until global is finished |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1005 || !messaging()) // 'lazyredraw' set, don't do messages now |
7 | 1006 return; |
1007 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1008 // We don't want to overwrite another important message, but do overwrite |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1009 // a previous "more lines" or "fewer lines" message, so that "5dd" and |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1010 // then "put" reports the last action. |
135 | 1011 if (keep_msg != NULL && !keep_msg_more) |
1012 return; | |
1013 | |
7 | 1014 if (n > 0) |
1015 pn = n; | |
1016 else | |
1017 pn = -n; | |
1018 | |
1019 if (pn > p_report) | |
1020 { | |
14585
c8f07e8b273e
patch 8.1.0306: plural messages are not translated properly
Christian Brabandt <cb@256bit.org>
parents:
14424
diff
changeset
|
1021 if (n > 0) |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15525
diff
changeset
|
1022 vim_snprintf(msg_buf, MSG_BUF_LEN, |
14585
c8f07e8b273e
patch 8.1.0306: plural messages are not translated properly
Christian Brabandt <cb@256bit.org>
parents:
14424
diff
changeset
|
1023 NGETTEXT("%ld more line", "%ld more lines", pn), pn); |
7 | 1024 else |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15525
diff
changeset
|
1025 vim_snprintf(msg_buf, MSG_BUF_LEN, |
14585
c8f07e8b273e
patch 8.1.0306: plural messages are not translated properly
Christian Brabandt <cb@256bit.org>
parents:
14424
diff
changeset
|
1026 NGETTEXT("%ld line less", "%ld fewer lines", pn), pn); |
7 | 1027 if (got_int) |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15525
diff
changeset
|
1028 vim_strcat((char_u *)msg_buf, (char_u *)_(" (Interrupted)"), |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15525
diff
changeset
|
1029 MSG_BUF_LEN); |
7 | 1030 if (msg(msg_buf)) |
1031 { | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15525
diff
changeset
|
1032 set_keep_msg((char_u *)msg_buf, 0); |
135 | 1033 keep_msg_more = TRUE; |
7 | 1034 } |
1035 } | |
1036 } | |
1037 | |
1038 /* | |
1039 * flush map and typeahead buffers and give a warning for an error | |
1040 */ | |
1041 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1042 beep_flush(void) |
7 | 1043 { |
1044 if (emsg_silent == 0) | |
1045 { | |
14909
c97b4b537572
patch 8.1.0466: autocmd test fails
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
1046 flush_buffers(FLUSH_MINIMAL); |
6949 | 1047 vim_beep(BO_ERROR); |
1048 } | |
1049 } | |
1050 | |
1051 /* | |
1052 * Give a warning for an error. | |
7 | 1053 */ |
1054 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1055 vim_beep( |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1056 unsigned val) // one of the BO_ values, e.g., BO_OPER |
7 | 1057 { |
13272
abaebba89fd4
patch 8.0.1510: cannot test if a command causes a beep
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1058 #ifdef FEAT_EVAL |
abaebba89fd4
patch 8.0.1510: cannot test if a command causes a beep
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1059 called_vim_beep = TRUE; |
abaebba89fd4
patch 8.0.1510: cannot test if a command causes a beep
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1060 #endif |
abaebba89fd4
patch 8.0.1510: cannot test if a command causes a beep
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1061 |
7 | 1062 if (emsg_silent == 0) |
1063 { | |
6949 | 1064 if (!((bo_flags & val) || (bo_flags & BO_ALL))) |
1065 { | |
11601
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1066 #ifdef ELAPSED_FUNC |
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1067 static int did_init = FALSE; |
15525
3ef31ce9d9f9
patch 8.1.0770: inconsistent use of ELAPSED_FUNC
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1068 static elapsed_T start_tv; |
11601
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1069 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1070 // Only beep once per half a second, otherwise a sequence of beeps |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1071 // would freeze Vim. |
11601
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1072 if (!did_init || ELAPSED_FUNC(start_tv) > 500) |
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1073 { |
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1074 did_init = TRUE; |
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1075 ELAPSED_INIT(start_tv); |
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1076 #endif |
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1077 if (p_vb |
7 | 1078 #ifdef FEAT_GUI |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1079 // While the GUI is starting up the termcap is set for |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1080 // the GUI but the output still goes to a terminal. |
11601
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1081 && !(gui.in_use && gui.starting) |
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1082 #endif |
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1083 ) |
13314
65c3e8259124
patch 8.0.1531: cannot use 24 bit colors in MS-Windows console
Christian Brabandt <cb@256bit.org>
parents:
13272
diff
changeset
|
1084 { |
11601
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1085 out_str_cf(T_VB); |
13314
65c3e8259124
patch 8.0.1531: cannot use 24 bit colors in MS-Windows console
Christian Brabandt <cb@256bit.org>
parents:
13272
diff
changeset
|
1086 #ifdef FEAT_VTP |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1087 // No restore color information, refresh the screen. |
13314
65c3e8259124
patch 8.0.1531: cannot use 24 bit colors in MS-Windows console
Christian Brabandt <cb@256bit.org>
parents:
13272
diff
changeset
|
1088 if (has_vtp_working() != 0 |
65c3e8259124
patch 8.0.1531: cannot use 24 bit colors in MS-Windows console
Christian Brabandt <cb@256bit.org>
parents:
13272
diff
changeset
|
1089 # ifdef FEAT_TERMGUICOLORS |
13823
d0d8125ba692
patch 8.0.1783: cannot use 256 colors in a MS-Windows console
Christian Brabandt <cb@256bit.org>
parents:
13772
diff
changeset
|
1090 && (p_tgc || (!p_tgc && t_colors >= 256)) |
13314
65c3e8259124
patch 8.0.1531: cannot use 24 bit colors in MS-Windows console
Christian Brabandt <cb@256bit.org>
parents:
13272
diff
changeset
|
1091 # endif |
65c3e8259124
patch 8.0.1531: cannot use 24 bit colors in MS-Windows console
Christian Brabandt <cb@256bit.org>
parents:
13272
diff
changeset
|
1092 ) |
65c3e8259124
patch 8.0.1531: cannot use 24 bit colors in MS-Windows console
Christian Brabandt <cb@256bit.org>
parents:
13272
diff
changeset
|
1093 { |
65c3e8259124
patch 8.0.1531: cannot use 24 bit colors in MS-Windows console
Christian Brabandt <cb@256bit.org>
parents:
13272
diff
changeset
|
1094 redraw_later(CLEAR); |
65c3e8259124
patch 8.0.1531: cannot use 24 bit colors in MS-Windows console
Christian Brabandt <cb@256bit.org>
parents:
13272
diff
changeset
|
1095 update_screen(0); |
65c3e8259124
patch 8.0.1531: cannot use 24 bit colors in MS-Windows console
Christian Brabandt <cb@256bit.org>
parents:
13272
diff
changeset
|
1096 redrawcmd(); |
65c3e8259124
patch 8.0.1531: cannot use 24 bit colors in MS-Windows console
Christian Brabandt <cb@256bit.org>
parents:
13272
diff
changeset
|
1097 } |
65c3e8259124
patch 8.0.1531: cannot use 24 bit colors in MS-Windows console
Christian Brabandt <cb@256bit.org>
parents:
13272
diff
changeset
|
1098 #endif |
65c3e8259124
patch 8.0.1531: cannot use 24 bit colors in MS-Windows console
Christian Brabandt <cb@256bit.org>
parents:
13272
diff
changeset
|
1099 } |
11601
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1100 else |
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1101 out_char(BELL); |
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1102 #ifdef ELAPSED_FUNC |
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1103 } |
0a5d405e2520
patch 8.0.0683: visual bell flashes too quickly
Christian Brabandt <cb@256bit.org>
parents:
11384
diff
changeset
|
1104 #endif |
7 | 1105 } |
169 | 1106 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1107 // When 'debug' contains "beep" produce a message. If we are sourcing |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1108 // a script or executing a function give the user a hint where the beep |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1109 // comes from. |
169 | 1110 if (vim_strchr(p_debug, 'e') != NULL) |
1111 { | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
1112 msg_source(HL_ATTR(HLF_W)); |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15525
diff
changeset
|
1113 msg_attr(_("Beep!"), HL_ATTR(HLF_W)); |
169 | 1114 } |
7 | 1115 } |
1116 } | |
1117 | |
1118 /* | |
1119 * To get the "real" home directory: | |
1120 * - get value of $HOME | |
1121 * For Unix: | |
1122 * - go to that directory | |
1123 * - do mch_dirname() to get the real name of that directory. | |
1124 * This also works with mounts and links. | |
1125 * Don't do this for MS-DOS, it will change the "current dir" for a drive. | |
15046
c1be7c8bb602
patch 8.1.0534: MS-Windows installer uses different $HOME than Vim
Bram Moolenaar <Bram@vim.org>
parents:
14909
diff
changeset
|
1126 * For Windows: |
c1be7c8bb602
patch 8.1.0534: MS-Windows installer uses different $HOME than Vim
Bram Moolenaar <Bram@vim.org>
parents:
14909
diff
changeset
|
1127 * This code is duplicated in init_homedir() in dosinst.c. Keep in sync! |
7 | 1128 */ |
1129 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1130 init_homedir(void) |
7 | 1131 { |
1132 char_u *var; | |
1133 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1134 // In case we are called a second time (when 'encoding' changes). |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13188
diff
changeset
|
1135 VIM_CLEAR(homedir); |
170 | 1136 |
7 | 1137 #ifdef VMS |
1138 var = mch_getenv((char_u *)"SYS$LOGIN"); | |
1139 #else | |
1140 var = mch_getenv((char_u *)"HOME"); | |
1141 #endif | |
1142 | |
15868
7fad90423bd2
patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15814
diff
changeset
|
1143 #ifdef MSWIN |
7 | 1144 /* |
12265
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1145 * Typically, $HOME is not defined on Windows, unless the user has |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1146 * specifically defined it for Vim's sake. However, on Windows NT |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1147 * platforms, $HOMEDRIVE and $HOMEPATH are automatically defined for |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1148 * each user. Try constructing $HOME from these. |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1149 */ |
12269
d2373927d76d
patch 8.0.1014: old compiler doesn't know uint32_t
Christian Brabandt <cb@256bit.org>
parents:
12265
diff
changeset
|
1150 if (var == NULL || *var == NUL) |
12265
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1151 { |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1152 char_u *homedrive, *homepath; |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1153 |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1154 homedrive = mch_getenv((char_u *)"HOMEDRIVE"); |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1155 homepath = mch_getenv((char_u *)"HOMEPATH"); |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1156 if (homepath == NULL || *homepath == NUL) |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1157 homepath = (char_u *)"\\"; |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1158 if (homedrive != NULL |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1159 && STRLEN(homedrive) + STRLEN(homepath) < MAXPATHL) |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1160 { |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1161 sprintf((char *)NameBuff, "%s%s", homedrive, homepath); |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1162 if (NameBuff[0] != NUL) |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1163 var = NameBuff; |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1164 } |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1165 } |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1166 |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1167 if (var == NULL) |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1168 var = mch_getenv((char_u *)"USERPROFILE"); |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1169 |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1170 /* |
7 | 1171 * Weird but true: $HOME may contain an indirect reference to another |
1172 * variable, esp. "%USERPROFILE%". Happens when $USERPROFILE isn't set | |
1173 * when $HOME is being set. | |
1174 */ | |
1175 if (var != NULL && *var == '%') | |
1176 { | |
1177 char_u *p; | |
1178 char_u *exp; | |
1179 | |
1180 p = vim_strchr(var + 1, '%'); | |
1181 if (p != NULL) | |
1182 { | |
419 | 1183 vim_strncpy(NameBuff, var + 1, p - (var + 1)); |
7 | 1184 exp = mch_getenv(NameBuff); |
1185 if (exp != NULL && *exp != NUL | |
1186 && STRLEN(exp) + STRLEN(p) < MAXPATHL) | |
1187 { | |
274 | 1188 vim_snprintf((char *)NameBuff, MAXPATHL, "%s%s", exp, p + 1); |
7 | 1189 var = NameBuff; |
12265
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1190 } |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1191 } |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1192 } |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1193 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1194 if (var != NULL && *var == NUL) // empty is same as not set |
12265
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1195 var = NULL; |
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1196 |
170 | 1197 if (enc_utf8 && var != NULL) |
1198 { | |
1199 int len; | |
2786 | 1200 char_u *pp = NULL; |
170 | 1201 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1202 // Convert from active codepage to UTF-8. Other conversions are |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1203 // not done, because they would fail for non-ASCII characters. |
835 | 1204 acp_to_enc(var, (int)STRLEN(var), &pp, &len); |
170 | 1205 if (pp != NULL) |
1206 { | |
1207 homedir = pp; | |
1208 return; | |
1209 } | |
1210 } | |
12265
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1211 |
7 | 1212 /* |
1213 * Default home dir is C:/ | |
1214 * Best assumption we can make in such a situation. | |
1215 */ | |
1216 if (var == NULL) | |
8080
b6cb94ad97a4
commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents:
7829
diff
changeset
|
1217 var = (char_u *)"C:/"; |
7 | 1218 #endif |
12265
03e4be2e3d53
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Christian Brabandt <cb@256bit.org>
parents:
12238
diff
changeset
|
1219 |
7 | 1220 if (var != NULL) |
1221 { | |
1222 #ifdef UNIX | |
1223 /* | |
1224 * Change to the directory and get the actual path. This resolves | |
1225 * links. Don't do it when we can't return. | |
1226 */ | |
1227 if (mch_dirname(NameBuff, MAXPATHL) == OK | |
1228 && mch_chdir((char *)NameBuff) == 0) | |
1229 { | |
1230 if (!mch_chdir((char *)var) && mch_dirname(IObuff, IOSIZE) == OK) | |
1231 var = IObuff; | |
1232 if (mch_chdir((char *)NameBuff) != 0) | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15420
diff
changeset
|
1233 emsg(_(e_prev_dir)); |
7 | 1234 } |
1235 #endif | |
1236 homedir = vim_strsave(var); | |
1237 } | |
1238 } | |
1239 | |
359 | 1240 #if defined(EXITFREE) || defined(PROTO) |
1241 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1242 free_homedir(void) |
359 | 1243 { |
1244 vim_free(homedir); | |
1245 } | |
3744 | 1246 |
1247 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1248 free_users(void) |
3744 | 1249 { |
1250 ga_clear_strings(&ga_users); | |
1251 } | |
359 | 1252 #endif |
1253 | |
7 | 1254 /* |
1408 | 1255 * Call expand_env() and store the result in an allocated string. |
1256 * This is not very memory efficient, this expects the result to be freed | |
1257 * again soon. | |
1258 */ | |
1259 char_u * | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1260 expand_env_save(char_u *src) |
1408 | 1261 { |
1262 return expand_env_save_opt(src, FALSE); | |
1263 } | |
1264 | |
1265 /* | |
1266 * Idem, but when "one" is TRUE handle the string as one file name, only | |
1267 * expand "~" at the start. | |
1268 */ | |
1269 char_u * | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1270 expand_env_save_opt(char_u *src, int one) |
1408 | 1271 { |
1272 char_u *p; | |
1273 | |
1274 p = alloc(MAXPATHL); | |
1275 if (p != NULL) | |
1276 expand_env_esc(src, p, MAXPATHL, FALSE, one, NULL); | |
1277 return p; | |
1278 } | |
1279 | |
1280 /* | |
7 | 1281 * Expand environment variable with path name. |
1282 * "~/" is also expanded, using $HOME. For Unix "~user/" is expanded. | |
1408 | 1283 * Skips over "\ ", "\~" and "\$" (not for Win32 though). |
7 | 1284 * If anything fails no expansion is done and dst equals src. |
1285 */ | |
1286 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1287 expand_env( |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1288 char_u *src, // input string e.g. "$HOME/vim.hlp" |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1289 char_u *dst, // where to put the result |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1290 int dstlen) // maximum length of the result |
7 | 1291 { |
1408 | 1292 expand_env_esc(src, dst, dstlen, FALSE, FALSE, NULL); |
7 | 1293 } |
1294 | |
1295 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1296 expand_env_esc( |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1297 char_u *srcp, // input string e.g. "$HOME/vim.hlp" |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1298 char_u *dst, // where to put the result |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1299 int dstlen, // maximum length of the result |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1300 int esc, // escape spaces in expanded variables |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1301 int one, // "srcp" is one file name |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1302 char_u *startstr) // start again after this (can be NULL) |
374 | 1303 { |
1304 char_u *src; | |
7 | 1305 char_u *tail; |
1306 int c; | |
1307 char_u *var; | |
1308 int copy_char; | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1309 int mustfree; // var was allocated, need to free it later |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1310 int at_start = TRUE; // at start of a name |
374 | 1311 int startstr_len = 0; |
1312 | |
1313 if (startstr != NULL) | |
835 | 1314 startstr_len = (int)STRLEN(startstr); |
374 | 1315 |
1316 src = skipwhite(srcp); | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1317 --dstlen; // leave one char space for "\," |
7 | 1318 while (*src && dstlen > 0) |
1319 { | |
7038
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1320 #ifdef FEAT_EVAL |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1321 // Skip over `=expr`. |
7038
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1322 if (src[0] == '`' && src[1] == '=') |
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1323 { |
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1324 size_t len; |
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1325 |
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1326 var = src; |
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1327 src += 2; |
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1328 (void)skip_expr(&src); |
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1329 if (*src == '`') |
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1330 ++src; |
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1331 len = src - var; |
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1332 if (len > (size_t)dstlen) |
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1333 len = dstlen; |
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1334 vim_strncpy(dst, var, len); |
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1335 dst += len; |
7066
094c8ccdc279
commit https://github.com/vim/vim/commit/5df1ed2de3fa9dcace996b9a0a4c9b3cea79cf1e
Christian Brabandt <cb@256bit.org>
parents:
7038
diff
changeset
|
1336 dstlen -= (int)len; |
7038
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1337 continue; |
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1338 } |
76042a56ab85
commit https://github.com/vim/vim/commit/be83b73ddb2ee8297037166d243f72e3423a3ce3
Christian Brabandt <cb@256bit.org>
parents:
7036
diff
changeset
|
1339 #endif |
7 | 1340 copy_char = TRUE; |
22 | 1341 if ((*src == '$' |
1342 #ifdef VMS | |
1343 && at_start | |
1344 #endif | |
1345 ) | |
8212
05b88224cea1
commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents:
8163
diff
changeset
|
1346 #if defined(MSWIN) |
7 | 1347 || *src == '%' |
1348 #endif | |
1349 || (*src == '~' && at_start)) | |
1350 { | |
1351 mustfree = FALSE; | |
1352 | |
1353 /* | |
1354 * The variable name is copied into dst temporarily, because it may | |
1355 * be a string in read-only memory and a NUL needs to be appended. | |
1356 */ | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1357 if (*src != '~') // environment var |
7 | 1358 { |
1359 tail = src + 1; | |
1360 var = dst; | |
1361 c = dstlen - 1; | |
1362 | |
1363 #ifdef UNIX | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1364 // Unix has ${var-name} type environment vars |
7 | 1365 if (*tail == '{' && !vim_isIDc('{')) |
1366 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1367 tail++; // ignore '{' |
7 | 1368 while (c-- > 0 && *tail && *tail != '}') |
1369 *var++ = *tail++; | |
1370 } | |
1371 else | |
1372 #endif | |
1373 { | |
1374 while (c-- > 0 && *tail != NUL && ((vim_isIDc(*tail)) | |
8212
05b88224cea1
commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents:
8163
diff
changeset
|
1375 #if defined(MSWIN) |
7 | 1376 || (*src == '%' && *tail != '%') |
1377 #endif | |
1378 )) | |
1379 *var++ = *tail++; | |
1380 } | |
1381 | |
8212
05b88224cea1
commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents:
8163
diff
changeset
|
1382 #if defined(MSWIN) || defined(UNIX) |
7 | 1383 # ifdef UNIX |
1384 if (src[1] == '{' && *tail != '}') | |
1385 # else | |
1386 if (*src == '%' && *tail != '%') | |
1387 # endif | |
1388 var = NULL; | |
1389 else | |
1390 { | |
1391 # ifdef UNIX | |
1392 if (src[1] == '{') | |
1393 # else | |
1394 if (*src == '%') | |
1395 #endif | |
1396 ++tail; | |
1397 #endif | |
1398 *var = NUL; | |
1399 var = vim_getenv(dst, &mustfree); | |
8212
05b88224cea1
commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents:
8163
diff
changeset
|
1400 #if defined(MSWIN) || defined(UNIX) |
7 | 1401 } |
1402 #endif | |
1403 } | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1404 // home directory |
7 | 1405 else if ( src[1] == NUL |
1406 || vim_ispathsep(src[1]) | |
1407 || vim_strchr((char_u *)" ,\t\n", src[1]) != NULL) | |
1408 { | |
1409 var = homedir; | |
1410 tail = src + 1; | |
1411 } | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1412 else // user directory |
7 | 1413 { |
1414 #if defined(UNIX) || (defined(VMS) && defined(USER_HOME)) | |
1415 /* | |
1416 * Copy ~user to dst[], so we can put a NUL after it. | |
1417 */ | |
1418 tail = src; | |
1419 var = dst; | |
1420 c = dstlen - 1; | |
1421 while ( c-- > 0 | |
1422 && *tail | |
1423 && vim_isfilec(*tail) | |
1424 && !vim_ispathsep(*tail)) | |
1425 *var++ = *tail++; | |
1426 *var = NUL; | |
1427 # ifdef UNIX | |
1428 /* | |
1429 * If the system supports getpwnam(), use it. | |
1430 * Otherwise, or if getpwnam() fails, the shell is used to | |
1431 * expand ~user. This is slower and may fail if the shell | |
1432 * does not support ~user (old versions of /bin/sh). | |
1433 */ | |
1434 # if defined(HAVE_GETPWNAM) && defined(HAVE_PWD_H) | |
1435 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1436 // Note: memory allocated by getpwnam() is never freed. |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1437 // Calling endpwent() apparently doesn't help. |
10932
141fe140976c
patch 8.0.0355: using uninitialized memory when 'isfname' is empty
Christian Brabandt <cb@256bit.org>
parents:
10889
diff
changeset
|
1438 struct passwd *pw = (*dst == NUL) |
141fe140976c
patch 8.0.0355: using uninitialized memory when 'isfname' is empty
Christian Brabandt <cb@256bit.org>
parents:
10889
diff
changeset
|
1439 ? NULL : getpwnam((char *)dst + 1); |
141fe140976c
patch 8.0.0355: using uninitialized memory when 'isfname' is empty
Christian Brabandt <cb@256bit.org>
parents:
10889
diff
changeset
|
1440 |
141fe140976c
patch 8.0.0355: using uninitialized memory when 'isfname' is empty
Christian Brabandt <cb@256bit.org>
parents:
10889
diff
changeset
|
1441 var = (pw == NULL) ? NULL : (char_u *)pw->pw_dir; |
7 | 1442 } |
1443 if (var == NULL) | |
1444 # endif | |
1445 { | |
1446 expand_T xpc; | |
1447 | |
1448 ExpandInit(&xpc); | |
1449 xpc.xp_context = EXPAND_FILES; | |
1450 var = ExpandOne(&xpc, dst, NULL, | |
1451 WILD_ADD_SLASH|WILD_SILENT, WILD_EXPAND_FREE); | |
1452 mustfree = TRUE; | |
1453 } | |
1454 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1455 # else // !UNIX, thus VMS |
7 | 1456 /* |
1457 * USER_HOME is a comma-separated list of | |
1458 * directories to search for the user account in. | |
1459 */ | |
1460 { | |
1461 char_u test[MAXPATHL], paths[MAXPATHL]; | |
1462 char_u *path, *next_path, *ptr; | |
9387
f094d4085014
commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents:
9225
diff
changeset
|
1463 stat_T st; |
7 | 1464 |
1465 STRCPY(paths, USER_HOME); | |
1466 next_path = paths; | |
1467 while (*next_path) | |
1468 { | |
1469 for (path = next_path; *next_path && *next_path != ','; | |
1470 next_path++); | |
1471 if (*next_path) | |
1472 *next_path++ = NUL; | |
1473 STRCPY(test, path); | |
1474 STRCAT(test, "/"); | |
1475 STRCAT(test, dst + 1); | |
1476 if (mch_stat(test, &st) == 0) | |
1477 { | |
1478 var = alloc(STRLEN(test) + 1); | |
1479 STRCPY(var, test); | |
1480 mustfree = TRUE; | |
1481 break; | |
1482 } | |
1483 } | |
1484 } | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1485 # endif // UNIX |
7 | 1486 #else |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1487 // cannot expand user's home directory, so don't try |
7 | 1488 var = NULL; |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1489 tail = (char_u *)""; // for gcc |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1490 #endif // UNIX || VMS |
7 | 1491 } |
1492 | |
1493 #ifdef BACKSLASH_IN_FILENAME | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1494 // If 'shellslash' is set change backslashes to forward slashes. |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1495 // Can't use slash_adjust(), p_ssl may be set temporarily. |
7 | 1496 if (p_ssl && var != NULL && vim_strchr(var, '\\') != NULL) |
1497 { | |
1498 char_u *p = vim_strsave(var); | |
1499 | |
1500 if (p != NULL) | |
1501 { | |
1502 if (mustfree) | |
1503 vim_free(var); | |
1504 var = p; | |
1505 mustfree = TRUE; | |
1506 forward_slash(var); | |
1507 } | |
1508 } | |
1509 #endif | |
1510 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1511 // If "var" contains white space, escape it with a backslash. |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1512 // Required for ":e ~/tt" when $HOME includes a space. |
7 | 1513 if (esc && var != NULL && vim_strpbrk(var, (char_u *)" \t") != NULL) |
1514 { | |
1515 char_u *p = vim_strsave_escaped(var, (char_u *)" \t"); | |
1516 | |
1517 if (p != NULL) | |
1518 { | |
1519 if (mustfree) | |
1520 vim_free(var); | |
1521 var = p; | |
1522 mustfree = TRUE; | |
1523 } | |
1524 } | |
1525 | |
1526 if (var != NULL && *var != NUL | |
1527 && (STRLEN(var) + STRLEN(tail) + 1 < (unsigned)dstlen)) | |
1528 { | |
1529 STRCPY(dst, var); | |
1530 dstlen -= (int)STRLEN(var); | |
835 | 1531 c = (int)STRLEN(var); |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1532 // if var[] ends in a path separator and tail[] starts |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1533 // with it, skip a character |
39 | 1534 if (*var != NUL && after_pathsep(dst, dst + c) |
7 | 1535 #if defined(BACKSLASH_IN_FILENAME) || defined(AMIGA) |
1536 && dst[-1] != ':' | |
1537 #endif | |
1538 && vim_ispathsep(*tail)) | |
1539 ++tail; | |
39 | 1540 dst += c; |
7 | 1541 src = tail; |
1542 copy_char = FALSE; | |
1543 } | |
1544 if (mustfree) | |
1545 vim_free(var); | |
1546 } | |
1547 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1548 if (copy_char) // copy at least one char |
7 | 1549 { |
1550 /* | |
1224 | 1551 * Recognize the start of a new name, for '~'. |
1408 | 1552 * Don't do this when "one" is TRUE, to avoid expanding "~" in |
1553 * ":edit foo ~ foo". | |
7 | 1554 */ |
1555 at_start = FALSE; | |
1556 if (src[0] == '\\' && src[1] != NUL) | |
1557 { | |
1558 *dst++ = *src++; | |
1559 --dstlen; | |
1560 } | |
1408 | 1561 else if ((src[0] == ' ' || src[0] == ',') && !one) |
7 | 1562 at_start = TRUE; |
12005
0496ea4c5c2e
patch 8.0.0883: invalid memory access with nonsensical script
Christian Brabandt <cb@256bit.org>
parents:
11989
diff
changeset
|
1563 if (dstlen > 0) |
0496ea4c5c2e
patch 8.0.0883: invalid memory access with nonsensical script
Christian Brabandt <cb@256bit.org>
parents:
11989
diff
changeset
|
1564 { |
0496ea4c5c2e
patch 8.0.0883: invalid memory access with nonsensical script
Christian Brabandt <cb@256bit.org>
parents:
11989
diff
changeset
|
1565 *dst++ = *src++; |
0496ea4c5c2e
patch 8.0.0883: invalid memory access with nonsensical script
Christian Brabandt <cb@256bit.org>
parents:
11989
diff
changeset
|
1566 --dstlen; |
0496ea4c5c2e
patch 8.0.0883: invalid memory access with nonsensical script
Christian Brabandt <cb@256bit.org>
parents:
11989
diff
changeset
|
1567 |
0496ea4c5c2e
patch 8.0.0883: invalid memory access with nonsensical script
Christian Brabandt <cb@256bit.org>
parents:
11989
diff
changeset
|
1568 if (startstr != NULL && src - startstr_len >= srcp |
0496ea4c5c2e
patch 8.0.0883: invalid memory access with nonsensical script
Christian Brabandt <cb@256bit.org>
parents:
11989
diff
changeset
|
1569 && STRNCMP(src - startstr_len, startstr, |
0496ea4c5c2e
patch 8.0.0883: invalid memory access with nonsensical script
Christian Brabandt <cb@256bit.org>
parents:
11989
diff
changeset
|
1570 startstr_len) == 0) |
0496ea4c5c2e
patch 8.0.0883: invalid memory access with nonsensical script
Christian Brabandt <cb@256bit.org>
parents:
11989
diff
changeset
|
1571 at_start = TRUE; |
0496ea4c5c2e
patch 8.0.0883: invalid memory access with nonsensical script
Christian Brabandt <cb@256bit.org>
parents:
11989
diff
changeset
|
1572 } |
0496ea4c5c2e
patch 8.0.0883: invalid memory access with nonsensical script
Christian Brabandt <cb@256bit.org>
parents:
11989
diff
changeset
|
1573 } |
0496ea4c5c2e
patch 8.0.0883: invalid memory access with nonsensical script
Christian Brabandt <cb@256bit.org>
parents:
11989
diff
changeset
|
1574 |
7 | 1575 } |
1576 *dst = NUL; | |
1577 } | |
1578 | |
1579 /* | |
17978
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1580 * If the string between "p" and "pend" ends in "name/", return "pend" minus |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1581 * the length of "name/". Otherwise return "pend". |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1582 */ |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1583 static char_u * |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1584 remove_tail(char_u *p, char_u *pend, char_u *name) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1585 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1586 int len = (int)STRLEN(name) + 1; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1587 char_u *newend = pend - len; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1588 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1589 if (newend >= p |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1590 && fnamencmp(newend, name, len - 1) == 0 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1591 && (newend == p || after_pathsep(p, newend))) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1592 return newend; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1593 return pend; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1594 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1595 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1596 /* |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1597 * Check if the directory "vimdir/<version>" or "vimdir/runtime" exists. |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1598 * Return NULL if not, return its name in allocated memory otherwise. |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1599 */ |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1600 static char_u * |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1601 vim_version_dir(char_u *vimdir) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1602 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1603 char_u *p; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1604 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1605 if (vimdir == NULL || *vimdir == NUL) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1606 return NULL; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1607 p = concat_fnames(vimdir, (char_u *)VIM_VERSION_NODOT, TRUE); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1608 if (p != NULL && mch_isdir(p)) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1609 return p; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1610 vim_free(p); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1611 p = concat_fnames(vimdir, (char_u *)RUNTIME_DIRNAME, TRUE); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1612 if (p != NULL && mch_isdir(p)) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1613 return p; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1614 vim_free(p); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1615 return NULL; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1616 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1617 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
1618 /* |
7 | 1619 * Vim's version of getenv(). |
1620 * Special handling of $HOME, $VIM and $VIMRUNTIME. | |
196 | 1621 * Also does ACP to 'enc' conversion for Win32. |
2786 | 1622 * "mustfree" is set to TRUE when returned is allocated, it must be |
1623 * initialized to FALSE by the caller. | |
7 | 1624 */ |
1625 char_u * | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1626 vim_getenv(char_u *name, int *mustfree) |
7 | 1627 { |
16172
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1628 char_u *p = NULL; |
7 | 1629 char_u *pend; |
1630 int vimruntime; | |
16172
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1631 #ifdef MSWIN |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1632 WCHAR *wn, *wp; |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1633 |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1634 // use "C:/" when $HOME is not set |
7 | 1635 if (STRCMP(name, "HOME") == 0) |
1636 return homedir; | |
16172
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1637 |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1638 // Use Wide function |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1639 wn = enc_to_utf16(name, NULL); |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1640 if (wn == NULL) |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1641 return NULL; |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1642 |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1643 wp = _wgetenv(wn); |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1644 vim_free(wn); |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1645 |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1646 if (wp != NULL && *wp == NUL) // empty is the same as not set |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1647 wp = NULL; |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1648 |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1649 if (wp != NULL) |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1650 { |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1651 p = utf16_to_enc(wp, NULL); |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1652 if (p == NULL) |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1653 return NULL; |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1654 |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1655 *mustfree = TRUE; |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1656 return p; |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1657 } |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1658 #else |
7 | 1659 p = mch_getenv(name); |
16172
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1660 if (p != NULL && *p == NUL) // empty is the same as not set |
7 | 1661 p = NULL; |
1662 | |
1663 if (p != NULL) | |
1664 return p; | |
16172
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1665 #endif |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1666 |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1667 // handling $VIMRUNTIME and $VIM is below, bail out if it's another name. |
7 | 1668 vimruntime = (STRCMP(name, "VIMRUNTIME") == 0); |
1669 if (!vimruntime && STRCMP(name, "VIM") != 0) | |
1670 return NULL; | |
1671 | |
1672 /* | |
1673 * When expanding $VIMRUNTIME fails, try using $VIM/vim<version> or $VIM. | |
1674 * Don't do this when default_vimruntime_dir is non-empty. | |
1675 */ | |
1676 if (vimruntime | |
1677 #ifdef HAVE_PATHDEF | |
1678 && *default_vimruntime_dir == NUL | |
1679 #endif | |
1680 ) | |
1681 { | |
16172
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1682 #ifdef MSWIN |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1683 // Use Wide function |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1684 wp = _wgetenv(L"VIM"); |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1685 if (wp != NULL && *wp == NUL) // empty is the same as not set |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1686 wp = NULL; |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1687 if (wp != NULL) |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1688 { |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1689 char_u *q = utf16_to_enc(wp, NULL); |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1690 if (q != NULL) |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1691 { |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1692 p = vim_version_dir(q); |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1693 *mustfree = TRUE; |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1694 if (p == NULL) |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1695 p = q; |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1696 } |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1697 } |
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1698 #else |
7 | 1699 p = mch_getenv((char_u *)"VIM"); |
16172
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1700 if (p != NULL && *p == NUL) // empty is the same as not set |
7 | 1701 p = NULL; |
1702 if (p != NULL) | |
1703 { | |
1704 p = vim_version_dir(p); | |
1705 if (p != NULL) | |
1706 *mustfree = TRUE; | |
1707 else | |
1708 p = mch_getenv((char_u *)"VIM"); | |
1709 } | |
16172
6b0836727cf3
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var
Bram Moolenaar <Bram@vim.org>
parents:
16162
diff
changeset
|
1710 #endif |
7 | 1711 } |
1712 | |
1713 /* | |
1714 * When expanding $VIM or $VIMRUNTIME fails, try using: | |
1715 * - the directory name from 'helpfile' (unless it contains '$') | |
1716 * - the executable name from argv[0] | |
1717 */ | |
1718 if (p == NULL) | |
1719 { | |
1720 if (p_hf != NULL && vim_strchr(p_hf, '$') == NULL) | |
1721 p = p_hf; | |
1722 #ifdef USE_EXE_NAME | |
1723 /* | |
1724 * Use the name of the executable, obtained from argv[0]. | |
1725 */ | |
1726 else | |
1727 p = exe_name; | |
1728 #endif | |
1729 if (p != NULL) | |
1730 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1731 // remove the file name |
7 | 1732 pend = gettail(p); |
1733 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1734 // remove "doc/" from 'helpfile', if present |
7 | 1735 if (p == p_hf) |
1736 pend = remove_tail(p, pend, (char_u *)"doc"); | |
1737 | |
1738 #ifdef USE_EXE_NAME | |
1739 # ifdef MACOS_X | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1740 // remove "MacOS" from exe_name and add "Resources/vim" |
7 | 1741 if (p == exe_name) |
1742 { | |
1743 char_u *pend1; | |
768 | 1744 char_u *pnew; |
1745 | |
1746 pend1 = remove_tail(p, pend, (char_u *)"MacOS"); | |
1747 if (pend1 != pend) | |
1748 { | |
16764
ef00b6bc186b
patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents:
16738
diff
changeset
|
1749 pnew = alloc(pend1 - p + 15); |
768 | 1750 if (pnew != NULL) |
1751 { | |
1752 STRNCPY(pnew, p, (pend1 - p)); | |
1753 STRCPY(pnew + (pend1 - p), "Resources/vim"); | |
1754 p = pnew; | |
1755 pend = p + STRLEN(p); | |
1756 } | |
1757 } | |
7 | 1758 } |
1759 # endif | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1760 // remove "src/" from exe_name, if present |
7 | 1761 if (p == exe_name) |
1762 pend = remove_tail(p, pend, (char_u *)"src"); | |
1763 #endif | |
1764 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1765 // for $VIM, remove "runtime/" or "vim54/", if present |
7 | 1766 if (!vimruntime) |
1767 { | |
1768 pend = remove_tail(p, pend, (char_u *)RUNTIME_DIRNAME); | |
1769 pend = remove_tail(p, pend, (char_u *)VIM_VERSION_NODOT); | |
1770 } | |
1771 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1772 // remove trailing path separator |
39 | 1773 if (pend > p && after_pathsep(p, pend)) |
7 | 1774 --pend; |
1775 | |
768 | 1776 #ifdef MACOS_X |
1777 if (p == exe_name || p == p_hf) | |
1778 #endif | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1779 // check that the result is a directory name |
768 | 1780 p = vim_strnsave(p, (int)(pend - p)); |
7 | 1781 |
1782 if (p != NULL && !mch_isdir(p)) | |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13188
diff
changeset
|
1783 VIM_CLEAR(p); |
7 | 1784 else |
1785 { | |
1786 #ifdef USE_EXE_NAME | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1787 // may add "/vim54" or "/runtime" if it exists |
7 | 1788 if (vimruntime && (pend = vim_version_dir(p)) != NULL) |
1789 { | |
1790 vim_free(p); | |
1791 p = pend; | |
1792 } | |
1793 #endif | |
1794 *mustfree = TRUE; | |
1795 } | |
1796 } | |
1797 } | |
1798 | |
1799 #ifdef HAVE_PATHDEF | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1800 // When there is a pathdef.c file we can use default_vim_dir and |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1801 // default_vimruntime_dir |
7 | 1802 if (p == NULL) |
1803 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1804 // Only use default_vimruntime_dir when it is not empty |
7 | 1805 if (vimruntime && *default_vimruntime_dir != NUL) |
1806 { | |
1807 p = default_vimruntime_dir; | |
1808 *mustfree = FALSE; | |
1809 } | |
1810 else if (*default_vim_dir != NUL) | |
1811 { | |
1812 if (vimruntime && (p = vim_version_dir(default_vim_dir)) != NULL) | |
1813 *mustfree = TRUE; | |
1814 else | |
1815 { | |
1816 p = default_vim_dir; | |
1817 *mustfree = FALSE; | |
1818 } | |
1819 } | |
1820 } | |
1821 #endif | |
1822 | |
1823 /* | |
1824 * Set the environment variable, so that the new value can be found fast | |
1825 * next time, and others can also use it (e.g. Perl). | |
1826 */ | |
1827 if (p != NULL) | |
1828 { | |
1829 if (vimruntime) | |
1830 { | |
1831 vim_setenv((char_u *)"VIMRUNTIME", p); | |
1832 didset_vimruntime = TRUE; | |
1833 } | |
1834 else | |
1835 { | |
1836 vim_setenv((char_u *)"VIM", p); | |
1837 didset_vim = TRUE; | |
1838 } | |
1839 } | |
1840 return p; | |
1841 } | |
1842 | |
15555
d89c5b339c2a
patch 8.1.0785: depending on the configuration some functions are unused
Bram Moolenaar <Bram@vim.org>
parents:
15543
diff
changeset
|
1843 #if defined(FEAT_EVAL) || defined(PROTO) |
13923
e4d5726e1678
patch 8.0.1832: cannot use :unlet for an environment variable
Christian Brabandt <cb@256bit.org>
parents:
13823
diff
changeset
|
1844 void |
e4d5726e1678
patch 8.0.1832: cannot use :unlet for an environment variable
Christian Brabandt <cb@256bit.org>
parents:
13823
diff
changeset
|
1845 vim_unsetenv(char_u *var) |
e4d5726e1678
patch 8.0.1832: cannot use :unlet for an environment variable
Christian Brabandt <cb@256bit.org>
parents:
13823
diff
changeset
|
1846 { |
e4d5726e1678
patch 8.0.1832: cannot use :unlet for an environment variable
Christian Brabandt <cb@256bit.org>
parents:
13823
diff
changeset
|
1847 #ifdef HAVE_UNSETENV |
e4d5726e1678
patch 8.0.1832: cannot use :unlet for an environment variable
Christian Brabandt <cb@256bit.org>
parents:
13823
diff
changeset
|
1848 unsetenv((char *)var); |
e4d5726e1678
patch 8.0.1832: cannot use :unlet for an environment variable
Christian Brabandt <cb@256bit.org>
parents:
13823
diff
changeset
|
1849 #else |
13942
a039c93f5ff7
patch 8.0.1841: HP-UX does not have setenv()
Christian Brabandt <cb@256bit.org>
parents:
13923
diff
changeset
|
1850 vim_setenv(var, (char_u *)""); |
13923
e4d5726e1678
patch 8.0.1832: cannot use :unlet for an environment variable
Christian Brabandt <cb@256bit.org>
parents:
13823
diff
changeset
|
1851 #endif |
e4d5726e1678
patch 8.0.1832: cannot use :unlet for an environment variable
Christian Brabandt <cb@256bit.org>
parents:
13823
diff
changeset
|
1852 } |
15555
d89c5b339c2a
patch 8.1.0785: depending on the configuration some functions are unused
Bram Moolenaar <Bram@vim.org>
parents:
15543
diff
changeset
|
1853 #endif |
13923
e4d5726e1678
patch 8.0.1832: cannot use :unlet for an environment variable
Christian Brabandt <cb@256bit.org>
parents:
13823
diff
changeset
|
1854 |
e4d5726e1678
patch 8.0.1832: cannot use :unlet for an environment variable
Christian Brabandt <cb@256bit.org>
parents:
13823
diff
changeset
|
1855 |
7 | 1856 /* |
1857 * Our portable version of setenv. | |
1858 */ | |
1859 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1860 vim_setenv(char_u *name, char_u *val) |
7 | 1861 { |
1862 #ifdef HAVE_SETENV | |
1863 mch_setenv((char *)name, (char *)val, 1); | |
1864 #else | |
1865 char_u *envbuf; | |
1866 | |
1867 /* | |
1868 * Putenv does not copy the string, it has to remain | |
1869 * valid. The allocated memory will never be freed. | |
1870 */ | |
16764
ef00b6bc186b
patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents:
16738
diff
changeset
|
1871 envbuf = alloc(STRLEN(name) + STRLEN(val) + 2); |
7 | 1872 if (envbuf != NULL) |
1873 { | |
1874 sprintf((char *)envbuf, "%s=%s", name, val); | |
1875 putenv((char *)envbuf); | |
1876 } | |
1877 #endif | |
3382 | 1878 #ifdef FEAT_GETTEXT |
1879 /* | |
1880 * When setting $VIMRUNTIME adjust the directory to find message | |
1881 * translations to $VIMRUNTIME/lang. | |
1882 */ | |
1883 if (*val != NUL && STRICMP(name, "VIMRUNTIME") == 0) | |
1884 { | |
1885 char_u *buf = concat_str(val, (char_u *)"/lang"); | |
1886 | |
1887 if (buf != NULL) | |
1888 { | |
1889 bindtextdomain(VIMPACKAGE, (char *)buf); | |
1890 vim_free(buf); | |
1891 } | |
1892 } | |
1893 #endif | |
7 | 1894 } |
1895 | |
1896 /* | |
1897 * Function given to ExpandGeneric() to obtain an environment variable name. | |
1898 */ | |
1899 char_u * | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1900 get_env_name( |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1901 expand_T *xp UNUSED, |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1902 int idx) |
7 | 1903 { |
12716
351cf7c67bbe
patch 8.0.1236: Mac features are confusing
Christian Brabandt <cb@256bit.org>
parents:
12690
diff
changeset
|
1904 # if defined(AMIGA) |
7 | 1905 /* |
12716
351cf7c67bbe
patch 8.0.1236: Mac features are confusing
Christian Brabandt <cb@256bit.org>
parents:
12690
diff
changeset
|
1906 * No environ[] on the Amiga. |
7 | 1907 */ |
1908 return NULL; | |
1909 # else | |
1910 # ifndef __WIN32__ | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
1911 // Borland C++ 5.2 has this in a header file. |
7 | 1912 extern char **environ; |
1913 # endif | |
17 | 1914 # define ENVNAMELEN 100 |
1915 static char_u name[ENVNAMELEN]; | |
7 | 1916 char_u *str; |
1917 int n; | |
1918 | |
1919 str = (char_u *)environ[idx]; | |
1920 if (str == NULL) | |
1921 return NULL; | |
1922 | |
17 | 1923 for (n = 0; n < ENVNAMELEN - 1; ++n) |
7 | 1924 { |
1925 if (str[n] == '=' || str[n] == NUL) | |
1926 break; | |
1927 name[n] = str[n]; | |
1928 } | |
1929 name[n] = NUL; | |
1930 return name; | |
1931 # endif | |
1932 } | |
3744 | 1933 |
1934 /* | |
14698
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1935 * Add a user name to the list of users in ga_users. |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1936 * Do nothing if user name is NULL or empty. |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1937 */ |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1938 static void |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1939 add_user(char_u *user, int need_copy) |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1940 { |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1941 char_u *user_copy = (user != NULL && need_copy) |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1942 ? vim_strsave(user) : user; |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1943 |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1944 if (user_copy == NULL || *user_copy == NUL || ga_grow(&ga_users, 1) == FAIL) |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1945 { |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1946 if (need_copy) |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1947 vim_free(user); |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1948 return; |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1949 } |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1950 ((char_u **)(ga_users.ga_data))[ga_users.ga_len++] = user_copy; |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1951 } |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1952 |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1953 /* |
3744 | 1954 * Find all user names for user completion. |
1955 * Done only once and then cached. | |
1956 */ | |
1957 static void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1958 init_users(void) |
4938
bcb84438bb5b
updated for version 7.3.1214
Bram Moolenaar <bram@vim.org>
parents:
4805
diff
changeset
|
1959 { |
3744 | 1960 static int lazy_init_done = FALSE; |
1961 | |
1962 if (lazy_init_done) | |
1963 return; | |
1964 | |
1965 lazy_init_done = TRUE; | |
1966 ga_init2(&ga_users, sizeof(char_u *), 20); | |
1967 | |
1968 # if defined(HAVE_GETPWENT) && defined(HAVE_PWD_H) | |
1969 { | |
1970 struct passwd* pw; | |
1971 | |
1972 setpwent(); | |
1973 while ((pw = getpwent()) != NULL) | |
14698
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1974 add_user((char_u *)pw->pw_name, TRUE); |
3744 | 1975 endpwent(); |
1976 } | |
15868
7fad90423bd2
patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15814
diff
changeset
|
1977 # elif defined(MSWIN) |
14133
352c2832d17f
patch 8.1.0084: user name completion does not work on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13942
diff
changeset
|
1978 { |
352c2832d17f
patch 8.1.0084: user name completion does not work on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13942
diff
changeset
|
1979 DWORD nusers = 0, ntotal = 0, i; |
352c2832d17f
patch 8.1.0084: user name completion does not work on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13942
diff
changeset
|
1980 PUSER_INFO_0 uinfo; |
352c2832d17f
patch 8.1.0084: user name completion does not work on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13942
diff
changeset
|
1981 |
352c2832d17f
patch 8.1.0084: user name completion does not work on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13942
diff
changeset
|
1982 if (NetUserEnum(NULL, 0, 0, (LPBYTE *) &uinfo, MAX_PREFERRED_LENGTH, |
352c2832d17f
patch 8.1.0084: user name completion does not work on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13942
diff
changeset
|
1983 &nusers, &ntotal, NULL) == NERR_Success) |
352c2832d17f
patch 8.1.0084: user name completion does not work on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13942
diff
changeset
|
1984 { |
352c2832d17f
patch 8.1.0084: user name completion does not work on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13942
diff
changeset
|
1985 for (i = 0; i < nusers; i++) |
14698
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1986 add_user(utf16_to_enc(uinfo[i].usri0_name, NULL), FALSE); |
14133
352c2832d17f
patch 8.1.0084: user name completion does not work on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13942
diff
changeset
|
1987 |
352c2832d17f
patch 8.1.0084: user name completion does not work on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13942
diff
changeset
|
1988 NetApiBufferFree(uinfo); |
352c2832d17f
patch 8.1.0084: user name completion does not work on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13942
diff
changeset
|
1989 } |
352c2832d17f
patch 8.1.0084: user name completion does not work on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13942
diff
changeset
|
1990 } |
3744 | 1991 # endif |
14698
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1992 # if defined(HAVE_GETPWNAM) |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1993 { |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1994 char_u *user_env = mch_getenv((char_u *)"USER"); |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1995 |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1996 // The $USER environment variable may be a valid remote user name (NIS, |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1997 // LDAP) not already listed by getpwent(), as getpwent() only lists |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1998 // local user names. If $USER is not already listed, check whether it |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
1999 // is a valid remote user name using getpwnam() and if it is, add it to |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2000 // the list of user names. |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2001 |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2002 if (user_env != NULL && *user_env != NUL) |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2003 { |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2004 int i; |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2005 |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2006 for (i = 0; i < ga_users.ga_len; i++) |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2007 { |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2008 char_u *local_user = ((char_u **)ga_users.ga_data)[i]; |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2009 |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2010 if (STRCMP(local_user, user_env) == 0) |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2011 break; |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2012 } |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2013 |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2014 if (i == ga_users.ga_len) |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2015 { |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2016 struct passwd *pw = getpwnam((char *)user_env); |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2017 |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2018 if (pw != NULL) |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2019 add_user((char_u *)pw->pw_name, TRUE); |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2020 } |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2021 } |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2022 } |
d2cfca5b178e
patch 8.1.0361: remote user not used for completion
Christian Brabandt <cb@256bit.org>
parents:
14629
diff
changeset
|
2023 # endif |
3744 | 2024 } |
2025 | |
2026 /* | |
2027 * Function given to ExpandGeneric() to obtain an user names. | |
2028 */ | |
2029 char_u* | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2030 get_users(expand_T *xp UNUSED, int idx) |
3744 | 2031 { |
2032 init_users(); | |
2033 if (idx < ga_users.ga_len) | |
2034 return ((char_u **)ga_users.ga_data)[idx]; | |
2035 return NULL; | |
2036 } | |
2037 | |
2038 /* | |
2039 * Check whether name matches a user name. Return: | |
2040 * 0 if name does not match any user name. | |
2041 * 1 if name partially matches the beginning of a user name. | |
2042 * 2 is name fully matches a user name. | |
2043 */ | |
14286
95030c543411
patch 8.1.0159: completion for user names does not work for a prefix.
Christian Brabandt <cb@256bit.org>
parents:
14175
diff
changeset
|
2044 int |
95030c543411
patch 8.1.0159: completion for user names does not work for a prefix.
Christian Brabandt <cb@256bit.org>
parents:
14175
diff
changeset
|
2045 match_user(char_u *name) |
3744 | 2046 { |
2047 int i; | |
2048 int n = (int)STRLEN(name); | |
2049 int result = 0; | |
2050 | |
2051 init_users(); | |
2052 for (i = 0; i < ga_users.ga_len; i++) | |
2053 { | |
2054 if (STRCMP(((char_u **)ga_users.ga_data)[i], name) == 0) | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2055 return 2; // full match |
3744 | 2056 if (STRNCMP(((char_u **)ga_users.ga_data)[i], name, n) == 0) |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2057 result = 1; // partial match |
3744 | 2058 } |
2059 return result; | |
2060 } | |
7 | 2061 |
2062 /* | |
115 | 2063 * Concatenate two strings and return the result in allocated memory. |
2064 * Returns NULL when out of memory. | |
2065 */ | |
2066 char_u * | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2067 concat_str(char_u *str1, char_u *str2) |
115 | 2068 { |
2069 char_u *dest; | |
19181
94eda51ba9ba
patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
18931
diff
changeset
|
2070 size_t l = str1 == NULL ? 0 : STRLEN(str1); |
115 | 2071 |
19181
94eda51ba9ba
patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
18931
diff
changeset
|
2072 dest = alloc(l + (str2 == NULL ? 0 : STRLEN(str2)) + 1L); |
115 | 2073 if (dest != NULL) |
2074 { | |
19181
94eda51ba9ba
patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
18931
diff
changeset
|
2075 if (str1 == NULL) |
94eda51ba9ba
patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
18931
diff
changeset
|
2076 *dest = NUL; |
94eda51ba9ba
patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
18931
diff
changeset
|
2077 else |
94eda51ba9ba
patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
18931
diff
changeset
|
2078 STRCPY(dest, str1); |
94eda51ba9ba
patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
18931
diff
changeset
|
2079 if (str2 != NULL) |
94eda51ba9ba
patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
18931
diff
changeset
|
2080 STRCPY(dest + l, str2); |
115 | 2081 } |
2082 return dest; | |
2083 } | |
2084 | |
17789
0f7ae8010787
patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents:
17781
diff
changeset
|
2085 static void |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2086 prepare_to_exit(void) |
7 | 2087 { |
39 | 2088 #if defined(SIGHUP) && defined(SIG_IGN) |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2089 // Ignore SIGHUP, because a dropped connection causes a read error, which |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2090 // makes Vim exit and then handling SIGHUP causes various reentrance |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2091 // problems. |
36 | 2092 signal(SIGHUP, SIG_IGN); |
2093 #endif | |
2094 | |
7 | 2095 #ifdef FEAT_GUI |
2096 if (gui.in_use) | |
2097 { | |
2098 gui.dying = TRUE; | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2099 out_trash(); // trash any pending output |
7 | 2100 } |
2101 else | |
2102 #endif | |
2103 { | |
2104 windgoto((int)Rows - 1, 0); | |
2105 | |
2106 /* | |
2107 * Switch terminal mode back now, so messages end up on the "normal" | |
2108 * screen (if there are two screens). | |
2109 */ | |
2110 settmode(TMODE_COOK); | |
10264
c036c0f636d5
commit https://github.com/vim/vim/commit/cea912af725c54f4727a0565e31661f6b29c6bb1
Christian Brabandt <cb@256bit.org>
parents:
10180
diff
changeset
|
2111 stoptermcap(); |
7 | 2112 out_flush(); |
2113 } | |
2114 } | |
2115 | |
2116 /* | |
2117 * Preserve files and exit. | |
2118 * When called IObuff must contain a message. | |
5338 | 2119 * NOTE: This may be called from deathtrap() in a signal handler, avoid unsafe |
2120 * functions, such as allocating memory. | |
7 | 2121 */ |
2122 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2123 preserve_exit(void) |
7 | 2124 { |
2125 buf_T *buf; | |
2126 | |
2127 prepare_to_exit(); | |
2128 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2129 // Setting this will prevent free() calls. That avoids calling free() |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2130 // recursively when free() was invoked with a bad pointer. |
625 | 2131 really_exiting = TRUE; |
2132 | |
7 | 2133 out_str(IObuff); |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2134 screen_start(); // don't know where cursor is now |
7 | 2135 out_flush(); |
2136 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2137 ml_close_notmod(); // close all not-modified buffers |
7 | 2138 |
9649
fd9727ae3c49
commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents:
9536
diff
changeset
|
2139 FOR_ALL_BUFFERS(buf) |
7 | 2140 { |
2141 if (buf->b_ml.ml_mfp != NULL && buf->b_ml.ml_mfp->mf_fname != NULL) | |
2142 { | |
5338 | 2143 OUT_STR("Vim: preserving files...\n"); |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2144 screen_start(); // don't know where cursor is now |
7 | 2145 out_flush(); |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2146 ml_sync_all(FALSE, FALSE); // preserve all swap files |
7 | 2147 break; |
2148 } | |
2149 } | |
2150 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2151 ml_close_all(FALSE); // close all memfiles, without deleting |
7 | 2152 |
5338 | 2153 OUT_STR("Vim: Finished.\n"); |
7 | 2154 |
2155 getout(1); | |
2156 } | |
2157 | |
2158 /* | |
2159 * Check for CTRL-C pressed, but only once in a while. | |
2160 * Should be used instead of ui_breakcheck() for functions that check for | |
2161 * each line in the file. Calling ui_breakcheck() each time takes too much | |
2162 * time, because it can be a system call. | |
2163 */ | |
2164 | |
2165 #ifndef BREAKCHECK_SKIP | |
17452
f12745505a23
patch 8.1.1724: too much overhead checking for CTRL-C while processing text
Bram Moolenaar <Bram@vim.org>
parents:
17018
diff
changeset
|
2166 # define BREAKCHECK_SKIP 1000 |
7 | 2167 #endif |
2168 | |
2169 static int breakcheck_count = 0; | |
2170 | |
2171 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2172 line_breakcheck(void) |
7 | 2173 { |
2174 if (++breakcheck_count >= BREAKCHECK_SKIP) | |
2175 { | |
2176 breakcheck_count = 0; | |
2177 ui_breakcheck(); | |
2178 } | |
2179 } | |
2180 | |
2181 /* | |
2182 * Like line_breakcheck() but check 10 times less often. | |
2183 */ | |
2184 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2185 fast_breakcheck(void) |
7 | 2186 { |
2187 if (++breakcheck_count >= BREAKCHECK_SKIP * 10) | |
2188 { | |
2189 breakcheck_count = 0; | |
2190 ui_breakcheck(); | |
2191 } | |
2192 } | |
2193 | |
17781
04245f071792
patch 8.1.1887: the +cmdline_compl feature is not in the tiny version
Bram Moolenaar <Bram@vim.org>
parents:
17452
diff
changeset
|
2194 #if defined(VIM_BACKTICK) || defined(FEAT_EVAL) \ |
04245f071792
patch 8.1.1887: the +cmdline_compl feature is not in the tiny version
Bram Moolenaar <Bram@vim.org>
parents:
17452
diff
changeset
|
2195 || (defined(HAVE_LOCALE_H) || defined(X_LOCALE)) \ |
04245f071792
patch 8.1.1887: the +cmdline_compl feature is not in the tiny version
Bram Moolenaar <Bram@vim.org>
parents:
17452
diff
changeset
|
2196 || defined(PROTO) |
7 | 2197 |
2198 #ifndef SEEK_SET | |
2199 # define SEEK_SET 0 | |
2200 #endif | |
2201 #ifndef SEEK_END | |
2202 # define SEEK_END 2 | |
2203 #endif | |
2204 | |
2205 /* | |
2206 * Get the stdout of an external command. | |
5808 | 2207 * If "ret_len" is NULL replace NUL characters with NL. When "ret_len" is not |
2208 * NULL store the length there. | |
7 | 2209 * Returns an allocated string, or NULL for error. |
2210 */ | |
2211 char_u * | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2212 get_cmd_output( |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2213 char_u *cmd, |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2214 char_u *infile, // optional input file name |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2215 int flags, // can be SHELL_SILENT |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2216 int *ret_len) |
7 | 2217 { |
2218 char_u *tempname; | |
2219 char_u *command; | |
2220 char_u *buffer = NULL; | |
2221 int len; | |
2222 int i = 0; | |
2223 FILE *fd; | |
2224 | |
2225 if (check_restricted() || check_secure()) | |
2226 return NULL; | |
2227 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2228 // get a name for the temp file |
6721 | 2229 if ((tempname = vim_tempname('o', FALSE)) == NULL) |
7 | 2230 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15420
diff
changeset
|
2231 emsg(_(e_notmp)); |
7 | 2232 return NULL; |
2233 } | |
2234 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2235 // Add the redirection stuff |
24 | 2236 command = make_filter_cmd(cmd, infile, tempname); |
7 | 2237 if (command == NULL) |
2238 goto done; | |
2239 | |
2240 /* | |
2241 * Call the shell to execute the command (errors are ignored). | |
2242 * Don't check timestamps here. | |
2243 */ | |
2244 ++no_check_timestamps; | |
2245 call_shell(command, SHELL_DOOUT | SHELL_EXPAND | flags); | |
2246 --no_check_timestamps; | |
2247 | |
2248 vim_free(command); | |
2249 | |
2250 /* | |
2251 * read the names from the file into memory | |
2252 */ | |
2253 # ifdef VMS | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2254 // created temporary file is not always readable as binary |
7 | 2255 fd = mch_fopen((char *)tempname, "r"); |
2256 # else | |
2257 fd = mch_fopen((char *)tempname, READBIN); | |
2258 # endif | |
2259 | |
2260 if (fd == NULL) | |
2261 { | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15420
diff
changeset
|
2262 semsg(_(e_notopen), tempname); |
7 | 2263 goto done; |
2264 } | |
2265 | |
2266 fseek(fd, 0L, SEEK_END); | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2267 len = ftell(fd); // get size of temp file |
7 | 2268 fseek(fd, 0L, SEEK_SET); |
2269 | |
2270 buffer = alloc(len + 1); | |
2271 if (buffer != NULL) | |
2272 i = (int)fread((char *)buffer, (size_t)1, (size_t)len, fd); | |
2273 fclose(fd); | |
2274 mch_remove(tempname); | |
2275 if (buffer == NULL) | |
2276 goto done; | |
2277 #ifdef VMS | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2278 len = i; // VMS doesn't give us what we asked for... |
7 | 2279 #endif |
2280 if (i != len) | |
2281 { | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15420
diff
changeset
|
2282 semsg(_(e_notread), tempname); |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13188
diff
changeset
|
2283 VIM_CLEAR(buffer); |
7 | 2284 } |
5808 | 2285 else if (ret_len == NULL) |
5271
25f67b62afd8
updated for version 7.4b.012
Bram Moolenaar <bram@vim.org>
parents:
5104
diff
changeset
|
2286 { |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2287 // Change NUL into SOH, otherwise the string is truncated. |
5271
25f67b62afd8
updated for version 7.4b.012
Bram Moolenaar <bram@vim.org>
parents:
5104
diff
changeset
|
2288 for (i = 0; i < len; ++i) |
5275
3ddec3d25bd1
updated for version 7.4b.014
Bram Moolenaar <bram@vim.org>
parents:
5271
diff
changeset
|
2289 if (buffer[i] == NUL) |
3ddec3d25bd1
updated for version 7.4b.014
Bram Moolenaar <bram@vim.org>
parents:
5271
diff
changeset
|
2290 buffer[i] = 1; |
5271
25f67b62afd8
updated for version 7.4b.012
Bram Moolenaar <bram@vim.org>
parents:
5104
diff
changeset
|
2291 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2292 buffer[len] = NUL; // make sure the buffer is terminated |
5271
25f67b62afd8
updated for version 7.4b.012
Bram Moolenaar <bram@vim.org>
parents:
5104
diff
changeset
|
2293 } |
5808 | 2294 else |
2295 *ret_len = len; | |
7 | 2296 |
2297 done: | |
2298 vim_free(tempname); | |
2299 return buffer; | |
2300 } | |
17978
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2301 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2302 # if defined(FEAT_EVAL) || defined(PROTO) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2303 |
18051
d1e77015f60b
patch 8.1.2021: some global functions can be local to the file
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
2304 static void |
17978
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2305 get_cmd_output_as_rettv( |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2306 typval_T *argvars, |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2307 typval_T *rettv, |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2308 int retlist) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2309 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2310 char_u *res = NULL; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2311 char_u *p; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2312 char_u *infile = NULL; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2313 int err = FALSE; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2314 FILE *fd; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2315 list_T *list = NULL; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2316 int flags = SHELL_SILENT; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2317 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2318 rettv->v_type = VAR_STRING; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2319 rettv->vval.v_string = NULL; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2320 if (check_restricted() || check_secure()) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2321 goto errret; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2322 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2323 if (argvars[1].v_type != VAR_UNKNOWN) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2324 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2325 /* |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2326 * Write the text to a temp file, to be used for input of the shell |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2327 * command. |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2328 */ |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2329 if ((infile = vim_tempname('i', TRUE)) == NULL) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2330 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2331 emsg(_(e_notmp)); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2332 goto errret; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2333 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2334 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2335 fd = mch_fopen((char *)infile, WRITEBIN); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2336 if (fd == NULL) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2337 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2338 semsg(_(e_notopen), infile); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2339 goto errret; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2340 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2341 if (argvars[1].v_type == VAR_NUMBER) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2342 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2343 linenr_T lnum; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2344 buf_T *buf; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2345 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2346 buf = buflist_findnr(argvars[1].vval.v_number); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2347 if (buf == NULL) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2348 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2349 semsg(_(e_nobufnr), argvars[1].vval.v_number); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2350 fclose(fd); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2351 goto errret; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2352 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2353 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2354 for (lnum = 1; lnum <= buf->b_ml.ml_line_count; lnum++) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2355 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2356 for (p = ml_get_buf(buf, lnum, FALSE); *p != NUL; ++p) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2357 if (putc(*p == '\n' ? NUL : *p, fd) == EOF) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2358 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2359 err = TRUE; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2360 break; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2361 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2362 if (putc(NL, fd) == EOF) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2363 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2364 err = TRUE; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2365 break; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2366 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2367 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2368 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2369 else if (argvars[1].v_type == VAR_LIST) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2370 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2371 if (write_list(fd, argvars[1].vval.v_list, TRUE) == FAIL) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2372 err = TRUE; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2373 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2374 else |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2375 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2376 size_t len; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2377 char_u buf[NUMBUFLEN]; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2378 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2379 p = tv_get_string_buf_chk(&argvars[1], buf); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2380 if (p == NULL) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2381 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2382 fclose(fd); |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2383 goto errret; // type error; errmsg already given |
17978
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2384 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2385 len = STRLEN(p); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2386 if (len > 0 && fwrite(p, len, 1, fd) != 1) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2387 err = TRUE; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2388 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2389 if (fclose(fd) != 0) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2390 err = TRUE; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2391 if (err) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2392 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2393 emsg(_("E677: Error writing temp file")); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2394 goto errret; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2395 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2396 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2397 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2398 // Omit SHELL_COOKED when invoked with ":silent". Avoids that the shell |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2399 // echoes typeahead, that messes up the display. |
17978
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2400 if (!msg_silent) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2401 flags += SHELL_COOKED; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2402 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2403 if (retlist) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2404 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2405 int len; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2406 listitem_T *li; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2407 char_u *s = NULL; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2408 char_u *start; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2409 char_u *end; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2410 int i; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2411 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2412 res = get_cmd_output(tv_get_string(&argvars[0]), infile, flags, &len); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2413 if (res == NULL) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2414 goto errret; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2415 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2416 list = list_alloc(); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2417 if (list == NULL) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2418 goto errret; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2419 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2420 for (i = 0; i < len; ++i) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2421 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2422 start = res + i; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2423 while (i < len && res[i] != NL) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2424 ++i; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2425 end = res + i; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2426 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2427 s = alloc(end - start + 1); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2428 if (s == NULL) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2429 goto errret; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2430 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2431 for (p = s; start < end; ++p, ++start) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2432 *p = *start == NUL ? NL : *start; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2433 *p = NUL; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2434 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2435 li = listitem_alloc(); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2436 if (li == NULL) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2437 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2438 vim_free(s); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2439 goto errret; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2440 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2441 li->li_tv.v_type = VAR_STRING; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2442 li->li_tv.v_lock = 0; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2443 li->li_tv.vval.v_string = s; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2444 list_append(list, li); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2445 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2446 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2447 rettv_list_set(rettv, list); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2448 list = NULL; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2449 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2450 else |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2451 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2452 res = get_cmd_output(tv_get_string(&argvars[0]), infile, flags, NULL); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2453 #ifdef USE_CRNL |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2454 // translate <CR><NL> into <NL> |
17978
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2455 if (res != NULL) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2456 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2457 char_u *s, *d; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2458 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2459 d = res; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2460 for (s = res; *s; ++s) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2461 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2462 if (s[0] == CAR && s[1] == NL) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2463 ++s; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2464 *d++ = *s; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2465 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2466 *d = NUL; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2467 } |
7 | 2468 #endif |
17978
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2469 rettv->vval.v_string = res; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2470 res = NULL; |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2471 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2472 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2473 errret: |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2474 if (infile != NULL) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2475 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2476 mch_remove(infile); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2477 vim_free(infile); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2478 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2479 if (res != NULL) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2480 vim_free(res); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2481 if (list != NULL) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2482 list_free(list); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2483 } |
7 | 2484 |
2485 /* | |
17978
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2486 * "system()" function |
7 | 2487 */ |
2488 void | |
17978
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2489 f_system(typval_T *argvars, typval_T *rettv) |
7 | 2490 { |
17978
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2491 get_cmd_output_as_rettv(argvars, rettv, FALSE); |
7 | 2492 } |
2493 | |
2494 /* | |
17978
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2495 * "systemlist()" function |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2496 */ |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2497 void |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2498 f_systemlist(typval_T *argvars, typval_T *rettv) |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2499 { |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2500 get_cmd_output_as_rettv(argvars, rettv, TRUE); |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2501 } |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2502 # endif // FEAT_EVAL |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2503 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2504 #endif |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2505 |
8f4cc259ed7a
patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents:
17966
diff
changeset
|
2506 /* |
2302
488be8cbe19c
Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents:
2297
diff
changeset
|
2507 * Return TRUE when need to go to Insert mode because of 'insertmode'. |
7 | 2508 * Don't do this when still processing a command or a mapping. |
2509 * Don't do this when inside a ":normal" command. | |
2510 */ | |
2511 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2512 goto_im(void) |
7 | 2513 { |
2514 return (p_im && stuff_empty() && typebuf_typed()); | |
2515 } | |
5867 | 2516 |
2517 /* | |
5911 | 2518 * Returns the isolated name of the shell in allocated memory: |
5867 | 2519 * - Skip beyond any path. E.g., "/usr/bin/csh -f" -> "csh -f". |
2520 * - Remove any argument. E.g., "csh -f" -> "csh". | |
2521 * But don't allow a space in the path, so that this works: | |
2522 * "/usr/bin/csh --rcfile ~/.cshrc" | |
2523 * But don't do that for Windows, it's common to have a space in the path. | |
2524 */ | |
2525 char_u * | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2526 get_isolated_shell_name(void) |
5867 | 2527 { |
2528 char_u *p; | |
2529 | |
15868
7fad90423bd2
patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15814
diff
changeset
|
2530 #ifdef MSWIN |
5867 | 2531 p = gettail(p_sh); |
2532 p = vim_strnsave(p, (int)(skiptowhite(p) - p)); | |
2533 #else | |
2534 p = skiptowhite(p_sh); | |
2535 if (*p == NUL) | |
2536 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2537 // No white space, use the tail. |
5867 | 2538 p = vim_strsave(gettail(p_sh)); |
2539 } | |
2540 else | |
2541 { | |
2542 char_u *p1, *p2; | |
2543 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2544 // Find the last path separator before the space. |
5867 | 2545 p1 = p_sh; |
11127
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11121
diff
changeset
|
2546 for (p2 = p_sh; p2 < p; MB_PTR_ADV(p2)) |
5867 | 2547 if (vim_ispathsep(*p2)) |
2548 p1 = p2 + 1; | |
2549 p = vim_strnsave(p1, (int)(p - p1)); | |
2550 } | |
2551 #endif | |
2552 return p; | |
2553 } | |
15814
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2554 |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2555 /* |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2556 * Check if the "://" of a URL is at the pointer, return URL_SLASH. |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2557 * Also check for ":\\", which MS Internet Explorer accepts, return |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2558 * URL_BACKSLASH. |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2559 */ |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2560 int |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2561 path_is_url(char_u *p) |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2562 { |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2563 if (STRNCMP(p, "://", (size_t)3) == 0) |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2564 return URL_SLASH; |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2565 else if (STRNCMP(p, ":\\\\", (size_t)3) == 0) |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2566 return URL_BACKSLASH; |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2567 return 0; |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2568 } |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2569 |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2570 /* |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2571 * Check if "fname" starts with "name://". Return URL_SLASH if it does. |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2572 * Return URL_BACKSLASH for "name:\\". |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2573 * Return zero otherwise. |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2574 */ |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2575 int |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2576 path_with_url(char_u *fname) |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2577 { |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2578 char_u *p; |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2579 |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2580 for (p = fname; isalpha(*p); ++p) |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2581 ; |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2582 return path_is_url(p); |
99ebf78686a9
patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
15699
diff
changeset
|
2583 } |
18463
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2584 |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2585 /* |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2586 * Put timestamp "tt" in "buf[buflen]" in a nice format. |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2587 */ |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2588 void |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2589 add_time(char_u *buf, size_t buflen, time_t tt) |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2590 { |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2591 #ifdef HAVE_STRFTIME |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2592 struct tm tmval; |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2593 struct tm *curtime; |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2594 |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2595 if (vim_time() - tt >= 100) |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2596 { |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2597 curtime = vim_localtime(&tt, &tmval); |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2598 if (vim_time() - tt < (60L * 60L * 12L)) |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2599 // within 12 hours |
18463
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2600 (void)strftime((char *)buf, buflen, "%H:%M:%S", curtime); |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2601 else |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18528
diff
changeset
|
2602 // longer ago |
18463
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2603 (void)strftime((char *)buf, buflen, "%Y/%m/%d %H:%M:%S", curtime); |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2604 } |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2605 else |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2606 #endif |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2607 { |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2608 long seconds = (long)(vim_time() - tt); |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2609 |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2610 vim_snprintf((char *)buf, buflen, |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2611 NGETTEXT("%ld second ago", "%ld seconds ago", seconds), |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2612 seconds); |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2613 } |
18d7337b6837
patch 8.1.2225: the "last used" info of a buffer is under used
Bram Moolenaar <Bram@vim.org>
parents:
18354
diff
changeset
|
2614 } |