|
1 To: [email protected] |
|
2 Subject: Patch 7.2.166 |
|
3 Fcc: outbox |
|
4 From: Bram Moolenaar <[email protected]> |
|
5 Mime-Version: 1.0 |
|
6 Content-Type: text/plain; charset=ISO-8859-1 |
|
7 Content-Transfer-Encoding: 8bit |
|
8 ------------ |
|
9 |
|
10 Patch 7.2.166 |
|
11 Problem: No completion for ":sign" command. |
|
12 Solution: Add ":sign" completion. (Dominique Pelle) |
|
13 Files: src/ex_cmds.c, src/ex_docmd.c, src/ex_getln.c, src/vim.h, |
|
14 src/proto/ex_cmds.pro |
|
15 |
|
16 |
|
17 *** ../vim-7.2.165/src/ex_cmds.c Tue Feb 24 04:28:40 2009 |
|
18 --- src/ex_cmds.c Wed Apr 29 17:08:27 2009 |
|
19 *************** |
|
20 *** 6543,6562 **** |
|
21 static void sign_list_defined __ARGS((sign_T *sp)); |
|
22 static void sign_undefine __ARGS((sign_T *sp, sign_T *sp_prev)); |
|
23 |
|
24 ! /* |
|
25 ! * ":sign" command |
|
26 ! */ |
|
27 ! void |
|
28 ! ex_sign(eap) |
|
29 ! exarg_T *eap; |
|
30 ! { |
|
31 ! char_u *arg = eap->arg; |
|
32 ! char_u *p; |
|
33 ! int idx; |
|
34 ! sign_T *sp; |
|
35 ! sign_T *sp_prev; |
|
36 ! buf_T *buf; |
|
37 ! static char *cmds[] = { |
|
38 "define", |
|
39 #define SIGNCMD_DEFINE 0 |
|
40 "undefine", |
|
41 --- 6543,6549 ---- |
|
42 static void sign_list_defined __ARGS((sign_T *sp)); |
|
43 static void sign_undefine __ARGS((sign_T *sp, sign_T *sp_prev)); |
|
44 |
|
45 ! static char *cmds[] = { |
|
46 "define", |
|
47 #define SIGNCMD_DEFINE 0 |
|
48 "undefine", |
|
49 *************** |
|
50 *** 6569,6590 **** |
|
51 #define SIGNCMD_UNPLACE 4 |
|
52 "jump", |
|
53 #define SIGNCMD_JUMP 5 |
|
54 #define SIGNCMD_LAST 6 |
|
55 ! }; |
|
56 |
|
57 /* Parse the subcommand. */ |
|
58 p = skiptowhite(arg); |
|
59 ! if (*p != NUL) |
|
60 ! *p++ = NUL; |
|
61 ! for (idx = 0; ; ++idx) |
|
62 { |
|
63 ! if (idx == SIGNCMD_LAST) |
|
64 ! { |
|
65 ! EMSG2(_("E160: Unknown sign command: %s"), arg); |
|
66 ! return; |
|
67 ! } |
|
68 ! if (STRCMP(arg, cmds[idx]) == 0) |
|
69 ! break; |
|
70 } |
|
71 arg = skipwhite(p); |
|
72 |
|
73 --- 6556,6606 ---- |
|
74 #define SIGNCMD_UNPLACE 4 |
|
75 "jump", |
|
76 #define SIGNCMD_JUMP 5 |
|
77 + NULL |
|
78 #define SIGNCMD_LAST 6 |
|
79 ! }; |
|
80 ! |
|
81 ! /* |
|
82 ! * Find index of a ":sign" subcmd from its name. |
|
83 ! * "*end_cmd" must be writable. |
|
84 ! */ |
|
85 ! static int |
|
86 ! sign_cmd_idx(begin_cmd, end_cmd) |
|
87 ! char *begin_cmd; /* begin of sign subcmd */ |
|
88 ! char *end_cmd; /* just after sign subcmd */ |
|
89 ! { |
|
90 ! int idx; |
|
91 ! char save = *end_cmd; |
|
92 ! |
|
93 ! *end_cmd = NUL; |
|
94 ! for (idx = 0; ; ++idx) |
|
95 ! if (cmds[idx] == NULL || STRCMP(begin_cmd, cmds[idx]) == 0) |
|
96 ! break; |
|
97 ! *end_cmd = save; |
|
98 ! return idx; |
|
99 ! } |
|
100 ! |
|
101 ! /* |
|
102 ! * ":sign" command |
|
103 ! */ |
|
104 ! void |
|
105 ! ex_sign(eap) |
|
106 ! exarg_T *eap; |
|
107 ! { |
|
108 ! char_u *arg = eap->arg; |
|
109 ! char_u *p; |
|
110 ! int idx; |
|
111 ! sign_T *sp; |
|
112 ! sign_T *sp_prev; |
|
113 ! buf_T *buf; |
|
114 |
|
115 /* Parse the subcommand. */ |
|
116 p = skiptowhite(arg); |
|
117 ! idx = sign_cmd_idx(arg, p); |
|
118 ! if (idx == SIGNCMD_LAST) |
|
119 { |
|
120 ! EMSG2(_("E160: Unknown sign command: %s"), arg); |
|
121 ! return; |
|
122 } |
|
123 arg = skipwhite(p); |
|
124 |
|
125 *************** |
|
126 *** 7110,7115 **** |
|
127 --- 7126,7311 ---- |
|
128 } |
|
129 #endif |
|
130 |
|
131 + #if defined(FEAT_CMDL_COMPL) || defined(PROTO) |
|
132 + static enum |
|
133 + { |
|
134 + EXP_SUBCMD, /* expand :sign sub-commands */ |
|
135 + EXP_DEFINE, /* expand :sign define {name} args */ |
|
136 + EXP_PLACE, /* expand :sign place {id} args */ |
|
137 + EXP_UNPLACE, /* expand :sign unplace" */ |
|
138 + EXP_SIGN_NAMES /* expand with name of placed signs */ |
|
139 + } expand_what; |
|
140 + |
|
141 + /* |
|
142 + * Function given to ExpandGeneric() to obtain the sign command |
|
143 + * expansion. |
|
144 + */ |
|
145 + /*ARGSUSED*/ |
|
146 + char_u * |
|
147 + get_sign_name(xp, idx) |
|
148 + expand_T *xp; |
|
149 + int idx; |
|
150 + { |
|
151 + sign_T *sp; |
|
152 + int current_idx; |
|
153 + |
|
154 + switch (expand_what) |
|
155 + { |
|
156 + case EXP_SUBCMD: |
|
157 + return (char_u *)cmds[idx]; |
|
158 + case EXP_DEFINE: |
|
159 + { |
|
160 + char *define_arg[] = |
|
161 + { |
|
162 + "icon=", "linehl=", "text=", "texthl=", NULL |
|
163 + }; |
|
164 + return (char_u *)define_arg[idx]; |
|
165 + } |
|
166 + case EXP_PLACE: |
|
167 + { |
|
168 + char *place_arg[] = |
|
169 + { |
|
170 + "line=", "name=", "file=", "buffer=", NULL |
|
171 + }; |
|
172 + return (char_u *)place_arg[idx]; |
|
173 + } |
|
174 + case EXP_UNPLACE: |
|
175 + { |
|
176 + char *unplace_arg[] = { "file=", "buffer=", NULL }; |
|
177 + return (char_u *)unplace_arg[idx]; |
|
178 + } |
|
179 + case EXP_SIGN_NAMES: |
|
180 + /* Complete with name of signs already defined */ |
|
181 + current_idx = 0; |
|
182 + for (sp = first_sign; sp != NULL; sp = sp->sn_next) |
|
183 + if (current_idx++ == idx) |
|
184 + return sp->sn_name; |
|
185 + return NULL; |
|
186 + default: |
|
187 + return NULL; |
|
188 + } |
|
189 + } |
|
190 + |
|
191 + /* |
|
192 + * Handle command line completion for :sign command. |
|
193 + */ |
|
194 + void |
|
195 + set_context_in_sign_cmd(xp, arg) |
|
196 + expand_T *xp; |
|
197 + char_u *arg; |
|
198 + { |
|
199 + char_u *p; |
|
200 + char_u *end_subcmd; |
|
201 + char_u *last; |
|
202 + int cmd_idx; |
|
203 + char_u *begin_subcmd_args; |
|
204 + |
|
205 + /* Default: expand subcommands. */ |
|
206 + xp->xp_context = EXPAND_SIGN; |
|
207 + expand_what = EXP_SUBCMD; |
|
208 + xp->xp_pattern = arg; |
|
209 + |
|
210 + end_subcmd = skiptowhite(arg); |
|
211 + if (*end_subcmd == NUL) |
|
212 + /* expand subcmd name |
|
213 + * :sign {subcmd}<CTRL-D>*/ |
|
214 + return; |
|
215 + |
|
216 + cmd_idx = sign_cmd_idx(arg, end_subcmd); |
|
217 + |
|
218 + /* :sign {subcmd} {subcmd_args} |
|
219 + * | |
|
220 + * begin_subcmd_args */ |
|
221 + begin_subcmd_args = skipwhite(end_subcmd); |
|
222 + p = skiptowhite(begin_subcmd_args); |
|
223 + if (*p == NUL) |
|
224 + { |
|
225 + /* |
|
226 + * Expand first argument of subcmd when possible. |
|
227 + * For ":jump {id}" and ":unplace {id}", we could |
|
228 + * possibly expand the ids of all signs already placed. |
|
229 + */ |
|
230 + xp->xp_pattern = begin_subcmd_args; |
|
231 + switch (cmd_idx) |
|
232 + { |
|
233 + case SIGNCMD_LIST: |
|
234 + case SIGNCMD_UNDEFINE: |
|
235 + /* :sign list <CTRL-D> |
|
236 + * :sign undefine <CTRL-D> */ |
|
237 + expand_what = EXP_SIGN_NAMES; |
|
238 + break; |
|
239 + default: |
|
240 + xp->xp_context = EXPAND_NOTHING; |
|
241 + } |
|
242 + return; |
|
243 + } |
|
244 + |
|
245 + /* expand last argument of subcmd */ |
|
246 + |
|
247 + /* :sign define {name} {args}... |
|
248 + * | |
|
249 + * p */ |
|
250 + |
|
251 + /* Loop until reaching last argument. */ |
|
252 + do |
|
253 + { |
|
254 + p = skipwhite(p); |
|
255 + last = p; |
|
256 + p = skiptowhite(p); |
|
257 + } while (*p != NUL); |
|
258 + |
|
259 + p = vim_strchr(last, '='); |
|
260 + |
|
261 + /* :sign define {name} {args}... {last}= |
|
262 + * | | |
|
263 + * last p */ |
|
264 + if (p == NUL) |
|
265 + { |
|
266 + /* Expand last argument name (before equal sign). */ |
|
267 + xp->xp_pattern = last; |
|
268 + switch (cmd_idx) |
|
269 + { |
|
270 + case SIGNCMD_DEFINE: |
|
271 + expand_what = EXP_DEFINE; |
|
272 + break; |
|
273 + case SIGNCMD_PLACE: |
|
274 + expand_what = EXP_PLACE; |
|
275 + break; |
|
276 + case SIGNCMD_JUMP: |
|
277 + case SIGNCMD_UNPLACE: |
|
278 + expand_what = EXP_UNPLACE; |
|
279 + break; |
|
280 + default: |
|
281 + xp->xp_context = EXPAND_NOTHING; |
|
282 + } |
|
283 + } |
|
284 + else |
|
285 + { |
|
286 + /* Expand last argument value (after equal sign). */ |
|
287 + xp->xp_pattern = p + 1; |
|
288 + switch (cmd_idx) |
|
289 + { |
|
290 + case SIGNCMD_DEFINE: |
|
291 + if (STRNCMP(last, "texthl", p - last) == 0 || |
|
292 + STRNCMP(last, "linehl", p - last) == 0) |
|
293 + xp->xp_context = EXPAND_HIGHLIGHT; |
|
294 + else if (STRNCMP(last, "icon", p - last) == 0) |
|
295 + xp->xp_context = EXPAND_FILES; |
|
296 + else |
|
297 + xp->xp_context = EXPAND_NOTHING; |
|
298 + break; |
|
299 + case SIGNCMD_PLACE: |
|
300 + if (STRNCMP(last, "name", p - last) == 0) |
|
301 + expand_what = EXP_SIGN_NAMES; |
|
302 + else |
|
303 + xp->xp_context = EXPAND_NOTHING; |
|
304 + break; |
|
305 + default: |
|
306 + xp->xp_context = EXPAND_NOTHING; |
|
307 + } |
|
308 + } |
|
309 + } |
|
310 + #endif |
|
311 #endif |
|
312 |
|
313 #if defined(FEAT_GUI) || defined(FEAT_CLIENTSERVER) || defined(PROTO) |
|
314 *** ../vim-7.2.165/src/ex_docmd.c Wed Apr 22 16:22:44 2009 |
|
315 --- src/ex_docmd.c Wed Apr 29 17:05:23 2009 |
|
316 *************** |
|
317 *** 3695,3700 **** |
|
318 --- 3695,3705 ---- |
|
319 set_context_in_cscope_cmd(xp, arg, ea.cmdidx); |
|
320 break; |
|
321 #endif |
|
322 + #ifdef FEAT_SIGNS |
|
323 + case CMD_sign: |
|
324 + set_context_in_sign_cmd(xp, arg); |
|
325 + break; |
|
326 + #endif |
|
327 #ifdef FEAT_LISTCMDS |
|
328 case CMD_bdelete: |
|
329 case CMD_bwipeout: |
|
330 *************** |
|
331 *** 5218,5223 **** |
|
332 --- 5223,5231 ---- |
|
333 {EXPAND_MENUS, "menu"}, |
|
334 {EXPAND_SETTINGS, "option"}, |
|
335 {EXPAND_SHELLCMD, "shellcmd"}, |
|
336 + #if defined(FEAT_SIGNS) |
|
337 + {EXPAND_SIGN, "sign"}, |
|
338 + #endif |
|
339 {EXPAND_TAGS, "tag"}, |
|
340 {EXPAND_TAGS_LISTFILES, "tag_listfiles"}, |
|
341 {EXPAND_USER_VARS, "var"}, |
|
342 *** ../vim-7.2.165/src/ex_getln.c Wed Apr 29 12:03:35 2009 |
|
343 --- src/ex_getln.c Wed Apr 29 12:51:42 2009 |
|
344 *************** |
|
345 *** 325,331 **** |
|
346 #endif |
|
347 |
|
348 #ifdef FEAT_DIGRAPHS |
|
349 ! do_digraph(-1); /* init digraph typahead */ |
|
350 #endif |
|
351 |
|
352 /* |
|
353 --- 325,331 ---- |
|
354 #endif |
|
355 |
|
356 #ifdef FEAT_DIGRAPHS |
|
357 ! do_digraph(-1); /* init digraph typeahead */ |
|
358 #endif |
|
359 |
|
360 /* |
|
361 *************** |
|
362 *** 4521,4526 **** |
|
363 --- 4521,4529 ---- |
|
364 #ifdef FEAT_CSCOPE |
|
365 {EXPAND_CSCOPE, get_cscope_name, TRUE}, |
|
366 #endif |
|
367 + #ifdef FEAT_SIGNS |
|
368 + {EXPAND_SIGN, get_sign_name, TRUE}, |
|
369 + #endif |
|
370 #if (defined(HAVE_LOCALE_H) || defined(X_LOCALE)) \ |
|
371 && (defined(FEAT_GETTEXT) || defined(FEAT_MBYTE)) |
|
372 {EXPAND_LANGUAGE, get_lang_arg, TRUE}, |
|
373 *** ../vim-7.2.165/src/vim.h Wed Mar 18 12:50:58 2009 |
|
374 --- src/vim.h Wed Apr 29 12:51:42 2009 |
|
375 *************** |
|
376 *** 709,714 **** |
|
377 --- 709,715 ---- |
|
378 #define EXPAND_USER_LIST 31 |
|
379 #define EXPAND_SHELLCMD 32 |
|
380 #define EXPAND_CSCOPE 33 |
|
381 + #define EXPAND_SIGN 34 |
|
382 |
|
383 /* Values for exmode_active (0 is no exmode) */ |
|
384 #define EXMODE_NORMAL 1 |
|
385 *** ../vim-7.2.165/src/proto/ex_cmds.pro Tue Feb 24 04:28:40 2009 |
|
386 --- src/proto/ex_cmds.pro Wed Apr 29 17:10:29 2009 |
|
387 *************** |
|
388 *** 40,46 **** |
|
389 int read_viminfo_sub_string __ARGS((vir_T *virp, int force)); |
|
390 void write_viminfo_sub_string __ARGS((FILE *fp)); |
|
391 void free_old_sub __ARGS((void)); |
|
392 - void free_signs __ARGS((void)); |
|
393 int prepare_tagpreview __ARGS((int undo_sync)); |
|
394 void ex_help __ARGS((exarg_T *eap)); |
|
395 char_u *check_help_lang __ARGS((char_u *arg)); |
|
396 --- 40,45 ---- |
|
397 *************** |
|
398 *** 56,60 **** |
|
399 --- 55,62 ---- |
|
400 char_u *sign_get_text __ARGS((int typenr)); |
|
401 void *sign_get_image __ARGS((int typenr)); |
|
402 char_u *sign_typenr2name __ARGS((int typenr)); |
|
403 + void free_signs __ARGS((void)); |
|
404 + char_u *get_sign_name __ARGS((expand_T *xp, int idx)); |
|
405 + void set_context_in_sign_cmd __ARGS((expand_T *xp, char_u *arg)); |
|
406 void ex_drop __ARGS((exarg_T *eap)); |
|
407 /* vim: set ft=c : */ |
|
408 *** ../vim-7.2.165/src/version.c Wed Apr 29 18:01:23 2009 |
|
409 --- src/version.c Wed Apr 29 18:43:14 2009 |
|
410 *************** |
|
411 *** 678,679 **** |
|
412 --- 678,681 ---- |
|
413 { /* Add new patch number below this line */ |
|
414 + /**/ |
|
415 + 166, |
|
416 /**/ |
|
417 |
|
418 -- |
|
419 Did you ever stop to think... and forget to start again? |
|
420 -- Steven Wright |
|
421 |
|
422 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\ |
|
423 /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
|
424 \\\ download, build and distribute -- http://www.A-A-P.org /// |
|
425 \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |