xref: /vim-8.2.3635/src/getchar.c (revision cc7ff3fc)
1 /* vi:set ts=8 sts=4 sw=4:
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  * getchar.c
12  *
13  * functions related with getting a character from the user/mapping/redo/...
14  *
15  * manipulations with redo buffer and stuff buffer
16  * mappings and abbreviations
17  */
18 
19 #include "vim.h"
20 
21 /*
22  * These buffers are used for storing:
23  * - stuffed characters: A command that is translated into another command.
24  * - redo characters: will redo the last change.
25  * - recorded characters: for the "q" command.
26  *
27  * The bytes are stored like in the typeahead buffer:
28  * - K_SPECIAL introduces a special key (two more bytes follow).  A literal
29  *   K_SPECIAL is stored as K_SPECIAL KS_SPECIAL KE_FILLER.
30  * - CSI introduces a GUI termcap code (also when gui.in_use is FALSE,
31  *   otherwise switching the GUI on would make mappings invalid).
32  *   A literal CSI is stored as CSI KS_EXTRA KE_CSI.
33  * These translations are also done on multi-byte characters!
34  *
35  * Escaping CSI bytes is done by the system-specific input functions, called
36  * by ui_inchar().
37  * Escaping K_SPECIAL is done by inchar().
38  * Un-escaping is done by vgetc().
39  */
40 
41 #define MINIMAL_SIZE 20			/* minimal size for b_str */
42 
43 static buffheader_T redobuff = {{NULL, {NUL}}, NULL, 0, 0};
44 static buffheader_T old_redobuff = {{NULL, {NUL}}, NULL, 0, 0};
45 #if defined(FEAT_AUTOCMD) || defined(FEAT_EVAL) || defined(PROTO)
46 static buffheader_T save_redobuff = {{NULL, {NUL}}, NULL, 0, 0};
47 static buffheader_T save_old_redobuff = {{NULL, {NUL}}, NULL, 0, 0};
48 #endif
49 static buffheader_T recordbuff = {{NULL, {NUL}}, NULL, 0, 0};
50 
51 static int typeahead_char = 0;		/* typeahead char that's not flushed */
52 
53 /*
54  * when block_redo is TRUE redo buffer will not be changed
55  * used by edit() to repeat insertions and 'V' command for redoing
56  */
57 static int	block_redo = FALSE;
58 
59 /*
60  * Make a hash value for a mapping.
61  * "mode" is the lower 4 bits of the State for the mapping.
62  * "c1" is the first character of the "lhs".
63  * Returns a value between 0 and 255, index in maphash.
64  * Put Normal/Visual mode mappings mostly separately from Insert/Cmdline mode.
65  */
66 #define MAP_HASH(mode, c1) (((mode) & (NORMAL + VISUAL + SELECTMODE + OP_PENDING)) ? (c1) : ((c1) ^ 0x80))
67 
68 /*
69  * Each mapping is put in one of the 256 hash lists, to speed up finding it.
70  */
71 static mapblock_T	*(maphash[256]);
72 static int		maphash_valid = FALSE;
73 
74 /*
75  * List used for abbreviations.
76  */
77 static mapblock_T	*first_abbr = NULL; /* first entry in abbrlist */
78 
79 static int		KeyNoremap = 0;	    /* remapping flags */
80 
81 /*
82  * variables used by vgetorpeek() and flush_buffers()
83  *
84  * typebuf.tb_buf[] contains all characters that are not consumed yet.
85  * typebuf.tb_buf[typebuf.tb_off] is the first valid character.
86  * typebuf.tb_buf[typebuf.tb_off + typebuf.tb_len - 1] is the last valid char.
87  * typebuf.tb_buf[typebuf.tb_off + typebuf.tb_len] must be NUL.
88  * The head of the buffer may contain the result of mappings, abbreviations
89  * and @a commands.  The length of this part is typebuf.tb_maplen.
90  * typebuf.tb_silent is the part where <silent> applies.
91  * After the head are characters that come from the terminal.
92  * typebuf.tb_no_abbr_cnt is the number of characters in typebuf.tb_buf that
93  * should not be considered for abbreviations.
94  * Some parts of typebuf.tb_buf may not be mapped. These parts are remembered
95  * in typebuf.tb_noremap[], which is the same length as typebuf.tb_buf and
96  * contains RM_NONE for the characters that are not to be remapped.
97  * typebuf.tb_noremap[typebuf.tb_off] is the first valid flag.
98  * (typebuf has been put in globals.h, because check_termcode() needs it).
99  */
100 #define RM_YES		0	/* tb_noremap: remap */
101 #define RM_NONE		1	/* tb_noremap: don't remap */
102 #define RM_SCRIPT	2	/* tb_noremap: remap local script mappings */
103 #define RM_ABBR		4	/* tb_noremap: don't remap, do abbrev. */
104 
105 /* typebuf.tb_buf has three parts: room in front (for result of mappings), the
106  * middle for typeahead and room for new characters (which needs to be 3 *
107  * MAXMAPLEN) for the Amiga).
108  */
109 #define TYPELEN_INIT	(5 * (MAXMAPLEN + 3))
110 static char_u	typebuf_init[TYPELEN_INIT];	/* initial typebuf.tb_buf */
111 static char_u	noremapbuf_init[TYPELEN_INIT];	/* initial typebuf.tb_noremap */
112 
113 static int	last_recorded_len = 0;	/* number of last recorded chars */
114 
115 static char_u	*get_buffcont __ARGS((buffheader_T *, int));
116 static void	add_buff __ARGS((buffheader_T *, char_u *, long n));
117 static void	add_num_buff __ARGS((buffheader_T *, long));
118 static void	add_char_buff __ARGS((buffheader_T *, int));
119 static int	read_readbuffers __ARGS((int advance));
120 static int	read_readbuf __ARGS((buffheader_T *buf, int advance));
121 static void	start_stuff __ARGS((void));
122 static int	read_redo __ARGS((int, int));
123 static void	copy_redo __ARGS((int));
124 static void	init_typebuf __ARGS((void));
125 static void	gotchars __ARGS((char_u *, int));
126 static void	may_sync_undo __ARGS((void));
127 static void	closescript __ARGS((void));
128 static int	vgetorpeek __ARGS((int));
129 static void	map_free __ARGS((mapblock_T **));
130 static void	validate_maphash __ARGS((void));
131 static void	showmap __ARGS((mapblock_T *mp, int local));
132 #ifdef FEAT_EVAL
133 static char_u	*eval_map_expr __ARGS((char_u *str, int c));
134 #endif
135 
136 /*
137  * Free and clear a buffer.
138  */
139     void
140 free_buff(buf)
141     buffheader_T	*buf;
142 {
143     buffblock_T	*p, *np;
144 
145     for (p = buf->bh_first.b_next; p != NULL; p = np)
146     {
147 	np = p->b_next;
148 	vim_free(p);
149     }
150     buf->bh_first.b_next = NULL;
151 }
152 
153 /*
154  * Return the contents of a buffer as a single string.
155  * K_SPECIAL and CSI in the returned string are escaped.
156  */
157     static char_u *
158 get_buffcont(buffer, dozero)
159     buffheader_T	*buffer;
160     int			dozero;	    /* count == zero is not an error */
161 {
162     long_u	    count = 0;
163     char_u	    *p = NULL;
164     char_u	    *p2;
165     char_u	    *str;
166     buffblock_T *bp;
167 
168     /* compute the total length of the string */
169     for (bp = buffer->bh_first.b_next; bp != NULL; bp = bp->b_next)
170 	count += (long_u)STRLEN(bp->b_str);
171 
172     if ((count || dozero) && (p = lalloc(count + 1, TRUE)) != NULL)
173     {
174 	p2 = p;
175 	for (bp = buffer->bh_first.b_next; bp != NULL; bp = bp->b_next)
176 	    for (str = bp->b_str; *str; )
177 		*p2++ = *str++;
178 	*p2 = NUL;
179     }
180     return (p);
181 }
182 
183 /*
184  * Return the contents of the record buffer as a single string
185  * and clear the record buffer.
186  * K_SPECIAL and CSI in the returned string are escaped.
187  */
188     char_u *
189 get_recorded()
190 {
191     char_u	*p;
192     size_t	len;
193 
194     p = get_buffcont(&recordbuff, TRUE);
195     free_buff(&recordbuff);
196 
197     /*
198      * Remove the characters that were added the last time, these must be the
199      * (possibly mapped) characters that stopped the recording.
200      */
201     len = STRLEN(p);
202     if ((int)len >= last_recorded_len)
203     {
204 	len -= last_recorded_len;
205 	p[len] = NUL;
206     }
207 
208     /*
209      * When stopping recording from Insert mode with CTRL-O q, also remove the
210      * CTRL-O.
211      */
212     if (len > 0 && restart_edit != 0 && p[len - 1] == Ctrl_O)
213 	p[len - 1] = NUL;
214 
215     return (p);
216 }
217 
218 /*
219  * Return the contents of the redo buffer as a single string.
220  * K_SPECIAL and CSI in the returned string are escaped.
221  */
222     char_u *
223 get_inserted()
224 {
225     return get_buffcont(&redobuff, FALSE);
226 }
227 
228 /*
229  * Add string "s" after the current block of buffer "buf".
230  * K_SPECIAL and CSI should have been escaped already.
231  */
232     static void
233 add_buff(buf, s, slen)
234     buffheader_T	*buf;
235     char_u		*s;
236     long		slen;	/* length of "s" or -1 */
237 {
238     buffblock_T *p;
239     long_u	    len;
240 
241     if (slen < 0)
242 	slen = (long)STRLEN(s);
243     if (slen == 0)				/* don't add empty strings */
244 	return;
245 
246     if (buf->bh_first.b_next == NULL)	/* first add to list */
247     {
248 	buf->bh_space = 0;
249 	buf->bh_curr = &(buf->bh_first);
250     }
251     else if (buf->bh_curr == NULL)	/* buffer has already been read */
252     {
253 	EMSG(_("E222: Add to read buffer"));
254 	return;
255     }
256     else if (buf->bh_index != 0)
257 	mch_memmove(buf->bh_first.b_next->b_str,
258 		    buf->bh_first.b_next->b_str + buf->bh_index,
259 		    STRLEN(buf->bh_first.b_next->b_str + buf->bh_index) + 1);
260     buf->bh_index = 0;
261 
262     if (buf->bh_space >= (int)slen)
263     {
264 	len = (long_u)STRLEN(buf->bh_curr->b_str);
265 	vim_strncpy(buf->bh_curr->b_str + len, s, (size_t)slen);
266 	buf->bh_space -= slen;
267     }
268     else
269     {
270 	if (slen < MINIMAL_SIZE)
271 	    len = MINIMAL_SIZE;
272 	else
273 	    len = slen;
274 	p = (buffblock_T *)lalloc((long_u)(sizeof(buffblock_T) + len),
275 									TRUE);
276 	if (p == NULL)
277 	    return; /* no space, just forget it */
278 	buf->bh_space = (int)(len - slen);
279 	vim_strncpy(p->b_str, s, (size_t)slen);
280 
281 	p->b_next = buf->bh_curr->b_next;
282 	buf->bh_curr->b_next = p;
283 	buf->bh_curr = p;
284     }
285     return;
286 }
287 
288 /*
289  * Add number "n" to buffer "buf".
290  */
291     static void
292 add_num_buff(buf, n)
293     buffheader_T *buf;
294     long	      n;
295 {
296     char_u	number[32];
297 
298     sprintf((char *)number, "%ld", n);
299     add_buff(buf, number, -1L);
300 }
301 
302 /*
303  * Add character 'c' to buffer "buf".
304  * Translates special keys, NUL, CSI, K_SPECIAL and multibyte characters.
305  */
306     static void
307 add_char_buff(buf, c)
308     buffheader_T	*buf;
309     int			c;
310 {
311 #ifdef FEAT_MBYTE
312     char_u	bytes[MB_MAXBYTES + 1];
313     int		len;
314     int		i;
315 #endif
316     char_u	temp[4];
317 
318 #ifdef FEAT_MBYTE
319     if (IS_SPECIAL(c))
320 	len = 1;
321     else
322 	len = (*mb_char2bytes)(c, bytes);
323     for (i = 0; i < len; ++i)
324     {
325 	if (!IS_SPECIAL(c))
326 	    c = bytes[i];
327 #endif
328 
329 	if (IS_SPECIAL(c) || c == K_SPECIAL || c == NUL)
330 	{
331 	    /* translate special key code into three byte sequence */
332 	    temp[0] = K_SPECIAL;
333 	    temp[1] = K_SECOND(c);
334 	    temp[2] = K_THIRD(c);
335 	    temp[3] = NUL;
336 	}
337 #ifdef FEAT_GUI
338 	else if (c == CSI)
339 	{
340 	    /* Translate a CSI to a CSI - KS_EXTRA - KE_CSI sequence */
341 	    temp[0] = CSI;
342 	    temp[1] = KS_EXTRA;
343 	    temp[2] = (int)KE_CSI;
344 	    temp[3] = NUL;
345 	}
346 #endif
347 	else
348 	{
349 	    temp[0] = c;
350 	    temp[1] = NUL;
351 	}
352 	add_buff(buf, temp, -1L);
353 #ifdef FEAT_MBYTE
354     }
355 #endif
356 }
357 
358 /* First read ahead buffer. Used for translated commands. */
359 static buffheader_T readbuf1 = {{NULL, {NUL}}, NULL, 0, 0};
360 
361 /* Second read ahead buffer. Used for redo. */
362 static buffheader_T readbuf2 = {{NULL, {NUL}}, NULL, 0, 0};
363 
364 /*
365  * Get one byte from the read buffers.  Use readbuf1 one first, use readbuf2
366  * if that one is empty.
367  * If advance == TRUE go to the next char.
368  * No translation is done K_SPECIAL and CSI are escaped.
369  */
370     static int
371 read_readbuffers(advance)
372     int		advance;
373 {
374     int c;
375 
376     c = read_readbuf(&readbuf1, advance);
377     if (c == NUL)
378 	c = read_readbuf(&readbuf2, advance);
379     return c;
380 }
381 
382     static int
383 read_readbuf(buf, advance)
384     buffheader_T    *buf;
385     int		    advance;
386 {
387     char_u	c;
388     buffblock_T	*curr;
389 
390     if (buf->bh_first.b_next == NULL)  /* buffer is empty */
391 	return NUL;
392 
393     curr = buf->bh_first.b_next;
394     c = curr->b_str[buf->bh_index];
395 
396     if (advance)
397     {
398 	if (curr->b_str[++buf->bh_index] == NUL)
399 	{
400 	    buf->bh_first.b_next = curr->b_next;
401 	    vim_free(curr);
402 	    buf->bh_index = 0;
403 	}
404     }
405     return c;
406 }
407 
408 /*
409  * Prepare the read buffers for reading (if they contain something).
410  */
411     static void
412 start_stuff()
413 {
414     if (readbuf1.bh_first.b_next != NULL)
415     {
416 	readbuf1.bh_curr = &(readbuf1.bh_first);
417 	readbuf1.bh_space = 0;
418     }
419     if (readbuf2.bh_first.b_next != NULL)
420     {
421 	readbuf2.bh_curr = &(readbuf2.bh_first);
422 	readbuf2.bh_space = 0;
423     }
424 }
425 
426 /*
427  * Return TRUE if the stuff buffer is empty.
428  */
429     int
430 stuff_empty()
431 {
432     return (readbuf1.bh_first.b_next == NULL
433 	 && readbuf2.bh_first.b_next == NULL);
434 }
435 
436 /*
437  * Return TRUE if readbuf1 is empty.  There may still be redo characters in
438  * redbuf2.
439  */
440     int
441 readbuf1_empty()
442 {
443     return (readbuf1.bh_first.b_next == NULL);
444 }
445 
446 /*
447  * Set a typeahead character that won't be flushed.
448  */
449     void
450 typeahead_noflush(c)
451     int		c;
452 {
453     typeahead_char = c;
454 }
455 
456 /*
457  * Remove the contents of the stuff buffer and the mapped characters in the
458  * typeahead buffer (used in case of an error).  If "flush_typeahead" is true,
459  * flush all typeahead characters (used when interrupted by a CTRL-C).
460  */
461     void
462 flush_buffers(flush_typeahead)
463     int flush_typeahead;
464 {
465     init_typebuf();
466 
467     start_stuff();
468     while (read_readbuffers(TRUE) != NUL)
469 	;
470 
471     if (flush_typeahead)	    /* remove all typeahead */
472     {
473 	/*
474 	 * We have to get all characters, because we may delete the first part
475 	 * of an escape sequence.
476 	 * In an xterm we get one char at a time and we have to get them all.
477 	 */
478 	while (inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 10L,
479 						  typebuf.tb_change_cnt) != 0)
480 	    ;
481 	typebuf.tb_off = MAXMAPLEN;
482 	typebuf.tb_len = 0;
483     }
484     else		    /* remove mapped characters at the start only */
485     {
486 	typebuf.tb_off += typebuf.tb_maplen;
487 	typebuf.tb_len -= typebuf.tb_maplen;
488     }
489     typebuf.tb_maplen = 0;
490     typebuf.tb_silent = 0;
491     cmd_silent = FALSE;
492     typebuf.tb_no_abbr_cnt = 0;
493 }
494 
495 /*
496  * The previous contents of the redo buffer is kept in old_redobuffer.
497  * This is used for the CTRL-O <.> command in insert mode.
498  */
499     void
500 ResetRedobuff()
501 {
502     if (!block_redo)
503     {
504 	free_buff(&old_redobuff);
505 	old_redobuff = redobuff;
506 	redobuff.bh_first.b_next = NULL;
507     }
508 }
509 
510 /*
511  * Discard the contents of the redo buffer and restore the previous redo
512  * buffer.
513  */
514     void
515 CancelRedo()
516 {
517     if (!block_redo)
518     {
519 	free_buff(&redobuff);
520 	redobuff = old_redobuff;
521 	old_redobuff.bh_first.b_next = NULL;
522 	start_stuff();
523 	while (read_readbuffers(TRUE) != NUL)
524 	    ;
525     }
526 }
527 
528 #if defined(FEAT_AUTOCMD) || defined(FEAT_EVAL) || defined(PROTO)
529 /*
530  * Save redobuff and old_redobuff to save_redobuff and save_old_redobuff.
531  * Used before executing autocommands and user functions.
532  */
533 static int save_level = 0;
534 
535     void
536 saveRedobuff()
537 {
538     char_u	*s;
539 
540     if (save_level++ == 0)
541     {
542 	save_redobuff = redobuff;
543 	redobuff.bh_first.b_next = NULL;
544 	save_old_redobuff = old_redobuff;
545 	old_redobuff.bh_first.b_next = NULL;
546 
547 	/* Make a copy, so that ":normal ." in a function works. */
548 	s = get_buffcont(&save_redobuff, FALSE);
549 	if (s != NULL)
550 	{
551 	    add_buff(&redobuff, s, -1L);
552 	    vim_free(s);
553 	}
554     }
555 }
556 
557 /*
558  * Restore redobuff and old_redobuff from save_redobuff and save_old_redobuff.
559  * Used after executing autocommands and user functions.
560  */
561     void
562 restoreRedobuff()
563 {
564     if (--save_level == 0)
565     {
566 	free_buff(&redobuff);
567 	redobuff = save_redobuff;
568 	free_buff(&old_redobuff);
569 	old_redobuff = save_old_redobuff;
570     }
571 }
572 #endif
573 
574 /*
575  * Append "s" to the redo buffer.
576  * K_SPECIAL and CSI should already have been escaped.
577  */
578     void
579 AppendToRedobuff(s)
580     char_u	   *s;
581 {
582     if (!block_redo)
583 	add_buff(&redobuff, s, -1L);
584 }
585 
586 /*
587  * Append to Redo buffer literally, escaping special characters with CTRL-V.
588  * K_SPECIAL and CSI are escaped as well.
589  */
590     void
591 AppendToRedobuffLit(str, len)
592     char_u	*str;
593     int		len;	    /* length of "str" or -1 for up to the NUL */
594 {
595     char_u	*s = str;
596     int		c;
597     char_u	*start;
598 
599     if (block_redo)
600 	return;
601 
602     while (len < 0 ? *s != NUL : s - str < len)
603     {
604 	/* Put a string of normal characters in the redo buffer (that's
605 	 * faster). */
606 	start = s;
607 	while (*s >= ' '
608 #ifndef EBCDIC
609 		&& *s < DEL	/* EBCDIC: all chars above space are normal */
610 #endif
611 		&& (len < 0 || s - str < len))
612 	    ++s;
613 
614 	/* Don't put '0' or '^' as last character, just in case a CTRL-D is
615 	 * typed next. */
616 	if (*s == NUL && (s[-1] == '0' || s[-1] == '^'))
617 	    --s;
618 	if (s > start)
619 	    add_buff(&redobuff, start, (long)(s - start));
620 
621 	if (*s == NUL || (len >= 0 && s - str >= len))
622 	    break;
623 
624 	/* Handle a special or multibyte character. */
625 #ifdef FEAT_MBYTE
626 	if (has_mbyte)
627 	    /* Handle composing chars separately. */
628 	    c = mb_cptr2char_adv(&s);
629 	else
630 #endif
631 	    c = *s++;
632 	if (c < ' ' || c == DEL || (*s == NUL && (c == '0' || c == '^')))
633 	    add_char_buff(&redobuff, Ctrl_V);
634 
635 	/* CTRL-V '0' must be inserted as CTRL-V 048 (EBCDIC: xf0) */
636 	if (*s == NUL && c == '0')
637 #ifdef EBCDIC
638 	    add_buff(&redobuff, (char_u *)"xf0", 3L);
639 #else
640 	    add_buff(&redobuff, (char_u *)"048", 3L);
641 #endif
642 	else
643 	    add_char_buff(&redobuff, c);
644     }
645 }
646 
647 /*
648  * Append a character to the redo buffer.
649  * Translates special keys, NUL, CSI, K_SPECIAL and multibyte characters.
650  */
651     void
652 AppendCharToRedobuff(c)
653     int		   c;
654 {
655     if (!block_redo)
656 	add_char_buff(&redobuff, c);
657 }
658 
659 /*
660  * Append a number to the redo buffer.
661  */
662     void
663 AppendNumberToRedobuff(n)
664     long	    n;
665 {
666     if (!block_redo)
667 	add_num_buff(&redobuff, n);
668 }
669 
670 /*
671  * Append string "s" to the stuff buffer.
672  * CSI and K_SPECIAL must already have been escaped.
673  */
674     void
675 stuffReadbuff(s)
676     char_u	*s;
677 {
678     add_buff(&readbuf1, s, -1L);
679 }
680 
681 /*
682  * Append string "s" to the redo stuff buffer.
683  * CSI and K_SPECIAL must already have been escaped.
684  */
685     void
686 stuffRedoReadbuff(s)
687     char_u	*s;
688 {
689     add_buff(&readbuf2, s, -1L);
690 }
691 
692     void
693 stuffReadbuffLen(s, len)
694     char_u	*s;
695     long	len;
696 {
697     add_buff(&readbuf1, s, len);
698 }
699 
700 #if defined(FEAT_EVAL) || defined(PROTO)
701 /*
702  * Stuff "s" into the stuff buffer, leaving special key codes unmodified and
703  * escaping other K_SPECIAL and CSI bytes.
704  * Change CR, LF and ESC into a space.
705  */
706     void
707 stuffReadbuffSpec(s)
708     char_u	*s;
709 {
710     int c;
711 
712     while (*s != NUL)
713     {
714 	if (*s == K_SPECIAL && s[1] != NUL && s[2] != NUL)
715 	{
716 	    /* Insert special key literally. */
717 	    stuffReadbuffLen(s, 3L);
718 	    s += 3;
719 	}
720 	else
721 	{
722 #ifdef FEAT_MBYTE
723 	    c = mb_ptr2char_adv(&s);
724 #else
725 	    c = *s++;
726 #endif
727 	    if (c == CAR || c == NL || c == ESC)
728 		c = ' ';
729 	    stuffcharReadbuff(c);
730 	}
731     }
732 }
733 #endif
734 
735 /*
736  * Append a character to the stuff buffer.
737  * Translates special keys, NUL, CSI, K_SPECIAL and multibyte characters.
738  */
739     void
740 stuffcharReadbuff(c)
741     int		   c;
742 {
743     add_char_buff(&readbuf1, c);
744 }
745 
746 /*
747  * Append a number to the stuff buffer.
748  */
749     void
750 stuffnumReadbuff(n)
751     long    n;
752 {
753     add_num_buff(&readbuf1, n);
754 }
755 
756 /*
757  * Read a character from the redo buffer.  Translates K_SPECIAL, CSI and
758  * multibyte characters.
759  * The redo buffer is left as it is.
760  * If init is TRUE, prepare for redo, return FAIL if nothing to redo, OK
761  * otherwise.
762  * If old is TRUE, use old_redobuff instead of redobuff.
763  */
764     static int
765 read_redo(init, old_redo)
766     int		init;
767     int		old_redo;
768 {
769     static buffblock_T	*bp;
770     static char_u	*p;
771     int			c;
772 #ifdef FEAT_MBYTE
773     int			n;
774     char_u		buf[MB_MAXBYTES + 1];
775     int			i;
776 #endif
777 
778     if (init)
779     {
780 	if (old_redo)
781 	    bp = old_redobuff.bh_first.b_next;
782 	else
783 	    bp = redobuff.bh_first.b_next;
784 	if (bp == NULL)
785 	    return FAIL;
786 	p = bp->b_str;
787 	return OK;
788     }
789     if ((c = *p) != NUL)
790     {
791 	/* Reverse the conversion done by add_char_buff() */
792 #ifdef FEAT_MBYTE
793 	/* For a multi-byte character get all the bytes and return the
794 	 * converted character. */
795 	if (has_mbyte && (c != K_SPECIAL || p[1] == KS_SPECIAL))
796 	    n = MB_BYTE2LEN_CHECK(c);
797 	else
798 	    n = 1;
799 	for (i = 0; ; ++i)
800 #endif
801 	{
802 	    if (c == K_SPECIAL) /* special key or escaped K_SPECIAL */
803 	    {
804 		c = TO_SPECIAL(p[1], p[2]);
805 		p += 2;
806 	    }
807 #ifdef FEAT_GUI
808 	    if (c == CSI)	/* escaped CSI */
809 		p += 2;
810 #endif
811 	    if (*++p == NUL && bp->b_next != NULL)
812 	    {
813 		bp = bp->b_next;
814 		p = bp->b_str;
815 	    }
816 #ifdef FEAT_MBYTE
817 	    buf[i] = c;
818 	    if (i == n - 1)	/* last byte of a character */
819 	    {
820 		if (n != 1)
821 		    c = (*mb_ptr2char)(buf);
822 		break;
823 	    }
824 	    c = *p;
825 	    if (c == NUL)	/* cannot happen? */
826 		break;
827 #endif
828 	}
829     }
830 
831     return c;
832 }
833 
834 /*
835  * Copy the rest of the redo buffer into the stuff buffer (in a slow way).
836  * If old_redo is TRUE, use old_redobuff instead of redobuff.
837  * The escaped K_SPECIAL and CSI are copied without translation.
838  */
839     static void
840 copy_redo(old_redo)
841     int	    old_redo;
842 {
843     int	    c;
844 
845     while ((c = read_redo(FALSE, old_redo)) != NUL)
846 	add_char_buff(&readbuf2, c);
847 }
848 
849 /*
850  * Stuff the redo buffer into readbuf2.
851  * Insert the redo count into the command.
852  * If "old_redo" is TRUE, the last but one command is repeated
853  * instead of the last command (inserting text). This is used for
854  * CTRL-O <.> in insert mode
855  *
856  * return FAIL for failure, OK otherwise
857  */
858     int
859 start_redo(count, old_redo)
860     long    count;
861     int	    old_redo;
862 {
863     int	    c;
864 
865     /* init the pointers; return if nothing to redo */
866     if (read_redo(TRUE, old_redo) == FAIL)
867 	return FAIL;
868 
869     c = read_redo(FALSE, old_redo);
870 
871     /* copy the buffer name, if present */
872     if (c == '"')
873     {
874 	add_buff(&readbuf2, (char_u *)"\"", 1L);
875 	c = read_redo(FALSE, old_redo);
876 
877 	/* if a numbered buffer is used, increment the number */
878 	if (c >= '1' && c < '9')
879 	    ++c;
880 	add_char_buff(&readbuf2, c);
881 	c = read_redo(FALSE, old_redo);
882     }
883 
884     if (c == 'v')   /* redo Visual */
885     {
886 	VIsual = curwin->w_cursor;
887 	VIsual_active = TRUE;
888 	VIsual_select = FALSE;
889 	VIsual_reselect = TRUE;
890 	redo_VIsual_busy = TRUE;
891 	c = read_redo(FALSE, old_redo);
892     }
893 
894     /* try to enter the count (in place of a previous count) */
895     if (count)
896     {
897 	while (VIM_ISDIGIT(c))	/* skip "old" count */
898 	    c = read_redo(FALSE, old_redo);
899 	add_num_buff(&readbuf2, count);
900     }
901 
902     /* copy from the redo buffer into the stuff buffer */
903     add_char_buff(&readbuf2, c);
904     copy_redo(old_redo);
905     return OK;
906 }
907 
908 /*
909  * Repeat the last insert (R, o, O, a, A, i or I command) by stuffing
910  * the redo buffer into readbuf2.
911  * return FAIL for failure, OK otherwise
912  */
913     int
914 start_redo_ins()
915 {
916     int	    c;
917 
918     if (read_redo(TRUE, FALSE) == FAIL)
919 	return FAIL;
920     start_stuff();
921 
922     /* skip the count and the command character */
923     while ((c = read_redo(FALSE, FALSE)) != NUL)
924     {
925 	if (vim_strchr((char_u *)"AaIiRrOo", c) != NULL)
926 	{
927 	    if (c == 'O' || c == 'o')
928 		add_buff(&readbuf2, NL_STR, -1L);
929 	    break;
930 	}
931     }
932 
933     /* copy the typed text from the redo buffer into the stuff buffer */
934     copy_redo(FALSE);
935     block_redo = TRUE;
936     return OK;
937 }
938 
939     void
940 stop_redo_ins()
941 {
942     block_redo = FALSE;
943 }
944 
945 /*
946  * Initialize typebuf.tb_buf to point to typebuf_init.
947  * alloc() cannot be used here: In out-of-memory situations it would
948  * be impossible to type anything.
949  */
950     static void
951 init_typebuf()
952 {
953     if (typebuf.tb_buf == NULL)
954     {
955 	typebuf.tb_buf = typebuf_init;
956 	typebuf.tb_noremap = noremapbuf_init;
957 	typebuf.tb_buflen = TYPELEN_INIT;
958 	typebuf.tb_len = 0;
959 	typebuf.tb_off = 0;
960 	typebuf.tb_change_cnt = 1;
961     }
962 }
963 
964 /*
965  * insert a string in position 'offset' in the typeahead buffer (for "@r"
966  * and ":normal" command, vgetorpeek() and check_termcode())
967  *
968  * If noremap is REMAP_YES, new string can be mapped again.
969  * If noremap is REMAP_NONE, new string cannot be mapped again.
970  * If noremap is REMAP_SKIP, fist char of new string cannot be mapped again,
971  * but abbreviations are allowed.
972  * If noremap is REMAP_SCRIPT, new string cannot be mapped again, except for
973  *			script-local mappings.
974  * If noremap is > 0, that many characters of the new string cannot be mapped.
975  *
976  * If nottyped is TRUE, the string does not return KeyTyped (don't use when
977  * offset is non-zero!).
978  *
979  * If silent is TRUE, cmd_silent is set when the characters are obtained.
980  *
981  * return FAIL for failure, OK otherwise
982  */
983     int
984 ins_typebuf(str, noremap, offset, nottyped, silent)
985     char_u	*str;
986     int		noremap;
987     int		offset;
988     int		nottyped;
989     int		silent;
990 {
991     char_u	*s1, *s2;
992     int		newlen;
993     int		addlen;
994     int		i;
995     int		newoff;
996     int		val;
997     int		nrm;
998 
999     init_typebuf();
1000     if (++typebuf.tb_change_cnt == 0)
1001 	typebuf.tb_change_cnt = 1;
1002 
1003     addlen = (int)STRLEN(str);
1004 
1005     /*
1006      * Easy case: there is room in front of typebuf.tb_buf[typebuf.tb_off]
1007      */
1008     if (offset == 0 && addlen <= typebuf.tb_off)
1009     {
1010 	typebuf.tb_off -= addlen;
1011 	mch_memmove(typebuf.tb_buf + typebuf.tb_off, str, (size_t)addlen);
1012     }
1013 
1014     /*
1015      * Need to allocate a new buffer.
1016      * In typebuf.tb_buf there must always be room for 3 * MAXMAPLEN + 4
1017      * characters.  We add some extra room to avoid having to allocate too
1018      * often.
1019      */
1020     else
1021     {
1022 	newoff = MAXMAPLEN + 4;
1023 	newlen = typebuf.tb_len + addlen + newoff + 4 * (MAXMAPLEN + 4);
1024 	if (newlen < 0)		    /* string is getting too long */
1025 	{
1026 	    EMSG(_(e_toocompl));    /* also calls flush_buffers */
1027 	    setcursor();
1028 	    return FAIL;
1029 	}
1030 	s1 = alloc(newlen);
1031 	if (s1 == NULL)		    /* out of memory */
1032 	    return FAIL;
1033 	s2 = alloc(newlen);
1034 	if (s2 == NULL)		    /* out of memory */
1035 	{
1036 	    vim_free(s1);
1037 	    return FAIL;
1038 	}
1039 	typebuf.tb_buflen = newlen;
1040 
1041 	/* copy the old chars, before the insertion point */
1042 	mch_memmove(s1 + newoff, typebuf.tb_buf + typebuf.tb_off,
1043 							      (size_t)offset);
1044 	/* copy the new chars */
1045 	mch_memmove(s1 + newoff + offset, str, (size_t)addlen);
1046 	/* copy the old chars, after the insertion point, including the	NUL at
1047 	 * the end */
1048 	mch_memmove(s1 + newoff + offset + addlen,
1049 				     typebuf.tb_buf + typebuf.tb_off + offset,
1050 				       (size_t)(typebuf.tb_len - offset + 1));
1051 	if (typebuf.tb_buf != typebuf_init)
1052 	    vim_free(typebuf.tb_buf);
1053 	typebuf.tb_buf = s1;
1054 
1055 	mch_memmove(s2 + newoff, typebuf.tb_noremap + typebuf.tb_off,
1056 							      (size_t)offset);
1057 	mch_memmove(s2 + newoff + offset + addlen,
1058 		   typebuf.tb_noremap + typebuf.tb_off + offset,
1059 					   (size_t)(typebuf.tb_len - offset));
1060 	if (typebuf.tb_noremap != noremapbuf_init)
1061 	    vim_free(typebuf.tb_noremap);
1062 	typebuf.tb_noremap = s2;
1063 
1064 	typebuf.tb_off = newoff;
1065     }
1066     typebuf.tb_len += addlen;
1067 
1068     /* If noremap == REMAP_SCRIPT: do remap script-local mappings. */
1069     if (noremap == REMAP_SCRIPT)
1070 	val = RM_SCRIPT;
1071     else if (noremap == REMAP_SKIP)
1072 	val = RM_ABBR;
1073     else
1074 	val = RM_NONE;
1075 
1076     /*
1077      * Adjust typebuf.tb_noremap[] for the new characters:
1078      * If noremap == REMAP_NONE or REMAP_SCRIPT: new characters are
1079      *			(sometimes) not remappable
1080      * If noremap == REMAP_YES: all the new characters are mappable
1081      * If noremap  > 0: "noremap" characters are not remappable, the rest
1082      *			mappable
1083      */
1084     if (noremap == REMAP_SKIP)
1085 	nrm = 1;
1086     else if (noremap < 0)
1087 	nrm = addlen;
1088     else
1089 	nrm = noremap;
1090     for (i = 0; i < addlen; ++i)
1091 	typebuf.tb_noremap[typebuf.tb_off + i + offset] =
1092 						  (--nrm >= 0) ? val : RM_YES;
1093 
1094     /* tb_maplen and tb_silent only remember the length of mapped and/or
1095      * silent mappings at the start of the buffer, assuming that a mapped
1096      * sequence doesn't result in typed characters. */
1097     if (nottyped || typebuf.tb_maplen > offset)
1098 	typebuf.tb_maplen += addlen;
1099     if (silent || typebuf.tb_silent > offset)
1100     {
1101 	typebuf.tb_silent += addlen;
1102 	cmd_silent = TRUE;
1103     }
1104     if (typebuf.tb_no_abbr_cnt && offset == 0)	/* and not used for abbrev.s */
1105 	typebuf.tb_no_abbr_cnt += addlen;
1106 
1107     return OK;
1108 }
1109 
1110 /*
1111  * Put character "c" back into the typeahead buffer.
1112  * Can be used for a character obtained by vgetc() that needs to be put back.
1113  * Uses cmd_silent, KeyTyped and KeyNoremap to restore the flags belonging to
1114  * the char.
1115  */
1116     void
1117 ins_char_typebuf(c)
1118     int	    c;
1119 {
1120 #ifdef FEAT_MBYTE
1121     char_u	buf[MB_MAXBYTES + 1];
1122 #else
1123     char_u	buf[4];
1124 #endif
1125     if (IS_SPECIAL(c))
1126     {
1127 	buf[0] = K_SPECIAL;
1128 	buf[1] = K_SECOND(c);
1129 	buf[2] = K_THIRD(c);
1130 	buf[3] = NUL;
1131     }
1132     else
1133     {
1134 #ifdef FEAT_MBYTE
1135 	buf[(*mb_char2bytes)(c, buf)] = NUL;
1136 #else
1137 	buf[0] = c;
1138 	buf[1] = NUL;
1139 #endif
1140     }
1141     (void)ins_typebuf(buf, KeyNoremap, 0, !KeyTyped, cmd_silent);
1142 }
1143 
1144 /*
1145  * Return TRUE if the typeahead buffer was changed (while waiting for a
1146  * character to arrive).  Happens when a message was received from a client or
1147  * from feedkeys().
1148  * But check in a more generic way to avoid trouble: When "typebuf.tb_buf"
1149  * changed it was reallocated and the old pointer can no longer be used.
1150  * Or "typebuf.tb_off" may have been changed and we would overwrite characters
1151  * that was just added.
1152  */
1153     int
1154 typebuf_changed(tb_change_cnt)
1155     int		tb_change_cnt;	/* old value of typebuf.tb_change_cnt */
1156 {
1157     return (tb_change_cnt != 0 && (typebuf.tb_change_cnt != tb_change_cnt
1158 #if defined(FEAT_CLIENTSERVER) || defined(FEAT_EVAL)
1159 	    || typebuf_was_filled
1160 #endif
1161 	   ));
1162 }
1163 
1164 /*
1165  * Return TRUE if there are no characters in the typeahead buffer that have
1166  * not been typed (result from a mapping or come from ":normal").
1167  */
1168     int
1169 typebuf_typed()
1170 {
1171     return typebuf.tb_maplen == 0;
1172 }
1173 
1174 /*
1175  * Return the number of characters that are mapped (or not typed).
1176  */
1177     int
1178 typebuf_maplen()
1179 {
1180     return typebuf.tb_maplen;
1181 }
1182 
1183 /*
1184  * remove "len" characters from typebuf.tb_buf[typebuf.tb_off + offset]
1185  */
1186     void
1187 del_typebuf(len, offset)
1188     int	len;
1189     int	offset;
1190 {
1191     int	    i;
1192 
1193     if (len == 0)
1194 	return;		/* nothing to do */
1195 
1196     typebuf.tb_len -= len;
1197 
1198     /*
1199      * Easy case: Just increase typebuf.tb_off.
1200      */
1201     if (offset == 0 && typebuf.tb_buflen - (typebuf.tb_off + len)
1202 							 >= 3 * MAXMAPLEN + 3)
1203 	typebuf.tb_off += len;
1204     /*
1205      * Have to move the characters in typebuf.tb_buf[] and typebuf.tb_noremap[]
1206      */
1207     else
1208     {
1209 	i = typebuf.tb_off + offset;
1210 	/*
1211 	 * Leave some extra room at the end to avoid reallocation.
1212 	 */
1213 	if (typebuf.tb_off > MAXMAPLEN)
1214 	{
1215 	    mch_memmove(typebuf.tb_buf + MAXMAPLEN,
1216 			     typebuf.tb_buf + typebuf.tb_off, (size_t)offset);
1217 	    mch_memmove(typebuf.tb_noremap + MAXMAPLEN,
1218 			 typebuf.tb_noremap + typebuf.tb_off, (size_t)offset);
1219 	    typebuf.tb_off = MAXMAPLEN;
1220 	}
1221 	/* adjust typebuf.tb_buf (include the NUL at the end) */
1222 	mch_memmove(typebuf.tb_buf + typebuf.tb_off + offset,
1223 						     typebuf.tb_buf + i + len,
1224 				       (size_t)(typebuf.tb_len - offset + 1));
1225 	/* adjust typebuf.tb_noremap[] */
1226 	mch_memmove(typebuf.tb_noremap + typebuf.tb_off + offset,
1227 						 typebuf.tb_noremap + i + len,
1228 					   (size_t)(typebuf.tb_len - offset));
1229     }
1230 
1231     if (typebuf.tb_maplen > offset)		/* adjust tb_maplen */
1232     {
1233 	if (typebuf.tb_maplen < offset + len)
1234 	    typebuf.tb_maplen = offset;
1235 	else
1236 	    typebuf.tb_maplen -= len;
1237     }
1238     if (typebuf.tb_silent > offset)		/* adjust tb_silent */
1239     {
1240 	if (typebuf.tb_silent < offset + len)
1241 	    typebuf.tb_silent = offset;
1242 	else
1243 	    typebuf.tb_silent -= len;
1244     }
1245     if (typebuf.tb_no_abbr_cnt > offset)	/* adjust tb_no_abbr_cnt */
1246     {
1247 	if (typebuf.tb_no_abbr_cnt < offset + len)
1248 	    typebuf.tb_no_abbr_cnt = offset;
1249 	else
1250 	    typebuf.tb_no_abbr_cnt -= len;
1251     }
1252 
1253 #if defined(FEAT_CLIENTSERVER) || defined(FEAT_EVAL)
1254     /* Reset the flag that text received from a client or from feedkeys()
1255      * was inserted in the typeahead buffer. */
1256     typebuf_was_filled = FALSE;
1257 #endif
1258     if (++typebuf.tb_change_cnt == 0)
1259 	typebuf.tb_change_cnt = 1;
1260 }
1261 
1262 /*
1263  * Write typed characters to script file.
1264  * If recording is on put the character in the recordbuffer.
1265  */
1266     static void
1267 gotchars(chars, len)
1268     char_u	*chars;
1269     int		len;
1270 {
1271     char_u	*s = chars;
1272     int		c;
1273     char_u	buf[2];
1274     int		todo = len;
1275 
1276     /* remember how many chars were last recorded */
1277     if (Recording)
1278 	last_recorded_len += len;
1279 
1280     buf[1] = NUL;
1281     while (todo--)
1282     {
1283 	/* Handle one byte at a time; no translation to be done. */
1284 	c = *s++;
1285 	updatescript(c);
1286 
1287 	if (Recording)
1288 	{
1289 	    buf[0] = c;
1290 	    add_buff(&recordbuff, buf, 1L);
1291 	}
1292     }
1293     may_sync_undo();
1294 
1295 #ifdef FEAT_EVAL
1296     /* output "debug mode" message next time in debug mode */
1297     debug_did_msg = FALSE;
1298 #endif
1299 
1300     /* Since characters have been typed, consider the following to be in
1301      * another mapping.  Search string will be kept in history. */
1302     ++maptick;
1303 }
1304 
1305 /*
1306  * Sync undo.  Called when typed characters are obtained from the typeahead
1307  * buffer, or when a menu is used.
1308  * Do not sync:
1309  * - In Insert mode, unless cursor key has been used.
1310  * - While reading a script file.
1311  * - When no_u_sync is non-zero.
1312  */
1313     static void
1314 may_sync_undo()
1315 {
1316     if ((!(State & (INSERT + CMDLINE)) || arrow_used)
1317 					       && scriptin[curscript] == NULL)
1318 	u_sync(FALSE);
1319 }
1320 
1321 /*
1322  * Make "typebuf" empty and allocate new buffers.
1323  * Returns FAIL when out of memory.
1324  */
1325     int
1326 alloc_typebuf()
1327 {
1328     typebuf.tb_buf = alloc(TYPELEN_INIT);
1329     typebuf.tb_noremap = alloc(TYPELEN_INIT);
1330     if (typebuf.tb_buf == NULL || typebuf.tb_noremap == NULL)
1331     {
1332 	free_typebuf();
1333 	return FAIL;
1334     }
1335     typebuf.tb_buflen = TYPELEN_INIT;
1336     typebuf.tb_off = 0;
1337     typebuf.tb_len = 0;
1338     typebuf.tb_maplen = 0;
1339     typebuf.tb_silent = 0;
1340     typebuf.tb_no_abbr_cnt = 0;
1341     if (++typebuf.tb_change_cnt == 0)
1342 	typebuf.tb_change_cnt = 1;
1343     return OK;
1344 }
1345 
1346 /*
1347  * Free the buffers of "typebuf".
1348  */
1349     void
1350 free_typebuf()
1351 {
1352     if (typebuf.tb_buf == typebuf_init)
1353 	EMSG2(_(e_intern2), "Free typebuf 1");
1354     else
1355 	vim_free(typebuf.tb_buf);
1356     if (typebuf.tb_noremap == noremapbuf_init)
1357 	EMSG2(_(e_intern2), "Free typebuf 2");
1358     else
1359 	vim_free(typebuf.tb_noremap);
1360 }
1361 
1362 /*
1363  * When doing ":so! file", the current typeahead needs to be saved, and
1364  * restored when "file" has been read completely.
1365  */
1366 static typebuf_T saved_typebuf[NSCRIPT];
1367 
1368     int
1369 save_typebuf()
1370 {
1371     init_typebuf();
1372     saved_typebuf[curscript] = typebuf;
1373     /* If out of memory: restore typebuf and close file. */
1374     if (alloc_typebuf() == FAIL)
1375     {
1376 	closescript();
1377 	return FAIL;
1378     }
1379     return OK;
1380 }
1381 
1382 static int old_char = -1;	/* character put back by vungetc() */
1383 static int old_mod_mask;	/* mod_mask for ungotten character */
1384 #ifdef FEAT_MOUSE
1385 static int old_mouse_row;	/* mouse_row related to old_char */
1386 static int old_mouse_col;	/* mouse_col related to old_char */
1387 #endif
1388 
1389 #if defined(FEAT_EVAL) || defined(FEAT_EX_EXTRA) || defined(PROTO)
1390 
1391 /*
1392  * Save all three kinds of typeahead, so that the user must type at a prompt.
1393  */
1394     void
1395 save_typeahead(tp)
1396     tasave_T	*tp;
1397 {
1398     tp->save_typebuf = typebuf;
1399     tp->typebuf_valid = (alloc_typebuf() == OK);
1400     if (!tp->typebuf_valid)
1401 	typebuf = tp->save_typebuf;
1402 
1403     tp->old_char = old_char;
1404     tp->old_mod_mask = old_mod_mask;
1405     old_char = -1;
1406 
1407     tp->save_readbuf1 = readbuf1;
1408     readbuf1.bh_first.b_next = NULL;
1409     tp->save_readbuf2 = readbuf2;
1410     readbuf2.bh_first.b_next = NULL;
1411 # ifdef USE_INPUT_BUF
1412     tp->save_inputbuf = get_input_buf();
1413 # endif
1414 }
1415 
1416 /*
1417  * Restore the typeahead to what it was before calling save_typeahead().
1418  * The allocated memory is freed, can only be called once!
1419  */
1420     void
1421 restore_typeahead(tp)
1422     tasave_T	*tp;
1423 {
1424     if (tp->typebuf_valid)
1425     {
1426 	free_typebuf();
1427 	typebuf = tp->save_typebuf;
1428     }
1429 
1430     old_char = tp->old_char;
1431     old_mod_mask = tp->old_mod_mask;
1432 
1433     free_buff(&readbuf1);
1434     readbuf1 = tp->save_readbuf1;
1435     free_buff(&readbuf2);
1436     readbuf2 = tp->save_readbuf2;
1437 # ifdef USE_INPUT_BUF
1438     set_input_buf(tp->save_inputbuf);
1439 # endif
1440 }
1441 #endif
1442 
1443 /*
1444  * Open a new script file for the ":source!" command.
1445  */
1446     void
1447 openscript(name, directly)
1448     char_u	*name;
1449     int		directly;	/* when TRUE execute directly */
1450 {
1451     if (curscript + 1 == NSCRIPT)
1452     {
1453 	EMSG(_(e_nesting));
1454 	return;
1455     }
1456 #ifdef FEAT_EVAL
1457     if (ignore_script)
1458 	/* Not reading from script, also don't open one.  Warning message? */
1459 	return;
1460 #endif
1461 
1462     if (scriptin[curscript] != NULL)	/* already reading script */
1463 	++curscript;
1464 				/* use NameBuff for expanded name */
1465     expand_env(name, NameBuff, MAXPATHL);
1466     if ((scriptin[curscript] = mch_fopen((char *)NameBuff, READBIN)) == NULL)
1467     {
1468 	EMSG2(_(e_notopen), name);
1469 	if (curscript)
1470 	    --curscript;
1471 	return;
1472     }
1473     if (save_typebuf() == FAIL)
1474 	return;
1475 
1476     /*
1477      * Execute the commands from the file right now when using ":source!"
1478      * after ":global" or ":argdo" or in a loop.  Also when another command
1479      * follows.  This means the display won't be updated.  Don't do this
1480      * always, "make test" would fail.
1481      */
1482     if (directly)
1483     {
1484 	oparg_T	oa;
1485 	int	oldcurscript;
1486 	int	save_State = State;
1487 	int	save_restart_edit = restart_edit;
1488 	int	save_insertmode = p_im;
1489 	int	save_finish_op = finish_op;
1490 	int	save_msg_scroll = msg_scroll;
1491 
1492 	State = NORMAL;
1493 	msg_scroll = FALSE;	/* no msg scrolling in Normal mode */
1494 	restart_edit = 0;	/* don't go to Insert mode */
1495 	p_im = FALSE;		/* don't use 'insertmode' */
1496 	clear_oparg(&oa);
1497 	finish_op = FALSE;
1498 
1499 	oldcurscript = curscript;
1500 	do
1501 	{
1502 	    update_topline_cursor();	/* update cursor position and topline */
1503 	    normal_cmd(&oa, FALSE);	/* execute one command */
1504 	    vpeekc();			/* check for end of file */
1505 	}
1506 	while (scriptin[oldcurscript] != NULL);
1507 
1508 	State = save_State;
1509 	msg_scroll = save_msg_scroll;
1510 	restart_edit = save_restart_edit;
1511 	p_im = save_insertmode;
1512 	finish_op = save_finish_op;
1513     }
1514 }
1515 
1516 /*
1517  * Close the currently active input script.
1518  */
1519     static void
1520 closescript()
1521 {
1522     free_typebuf();
1523     typebuf = saved_typebuf[curscript];
1524 
1525     fclose(scriptin[curscript]);
1526     scriptin[curscript] = NULL;
1527     if (curscript > 0)
1528 	--curscript;
1529 }
1530 
1531 #if defined(EXITFREE) || defined(PROTO)
1532     void
1533 close_all_scripts()
1534 {
1535     while (scriptin[0] != NULL)
1536 	closescript();
1537 }
1538 #endif
1539 
1540 #if defined(FEAT_INS_EXPAND) || defined(PROTO)
1541 /*
1542  * Return TRUE when reading keys from a script file.
1543  */
1544     int
1545 using_script()
1546 {
1547     return scriptin[curscript] != NULL;
1548 }
1549 #endif
1550 
1551 /*
1552  * This function is called just before doing a blocking wait.  Thus after
1553  * waiting 'updatetime' for a character to arrive.
1554  */
1555     void
1556 before_blocking()
1557 {
1558     updatescript(0);
1559 #ifdef FEAT_EVAL
1560     if (may_garbage_collect)
1561 	garbage_collect();
1562 #endif
1563 }
1564 
1565 /*
1566  * updatescipt() is called when a character can be written into the script file
1567  * or when we have waited some time for a character (c == 0)
1568  *
1569  * All the changed memfiles are synced if c == 0 or when the number of typed
1570  * characters reaches 'updatecount' and 'updatecount' is non-zero.
1571  */
1572     void
1573 updatescript(c)
1574     int c;
1575 {
1576     static int	    count = 0;
1577 
1578     if (c && scriptout)
1579 	putc(c, scriptout);
1580     if (c == 0 || (p_uc > 0 && ++count >= p_uc))
1581     {
1582 	ml_sync_all(c == 0, TRUE);
1583 	count = 0;
1584     }
1585 }
1586 
1587 /*
1588  * Get the next input character.
1589  * Can return a special key or a multi-byte character.
1590  * Can return NUL when called recursively, use safe_vgetc() if that's not
1591  * wanted.
1592  * This translates escaped K_SPECIAL and CSI bytes to a K_SPECIAL or CSI byte.
1593  * Collects the bytes of a multibyte character into the whole character.
1594  * Returns the modifiers in the global "mod_mask".
1595  */
1596     int
1597 vgetc()
1598 {
1599     int		c, c2;
1600 #ifdef FEAT_MBYTE
1601     int		n;
1602     char_u	buf[MB_MAXBYTES + 1];
1603     int		i;
1604 #endif
1605 
1606 #ifdef FEAT_EVAL
1607     /* Do garbage collection when garbagecollect() was called previously and
1608      * we are now at the toplevel. */
1609     if (may_garbage_collect && want_garbage_collect)
1610 	garbage_collect();
1611 #endif
1612 
1613     /*
1614      * If a character was put back with vungetc, it was already processed.
1615      * Return it directly.
1616      */
1617     if (old_char != -1)
1618     {
1619 	c = old_char;
1620 	old_char = -1;
1621 	mod_mask = old_mod_mask;
1622 #ifdef FEAT_MOUSE
1623 	mouse_row = old_mouse_row;
1624 	mouse_col = old_mouse_col;
1625 #endif
1626     }
1627     else
1628     {
1629       mod_mask = 0x0;
1630       last_recorded_len = 0;
1631       for (;;)			/* this is done twice if there are modifiers */
1632       {
1633 	int did_inc = FALSE;
1634 
1635 	if (mod_mask)		/* no mapping after modifier has been read */
1636 	{
1637 	    ++no_mapping;
1638 	    ++allow_keys;
1639 	    did_inc = TRUE;	/* mod_mask may change value */
1640 	}
1641 	c = vgetorpeek(TRUE);
1642 	if (did_inc)
1643 	{
1644 	    --no_mapping;
1645 	    --allow_keys;
1646 	}
1647 
1648 	/* Get two extra bytes for special keys */
1649 	if (c == K_SPECIAL
1650 #ifdef FEAT_GUI
1651 		|| c == CSI
1652 #endif
1653 	   )
1654 	{
1655 	    int	    save_allow_keys = allow_keys;
1656 
1657 	    ++no_mapping;
1658 	    allow_keys = 0;		/* make sure BS is not found */
1659 	    c2 = vgetorpeek(TRUE);	/* no mapping for these chars */
1660 	    c = vgetorpeek(TRUE);
1661 	    --no_mapping;
1662 	    allow_keys = save_allow_keys;
1663 	    if (c2 == KS_MODIFIER)
1664 	    {
1665 		mod_mask = c;
1666 		continue;
1667 	    }
1668 	    c = TO_SPECIAL(c2, c);
1669 
1670 #if defined(FEAT_GUI_W32) && defined(FEAT_MENU) && defined(FEAT_TEAROFF)
1671 	    /* Handle K_TEAROFF here, the caller of vgetc() doesn't need to
1672 	     * know that a menu was torn off */
1673 	    if (c == K_TEAROFF)
1674 	    {
1675 		char_u	name[200];
1676 		int	i;
1677 
1678 		/* get menu path, it ends with a <CR> */
1679 		for (i = 0; (c = vgetorpeek(TRUE)) != '\r'; )
1680 		{
1681 		    name[i] = c;
1682 		    if (i < 199)
1683 			++i;
1684 		}
1685 		name[i] = NUL;
1686 		gui_make_tearoff(name);
1687 		continue;
1688 	    }
1689 #endif
1690 #if defined(FEAT_GUI) && defined(FEAT_GUI_GTK) && defined(FEAT_MENU)
1691 	    /* GTK: <F10> normally selects the menu, but it's passed until
1692 	     * here to allow mapping it.  Intercept and invoke the GTK
1693 	     * behavior if it's not mapped. */
1694 	    if (c == K_F10 && gui.menubar != NULL)
1695 	    {
1696 		gtk_menu_shell_select_first(GTK_MENU_SHELL(gui.menubar), FALSE);
1697 		continue;
1698 	    }
1699 #endif
1700 #ifdef FEAT_GUI
1701 	    /* Handle focus event here, so that the caller doesn't need to
1702 	     * know about it.  Return K_IGNORE so that we loop once (needed if
1703 	     * 'lazyredraw' is set). */
1704 	    if (c == K_FOCUSGAINED || c == K_FOCUSLOST)
1705 	    {
1706 		ui_focus_change(c == K_FOCUSGAINED);
1707 		c = K_IGNORE;
1708 	    }
1709 
1710 	    /* Translate K_CSI to CSI.  The special key is only used to avoid
1711 	     * it being recognized as the start of a special key. */
1712 	    if (c == K_CSI)
1713 		c = CSI;
1714 #endif
1715 	}
1716 #ifdef MSDOS
1717 	/*
1718 	 * If K_NUL was typed, it is replaced by K_NUL, 3 in mch_inchar().
1719 	 * Delete the 3 here.
1720 	 */
1721 	else if (c == K_NUL && vpeekc() == 3)
1722 	    (void)vgetorpeek(TRUE);
1723 #endif
1724 
1725 	/* a keypad or special function key was not mapped, use it like
1726 	 * its ASCII equivalent */
1727 	switch (c)
1728 	{
1729 	    case K_KPLUS:		c = '+'; break;
1730 	    case K_KMINUS:		c = '-'; break;
1731 	    case K_KDIVIDE:		c = '/'; break;
1732 	    case K_KMULTIPLY:	c = '*'; break;
1733 	    case K_KENTER:		c = CAR; break;
1734 	    case K_KPOINT:
1735 #ifdef WIN32
1736 				    /* Can be either '.' or a ',', *
1737 				     * depending on the type of keypad. */
1738 				    c = MapVirtualKey(VK_DECIMAL, 2); break;
1739 #else
1740 				    c = '.'; break;
1741 #endif
1742 	    case K_K0:		c = '0'; break;
1743 	    case K_K1:		c = '1'; break;
1744 	    case K_K2:		c = '2'; break;
1745 	    case K_K3:		c = '3'; break;
1746 	    case K_K4:		c = '4'; break;
1747 	    case K_K5:		c = '5'; break;
1748 	    case K_K6:		c = '6'; break;
1749 	    case K_K7:		c = '7'; break;
1750 	    case K_K8:		c = '8'; break;
1751 	    case K_K9:		c = '9'; break;
1752 
1753 	    case K_XHOME:
1754 	    case K_ZHOME:	if (mod_mask == MOD_MASK_SHIFT)
1755 				{
1756 				    c = K_S_HOME;
1757 				    mod_mask = 0;
1758 				}
1759 				else if (mod_mask == MOD_MASK_CTRL)
1760 				{
1761 				    c = K_C_HOME;
1762 				    mod_mask = 0;
1763 				}
1764 				else
1765 				    c = K_HOME;
1766 				break;
1767 	    case K_XEND:
1768 	    case K_ZEND:	if (mod_mask == MOD_MASK_SHIFT)
1769 				{
1770 				    c = K_S_END;
1771 				    mod_mask = 0;
1772 				}
1773 				else if (mod_mask == MOD_MASK_CTRL)
1774 				{
1775 				    c = K_C_END;
1776 				    mod_mask = 0;
1777 				}
1778 				else
1779 				    c = K_END;
1780 				break;
1781 
1782 	    case K_XUP:		c = K_UP; break;
1783 	    case K_XDOWN:	c = K_DOWN; break;
1784 	    case K_XLEFT:	c = K_LEFT; break;
1785 	    case K_XRIGHT:	c = K_RIGHT; break;
1786 	}
1787 
1788 #ifdef FEAT_MBYTE
1789 	/* For a multi-byte character get all the bytes and return the
1790 	 * converted character.
1791 	 * Note: This will loop until enough bytes are received!
1792 	 */
1793 	if (has_mbyte && (n = MB_BYTE2LEN_CHECK(c)) > 1)
1794 	{
1795 	    ++no_mapping;
1796 	    buf[0] = c;
1797 	    for (i = 1; i < n; ++i)
1798 	    {
1799 		buf[i] = vgetorpeek(TRUE);
1800 		if (buf[i] == K_SPECIAL
1801 #ifdef FEAT_GUI
1802 			|| buf[i] == CSI
1803 #endif
1804 			)
1805 		{
1806 		    /* Must be a K_SPECIAL - KS_SPECIAL - KE_FILLER sequence,
1807 		     * which represents a K_SPECIAL (0x80),
1808 		     * or a CSI - KS_EXTRA - KE_CSI sequence, which represents
1809 		     * a CSI (0x9B),
1810 		     * of a K_SPECIAL - KS_EXTRA - KE_CSI, which is CSI too. */
1811 		    c = vgetorpeek(TRUE);
1812 		    if (vgetorpeek(TRUE) == (int)KE_CSI && c == KS_EXTRA)
1813 			buf[i] = CSI;
1814 		}
1815 	    }
1816 	    --no_mapping;
1817 	    c = (*mb_ptr2char)(buf);
1818 	}
1819 #endif
1820 
1821 	break;
1822       }
1823     }
1824 
1825 #ifdef FEAT_EVAL
1826     /*
1827      * In the main loop "may_garbage_collect" can be set to do garbage
1828      * collection in the first next vgetc().  It's disabled after that to
1829      * avoid internally used Lists and Dicts to be freed.
1830      */
1831     may_garbage_collect = FALSE;
1832 #endif
1833 
1834     return c;
1835 }
1836 
1837 /*
1838  * Like vgetc(), but never return a NUL when called recursively, get a key
1839  * directly from the user (ignoring typeahead).
1840  */
1841     int
1842 safe_vgetc()
1843 {
1844     int	c;
1845 
1846     c = vgetc();
1847     if (c == NUL)
1848 	c = get_keystroke();
1849     return c;
1850 }
1851 
1852 /*
1853  * Like safe_vgetc(), but loop to handle K_IGNORE.
1854  * Also ignore scrollbar events.
1855  */
1856     int
1857 plain_vgetc()
1858 {
1859     int c;
1860 
1861     do
1862     {
1863 	c = safe_vgetc();
1864     } while (c == K_IGNORE || c == K_VER_SCROLLBAR || c == K_HOR_SCROLLBAR);
1865     return c;
1866 }
1867 
1868 /*
1869  * Check if a character is available, such that vgetc() will not block.
1870  * If the next character is a special character or multi-byte, the returned
1871  * character is not valid!.
1872  */
1873     int
1874 vpeekc()
1875 {
1876     if (old_char != -1)
1877 	return old_char;
1878     return vgetorpeek(FALSE);
1879 }
1880 
1881 #if defined(FEAT_TERMRESPONSE) || defined(PROTO)
1882 /*
1883  * Like vpeekc(), but don't allow mapping.  Do allow checking for terminal
1884  * codes.
1885  */
1886     int
1887 vpeekc_nomap()
1888 {
1889     int		c;
1890 
1891     ++no_mapping;
1892     ++allow_keys;
1893     c = vpeekc();
1894     --no_mapping;
1895     --allow_keys;
1896     return c;
1897 }
1898 #endif
1899 
1900 #if defined(FEAT_INS_EXPAND) || defined(FEAT_EVAL) || defined(PROTO)
1901 /*
1902  * Check if any character is available, also half an escape sequence.
1903  * Trick: when no typeahead found, but there is something in the typeahead
1904  * buffer, it must be an ESC that is recognized as the start of a key code.
1905  */
1906     int
1907 vpeekc_any()
1908 {
1909     int		c;
1910 
1911     c = vpeekc();
1912     if (c == NUL && typebuf.tb_len > 0)
1913 	c = ESC;
1914     return c;
1915 }
1916 #endif
1917 
1918 /*
1919  * Call vpeekc() without causing anything to be mapped.
1920  * Return TRUE if a character is available, FALSE otherwise.
1921  */
1922     int
1923 char_avail()
1924 {
1925     int	    retval;
1926 
1927     ++no_mapping;
1928     retval = vpeekc();
1929     --no_mapping;
1930     return (retval != NUL);
1931 }
1932 
1933     void
1934 vungetc(c)	/* unget one character (can only be done once!) */
1935     int		c;
1936 {
1937     old_char = c;
1938     old_mod_mask = mod_mask;
1939 #ifdef FEAT_MOUSE
1940     old_mouse_row = mouse_row;
1941     old_mouse_col = mouse_col;
1942 #endif
1943 }
1944 
1945 /*
1946  * get a character:
1947  * 1. from the stuffbuffer
1948  *	This is used for abbreviated commands like "D" -> "d$".
1949  *	Also used to redo a command for ".".
1950  * 2. from the typeahead buffer
1951  *	Stores text obtained previously but not used yet.
1952  *	Also stores the result of mappings.
1953  *	Also used for the ":normal" command.
1954  * 3. from the user
1955  *	This may do a blocking wait if "advance" is TRUE.
1956  *
1957  * if "advance" is TRUE (vgetc()):
1958  *	really get the character.
1959  *	KeyTyped is set to TRUE in the case the user typed the key.
1960  *	KeyStuffed is TRUE if the character comes from the stuff buffer.
1961  * if "advance" is FALSE (vpeekc()):
1962  *	just look whether there is a character available.
1963  *
1964  * When "no_mapping" is zero, checks for mappings in the current mode.
1965  * Only returns one byte (of a multi-byte character).
1966  * K_SPECIAL and CSI may be escaped, need to get two more bytes then.
1967  */
1968     static int
1969 vgetorpeek(advance)
1970     int	    advance;
1971 {
1972     int		c, c1;
1973     int		keylen;
1974     char_u	*s;
1975     mapblock_T	*mp;
1976 #ifdef FEAT_LOCALMAP
1977     mapblock_T	*mp2;
1978 #endif
1979     mapblock_T	*mp_match;
1980     int		mp_match_len = 0;
1981     int		timedout = FALSE;	    /* waited for more than 1 second
1982 						for mapping to complete */
1983     int		mapdepth = 0;	    /* check for recursive mapping */
1984     int		mode_deleted = FALSE;   /* set when mode has been deleted */
1985     int		local_State;
1986     int		mlen;
1987     int		max_mlen;
1988     int		i;
1989 #ifdef FEAT_CMDL_INFO
1990     int		new_wcol, new_wrow;
1991 #endif
1992 #ifdef FEAT_GUI
1993 # ifdef FEAT_MENU
1994     int		idx;
1995 # endif
1996     int		shape_changed = FALSE;  /* adjusted cursor shape */
1997 #endif
1998     int		n;
1999 #ifdef FEAT_LANGMAP
2000     int		nolmaplen;
2001 #endif
2002     int		old_wcol, old_wrow;
2003     int		wait_tb_len;
2004 
2005     /*
2006      * This function doesn't work very well when called recursively.  This may
2007      * happen though, because of:
2008      * 1. The call to add_to_showcmd().	char_avail() is then used to check if
2009      * there is a character available, which calls this function.  In that
2010      * case we must return NUL, to indicate no character is available.
2011      * 2. A GUI callback function writes to the screen, causing a
2012      * wait_return().
2013      * Using ":normal" can also do this, but it saves the typeahead buffer,
2014      * thus it should be OK.  But don't get a key from the user then.
2015      */
2016     if (vgetc_busy > 0
2017 #ifdef FEAT_EX_EXTRA
2018 	    && ex_normal_busy == 0
2019 #endif
2020 	    )
2021 	return NUL;
2022 
2023     local_State = get_real_state();
2024 
2025     ++vgetc_busy;
2026 
2027     if (advance)
2028 	KeyStuffed = FALSE;
2029 
2030     init_typebuf();
2031     start_stuff();
2032     if (advance && typebuf.tb_maplen == 0)
2033 	Exec_reg = FALSE;
2034     do
2035     {
2036 /*
2037  * get a character: 1. from the stuffbuffer
2038  */
2039 	if (typeahead_char != 0)
2040 	{
2041 	    c = typeahead_char;
2042 	    if (advance)
2043 		typeahead_char = 0;
2044 	}
2045 	else
2046 	    c = read_readbuffers(advance);
2047 	if (c != NUL && !got_int)
2048 	{
2049 	    if (advance)
2050 	    {
2051 		/* KeyTyped = FALSE;  When the command that stuffed something
2052 		 * was typed, behave like the stuffed command was typed.
2053 		 * needed for CTRL-W CTRl-] to open a fold, for example. */
2054 		KeyStuffed = TRUE;
2055 	    }
2056 	    if (typebuf.tb_no_abbr_cnt == 0)
2057 		typebuf.tb_no_abbr_cnt = 1;	/* no abbreviations now */
2058 	}
2059 	else
2060 	{
2061 	    /*
2062 	     * Loop until we either find a matching mapped key, or we
2063 	     * are sure that it is not a mapped key.
2064 	     * If a mapped key sequence is found we go back to the start to
2065 	     * try re-mapping.
2066 	     */
2067 	    for (;;)
2068 	    {
2069 		/*
2070 		 * ui_breakcheck() is slow, don't use it too often when
2071 		 * inside a mapping.  But call it each time for typed
2072 		 * characters.
2073 		 */
2074 		if (typebuf.tb_maplen)
2075 		    line_breakcheck();
2076 		else
2077 		    ui_breakcheck();		/* check for CTRL-C */
2078 		keylen = 0;
2079 		if (got_int)
2080 		{
2081 		    /* flush all input */
2082 		    c = inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 0L,
2083 						       typebuf.tb_change_cnt);
2084 		    /*
2085 		     * If inchar() returns TRUE (script file was active) or we
2086 		     * are inside a mapping, get out of insert mode.
2087 		     * Otherwise we behave like having gotten a CTRL-C.
2088 		     * As a result typing CTRL-C in insert mode will
2089 		     * really insert a CTRL-C.
2090 		     */
2091 		    if ((c || typebuf.tb_maplen)
2092 					      && (State & (INSERT + CMDLINE)))
2093 			c = ESC;
2094 		    else
2095 			c = Ctrl_C;
2096 		    flush_buffers(TRUE);	/* flush all typeahead */
2097 
2098 		    if (advance)
2099 		    {
2100 			/* Also record this character, it might be needed to
2101 			 * get out of Insert mode. */
2102 			*typebuf.tb_buf = c;
2103 			gotchars(typebuf.tb_buf, 1);
2104 		    }
2105 		    cmd_silent = FALSE;
2106 
2107 		    break;
2108 		}
2109 		else if (typebuf.tb_len > 0)
2110 		{
2111 		    /*
2112 		     * Check for a mappable key sequence.
2113 		     * Walk through one maphash[] list until we find an
2114 		     * entry that matches.
2115 		     *
2116 		     * Don't look for mappings if:
2117 		     * - no_mapping set: mapping disabled (e.g. for CTRL-V)
2118 		     * - maphash_valid not set: no mappings present.
2119 		     * - typebuf.tb_buf[typebuf.tb_off] should not be remapped
2120 		     * - in insert or cmdline mode and 'paste' option set
2121 		     * - waiting for "hit return to continue" and CR or SPACE
2122 		     *	 typed
2123 		     * - waiting for a char with --more--
2124 		     * - in Ctrl-X mode, and we get a valid char for that mode
2125 		     */
2126 		    mp = NULL;
2127 		    max_mlen = 0;
2128 		    c1 = typebuf.tb_buf[typebuf.tb_off];
2129 		    if (no_mapping == 0 && maphash_valid
2130 			    && (no_zero_mapping == 0 || c1 != '0')
2131 			    && (typebuf.tb_maplen == 0
2132 				|| (p_remap
2133 				    && (typebuf.tb_noremap[typebuf.tb_off]
2134 						    & (RM_NONE|RM_ABBR)) == 0))
2135 			    && !(p_paste && (State & (INSERT + CMDLINE)))
2136 			    && !(State == HITRETURN && (c1 == CAR || c1 == ' '))
2137 			    && State != ASKMORE
2138 			    && State != CONFIRM
2139 #ifdef FEAT_INS_EXPAND
2140 			    && !((ctrl_x_mode != 0 && vim_is_ctrl_x_key(c1))
2141 				    || ((compl_cont_status & CONT_LOCAL)
2142 					&& (c1 == Ctrl_N || c1 == Ctrl_P)))
2143 #endif
2144 			    )
2145 		    {
2146 #ifdef FEAT_LANGMAP
2147 			if (c1 == K_SPECIAL)
2148 			    nolmaplen = 2;
2149 			else
2150 			{
2151 			    LANGMAP_ADJUST(c1,
2152 					   (State & (CMDLINE | INSERT)) == 0);
2153 			    nolmaplen = 0;
2154 			}
2155 #endif
2156 #ifdef FEAT_LOCALMAP
2157 			/* First try buffer-local mappings. */
2158 			mp = curbuf->b_maphash[MAP_HASH(local_State, c1)];
2159 			mp2 = maphash[MAP_HASH(local_State, c1)];
2160 			if (mp == NULL)
2161 			{
2162 			    /* There are no buffer-local mappings. */
2163 			    mp = mp2;
2164 			    mp2 = NULL;
2165 			}
2166 #else
2167 			mp = maphash[MAP_HASH(local_State, c1)];
2168 #endif
2169 			/*
2170 			 * Loop until a partly matching mapping is found or
2171 			 * all (local) mappings have been checked.
2172 			 * The longest full match is remembered in "mp_match".
2173 			 * A full match is only accepted if there is no partly
2174 			 * match, so "aa" and "aaa" can both be mapped.
2175 			 */
2176 			mp_match = NULL;
2177 			mp_match_len = 0;
2178 			for ( ; mp != NULL;
2179 #ifdef FEAT_LOCALMAP
2180 				mp->m_next == NULL ? (mp = mp2, mp2 = NULL) :
2181 #endif
2182 				(mp = mp->m_next))
2183 			{
2184 			    /*
2185 			     * Only consider an entry if the first character
2186 			     * matches and it is for the current state.
2187 			     * Skip ":lmap" mappings if keys were mapped.
2188 			     */
2189 			    if (mp->m_keys[0] == c1
2190 				    && (mp->m_mode & local_State)
2191 				    && ((mp->m_mode & LANGMAP) == 0
2192 					|| typebuf.tb_maplen == 0))
2193 			    {
2194 #ifdef FEAT_LANGMAP
2195 				int	nomap = nolmaplen;
2196 				int	c2;
2197 #endif
2198 				/* find the match length of this mapping */
2199 				for (mlen = 1; mlen < typebuf.tb_len; ++mlen)
2200 				{
2201 #ifdef FEAT_LANGMAP
2202 				    c2 = typebuf.tb_buf[typebuf.tb_off + mlen];
2203 				    if (nomap > 0)
2204 					--nomap;
2205 				    else if (c2 == K_SPECIAL)
2206 					nomap = 2;
2207 				    else
2208 					LANGMAP_ADJUST(c2, TRUE);
2209 				    if (mp->m_keys[mlen] != c2)
2210 #else
2211 				    if (mp->m_keys[mlen] !=
2212 					typebuf.tb_buf[typebuf.tb_off + mlen])
2213 #endif
2214 					break;
2215 				}
2216 
2217 #ifdef FEAT_MBYTE
2218 				/* Don't allow mapping the first byte(s) of a
2219 				 * multi-byte char.  Happens when mapping
2220 				 * <M-a> and then changing 'encoding'. Beware
2221 				 * that 0x80 is escaped. */
2222 				{
2223 				    char_u *p1 = mp->m_keys;
2224 				    char_u *p2 = mb_unescape(&p1);
2225 
2226 				    if (has_mbyte && p2 != NULL
2227 					  && MB_BYTE2LEN(c1) > MB_PTR2LEN(p2))
2228 					mlen = 0;
2229 				}
2230 #endif
2231 				/*
2232 				 * Check an entry whether it matches.
2233 				 * - Full match: mlen == keylen
2234 				 * - Partly match: mlen == typebuf.tb_len
2235 				 */
2236 				keylen = mp->m_keylen;
2237 				if (mlen == keylen
2238 				     || (mlen == typebuf.tb_len
2239 						  && typebuf.tb_len < keylen))
2240 				{
2241 				    /*
2242 				     * If only script-local mappings are
2243 				     * allowed, check if the mapping starts
2244 				     * with K_SNR.
2245 				     */
2246 				    s = typebuf.tb_noremap + typebuf.tb_off;
2247 				    if (*s == RM_SCRIPT
2248 					    && (mp->m_keys[0] != K_SPECIAL
2249 						|| mp->m_keys[1] != KS_EXTRA
2250 						|| mp->m_keys[2]
2251 							      != (int)KE_SNR))
2252 					continue;
2253 				    /*
2254 				     * If one of the typed keys cannot be
2255 				     * remapped, skip the entry.
2256 				     */
2257 				    for (n = mlen; --n >= 0; )
2258 					if (*s++ & (RM_NONE|RM_ABBR))
2259 					    break;
2260 				    if (n >= 0)
2261 					continue;
2262 
2263 				    if (keylen > typebuf.tb_len)
2264 				    {
2265 					if (!timedout && !(mp_match != NULL
2266 						       && mp_match->m_nowait))
2267 					{
2268 					    /* break at a partly match */
2269 					    keylen = KEYLEN_PART_MAP;
2270 					    break;
2271 					}
2272 				    }
2273 				    else if (keylen > mp_match_len)
2274 				    {
2275 					/* found a longer match */
2276 					mp_match = mp;
2277 					mp_match_len = keylen;
2278 				    }
2279 				}
2280 				else
2281 				    /* No match; may have to check for
2282 				     * termcode at next character. */
2283 				    if (max_mlen < mlen)
2284 					max_mlen = mlen;
2285 			    }
2286 			}
2287 
2288 			/* If no partly match found, use the longest full
2289 			 * match. */
2290 			if (keylen != KEYLEN_PART_MAP)
2291 			{
2292 			    mp = mp_match;
2293 			    keylen = mp_match_len;
2294 			}
2295 		    }
2296 
2297 		    /* Check for match with 'pastetoggle' */
2298 		    if (*p_pt != NUL && mp == NULL && (State & (INSERT|NORMAL)))
2299 		    {
2300 			for (mlen = 0; mlen < typebuf.tb_len && p_pt[mlen];
2301 								       ++mlen)
2302 			    if (p_pt[mlen] != typebuf.tb_buf[typebuf.tb_off
2303 								      + mlen])
2304 				    break;
2305 			if (p_pt[mlen] == NUL)	/* match */
2306 			{
2307 			    /* write chars to script file(s) */
2308 			    if (mlen > typebuf.tb_maplen)
2309 				gotchars(typebuf.tb_buf + typebuf.tb_off
2310 							  + typebuf.tb_maplen,
2311 						    mlen - typebuf.tb_maplen);
2312 
2313 			    del_typebuf(mlen, 0); /* remove the chars */
2314 			    set_option_value((char_u *)"paste",
2315 						     (long)!p_paste, NULL, 0);
2316 			    if (!(State & INSERT))
2317 			    {
2318 				msg_col = 0;
2319 				msg_row = Rows - 1;
2320 				msg_clr_eos();		/* clear ruler */
2321 			    }
2322 #ifdef FEAT_WINDOWS
2323 			    status_redraw_all();
2324 			    redraw_statuslines();
2325 #endif
2326 			    showmode();
2327 			    setcursor();
2328 			    continue;
2329 			}
2330 			/* Need more chars for partly match. */
2331 			if (mlen == typebuf.tb_len)
2332 			    keylen = KEYLEN_PART_KEY;
2333 			else if (max_mlen < mlen)
2334 			    /* no match, may have to check for termcode at
2335 			     * next character */
2336 			    max_mlen = mlen + 1;
2337 		    }
2338 
2339 		    if ((mp == NULL || max_mlen >= mp_match_len)
2340 						 && keylen != KEYLEN_PART_MAP)
2341 		    {
2342 			int	save_keylen = keylen;
2343 
2344 			/*
2345 			 * When no matching mapping found or found a
2346 			 * non-matching mapping that matches at least what the
2347 			 * matching mapping matched:
2348 			 * Check if we have a terminal code, when:
2349 			 *  mapping is allowed,
2350 			 *  keys have not been mapped,
2351 			 *  and not an ESC sequence, not in insert mode or
2352 			 *	p_ek is on,
2353 			 *  and when not timed out,
2354 			 */
2355 			if ((no_mapping == 0 || allow_keys != 0)
2356 				&& (typebuf.tb_maplen == 0
2357 				    || (p_remap && typebuf.tb_noremap[
2358 						   typebuf.tb_off] == RM_YES))
2359 				&& !timedout)
2360 			{
2361 			    keylen = check_termcode(max_mlen + 1,
2362 							       NULL, 0, NULL);
2363 
2364 			    /* If no termcode matched but 'pastetoggle'
2365 			     * matched partially it's like an incomplete key
2366 			     * sequence. */
2367 			    if (keylen == 0 && save_keylen == KEYLEN_PART_KEY)
2368 				keylen = KEYLEN_PART_KEY;
2369 
2370 			    /*
2371 			     * When getting a partial match, but the last
2372 			     * characters were not typed, don't wait for a
2373 			     * typed character to complete the termcode.
2374 			     * This helps a lot when a ":normal" command ends
2375 			     * in an ESC.
2376 			     */
2377 			    if (keylen < 0
2378 				       && typebuf.tb_len == typebuf.tb_maplen)
2379 				keylen = 0;
2380 			}
2381 			else
2382 			    keylen = 0;
2383 			if (keylen == 0)	/* no matching terminal code */
2384 			{
2385 #ifdef AMIGA			/* check for window bounds report */
2386 			    if (typebuf.tb_maplen == 0 && (typebuf.tb_buf[
2387 					       typebuf.tb_off] & 0xff) == CSI)
2388 			    {
2389 				for (s = typebuf.tb_buf + typebuf.tb_off + 1;
2390 					s < typebuf.tb_buf + typebuf.tb_off
2391 							      + typebuf.tb_len
2392 				   && (VIM_ISDIGIT(*s) || *s == ';'
2393 								|| *s == ' ');
2394 					++s)
2395 				    ;
2396 				if (*s == 'r' || *s == '|') /* found one */
2397 				{
2398 				    del_typebuf((int)(s + 1 -
2399 				       (typebuf.tb_buf + typebuf.tb_off)), 0);
2400 				    /* get size and redraw screen */
2401 				    shell_resized();
2402 				    continue;
2403 				}
2404 				if (*s == NUL)	    /* need more characters */
2405 				    keylen = KEYLEN_PART_KEY;
2406 			    }
2407 			    if (keylen >= 0)
2408 #endif
2409 			      /* When there was a matching mapping and no
2410 			       * termcode could be replaced after another one,
2411 			       * use that mapping (loop around). If there was
2412 			       * no mapping use the character from the
2413 			       * typeahead buffer right here. */
2414 			      if (mp == NULL)
2415 			      {
2416 /*
2417  * get a character: 2. from the typeahead buffer
2418  */
2419 				c = typebuf.tb_buf[typebuf.tb_off] & 255;
2420 				if (advance)	/* remove chars from tb_buf */
2421 				{
2422 				    cmd_silent = (typebuf.tb_silent > 0);
2423 				    if (typebuf.tb_maplen > 0)
2424 					KeyTyped = FALSE;
2425 				    else
2426 				    {
2427 					KeyTyped = TRUE;
2428 					/* write char to script file(s) */
2429 					gotchars(typebuf.tb_buf
2430 							 + typebuf.tb_off, 1);
2431 				    }
2432 				    KeyNoremap = typebuf.tb_noremap[
2433 							      typebuf.tb_off];
2434 				    del_typebuf(1, 0);
2435 				}
2436 				break;	    /* got character, break for loop */
2437 			      }
2438 			}
2439 			if (keylen > 0)	    /* full matching terminal code */
2440 			{
2441 #if defined(FEAT_GUI) && defined(FEAT_MENU)
2442 			    if (typebuf.tb_len >= 2
2443 				&& typebuf.tb_buf[typebuf.tb_off] == K_SPECIAL
2444 					 && typebuf.tb_buf[typebuf.tb_off + 1]
2445 								   == KS_MENU)
2446 			    {
2447 				/*
2448 				 * Using a menu may cause a break in undo!
2449 				 * It's like using gotchars(), but without
2450 				 * recording or writing to a script file.
2451 				 */
2452 				may_sync_undo();
2453 				del_typebuf(3, 0);
2454 				idx = get_menu_index(current_menu, local_State);
2455 				if (idx != MENU_INDEX_INVALID)
2456 				{
2457 				    /*
2458 				     * In Select mode and a Visual mode menu
2459 				     * is used:  Switch to Visual mode
2460 				     * temporarily.  Append K_SELECT to switch
2461 				     * back to Select mode.
2462 				     */
2463 				    if (VIsual_active && VIsual_select
2464 					    && (current_menu->modes & VISUAL))
2465 				    {
2466 					VIsual_select = FALSE;
2467 					(void)ins_typebuf(K_SELECT_STRING,
2468 						  REMAP_NONE, 0, TRUE, FALSE);
2469 				    }
2470 				    ins_typebuf(current_menu->strings[idx],
2471 						current_menu->noremap[idx],
2472 						0, TRUE,
2473 						   current_menu->silent[idx]);
2474 				}
2475 			    }
2476 #endif /* FEAT_GUI && FEAT_MENU */
2477 			    continue;	/* try mapping again */
2478 			}
2479 
2480 			/* Partial match: get some more characters.  When a
2481 			 * matching mapping was found use that one. */
2482 			if (mp == NULL || keylen < 0)
2483 			    keylen = KEYLEN_PART_KEY;
2484 			else
2485 			    keylen = mp_match_len;
2486 		    }
2487 
2488 		    /* complete match */
2489 		    if (keylen >= 0 && keylen <= typebuf.tb_len)
2490 		    {
2491 #ifdef FEAT_EVAL
2492 			int save_m_expr;
2493 			int save_m_noremap;
2494 			int save_m_silent;
2495 			char_u *save_m_keys;
2496 			char_u *save_m_str;
2497 #else
2498 # define save_m_noremap mp->m_noremap
2499 # define save_m_silent mp->m_silent
2500 #endif
2501 
2502 			/* write chars to script file(s) */
2503 			if (keylen > typebuf.tb_maplen)
2504 			    gotchars(typebuf.tb_buf + typebuf.tb_off
2505 							  + typebuf.tb_maplen,
2506 						  keylen - typebuf.tb_maplen);
2507 
2508 			cmd_silent = (typebuf.tb_silent > 0);
2509 			del_typebuf(keylen, 0);	/* remove the mapped keys */
2510 
2511 			/*
2512 			 * Put the replacement string in front of mapstr.
2513 			 * The depth check catches ":map x y" and ":map y x".
2514 			 */
2515 			if (++mapdepth >= p_mmd)
2516 			{
2517 			    EMSG(_("E223: recursive mapping"));
2518 			    if (State & CMDLINE)
2519 				redrawcmdline();
2520 			    else
2521 				setcursor();
2522 			    flush_buffers(FALSE);
2523 			    mapdepth = 0;	/* for next one */
2524 			    c = -1;
2525 			    break;
2526 			}
2527 
2528 			/*
2529 			 * In Select mode and a Visual mode mapping is used:
2530 			 * Switch to Visual mode temporarily.  Append K_SELECT
2531 			 * to switch back to Select mode.
2532 			 */
2533 			if (VIsual_active && VIsual_select
2534 						     && (mp->m_mode & VISUAL))
2535 			{
2536 			    VIsual_select = FALSE;
2537 			    (void)ins_typebuf(K_SELECT_STRING, REMAP_NONE,
2538 							      0, TRUE, FALSE);
2539 			}
2540 
2541 #ifdef FEAT_EVAL
2542 			/* Copy the values from *mp that are used, because
2543 			 * evaluating the expression may invoke a function
2544 			 * that redefines the mapping, thereby making *mp
2545 			 * invalid. */
2546 			save_m_expr = mp->m_expr;
2547 			save_m_noremap = mp->m_noremap;
2548 			save_m_silent = mp->m_silent;
2549 			save_m_keys = NULL;  /* only saved when needed */
2550 			save_m_str = NULL;  /* only saved when needed */
2551 
2552 			/*
2553 			 * Handle ":map <expr>": evaluate the {rhs} as an
2554 			 * expression.  Also save and restore the command line
2555 			 * for "normal :".
2556 			 */
2557 			if (mp->m_expr)
2558 			{
2559 			    int		save_vgetc_busy = vgetc_busy;
2560 
2561 			    vgetc_busy = 0;
2562 			    save_m_keys = vim_strsave(mp->m_keys);
2563 			    save_m_str = vim_strsave(mp->m_str);
2564 			    s = eval_map_expr(save_m_str, NUL);
2565 			    vgetc_busy = save_vgetc_busy;
2566 			}
2567 			else
2568 #endif
2569 			    s = mp->m_str;
2570 
2571 			/*
2572 			 * Insert the 'to' part in the typebuf.tb_buf.
2573 			 * If 'from' field is the same as the start of the
2574 			 * 'to' field, don't remap the first character (but do
2575 			 * allow abbreviations).
2576 			 * If m_noremap is set, don't remap the whole 'to'
2577 			 * part.
2578 			 */
2579 			if (s == NULL)
2580 			    i = FAIL;
2581 			else
2582 			{
2583 			    int noremap;
2584 
2585 			    if (save_m_noremap != REMAP_YES)
2586 				noremap = save_m_noremap;
2587 			    else if (
2588 #ifdef FEAT_EVAL
2589 				STRNCMP(s, save_m_keys != NULL
2590 						   ? save_m_keys : mp->m_keys,
2591 							 (size_t)keylen)
2592 #else
2593 				STRNCMP(s, mp->m_keys, (size_t)keylen)
2594 #endif
2595 				   != 0)
2596 				noremap = REMAP_YES;
2597 			    else
2598 				noremap = REMAP_SKIP;
2599 			    i = ins_typebuf(s, noremap,
2600 					0, TRUE, cmd_silent || save_m_silent);
2601 #ifdef FEAT_EVAL
2602 			    if (save_m_expr)
2603 				vim_free(s);
2604 #endif
2605 			}
2606 #ifdef FEAT_EVAL
2607 			vim_free(save_m_keys);
2608 			vim_free(save_m_str);
2609 #endif
2610 			if (i == FAIL)
2611 			{
2612 			    c = -1;
2613 			    break;
2614 			}
2615 			continue;
2616 		    }
2617 		}
2618 
2619 /*
2620  * get a character: 3. from the user - handle <Esc> in Insert mode
2621  */
2622 		/*
2623 		 * special case: if we get an <ESC> in insert mode and there
2624 		 * are no more characters at once, we pretend to go out of
2625 		 * insert mode.  This prevents the one second delay after
2626 		 * typing an <ESC>.  If we get something after all, we may
2627 		 * have to redisplay the mode. That the cursor is in the wrong
2628 		 * place does not matter.
2629 		 */
2630 		c = 0;
2631 #ifdef FEAT_CMDL_INFO
2632 		new_wcol = curwin->w_wcol;
2633 		new_wrow = curwin->w_wrow;
2634 #endif
2635 		if (	   advance
2636 			&& typebuf.tb_len == 1
2637 			&& typebuf.tb_buf[typebuf.tb_off] == ESC
2638 			&& !no_mapping
2639 #ifdef FEAT_EX_EXTRA
2640 			&& ex_normal_busy == 0
2641 #endif
2642 			&& typebuf.tb_maplen == 0
2643 			&& (State & INSERT)
2644 			&& (p_timeout
2645 			    || (keylen == KEYLEN_PART_KEY && p_ttimeout))
2646 			&& (c = inchar(typebuf.tb_buf + typebuf.tb_off
2647 						     + typebuf.tb_len, 3, 25L,
2648 						 typebuf.tb_change_cnt)) == 0)
2649 		{
2650 		    colnr_T	col = 0, vcol;
2651 		    char_u	*ptr;
2652 
2653 		    if (mode_displayed)
2654 		    {
2655 			unshowmode(TRUE);
2656 			mode_deleted = TRUE;
2657 		    }
2658 #ifdef FEAT_GUI
2659 		    /* may show different cursor shape */
2660 		    if (gui.in_use)
2661 		    {
2662 			int	    save_State;
2663 
2664 			save_State = State;
2665 			State = NORMAL;
2666 			gui_update_cursor(TRUE, FALSE);
2667 			State = save_State;
2668 			shape_changed = TRUE;
2669 		    }
2670 #endif
2671 		    validate_cursor();
2672 		    old_wcol = curwin->w_wcol;
2673 		    old_wrow = curwin->w_wrow;
2674 
2675 		    /* move cursor left, if possible */
2676 		    if (curwin->w_cursor.col != 0)
2677 		    {
2678 			if (curwin->w_wcol > 0)
2679 			{
2680 			    if (did_ai)
2681 			    {
2682 				/*
2683 				 * We are expecting to truncate the trailing
2684 				 * white-space, so find the last non-white
2685 				 * character -- webb
2686 				 */
2687 				col = vcol = curwin->w_wcol = 0;
2688 				ptr = ml_get_curline();
2689 				while (col < curwin->w_cursor.col)
2690 				{
2691 				    if (!vim_iswhite(ptr[col]))
2692 					curwin->w_wcol = vcol;
2693 				    vcol += lbr_chartabsize(ptr, ptr + col,
2694 							       (colnr_T)vcol);
2695 #ifdef FEAT_MBYTE
2696 				    if (has_mbyte)
2697 					col += (*mb_ptr2len)(ptr + col);
2698 				    else
2699 #endif
2700 					++col;
2701 				}
2702 				curwin->w_wrow = curwin->w_cline_row
2703 					   + curwin->w_wcol / W_WIDTH(curwin);
2704 				curwin->w_wcol %= W_WIDTH(curwin);
2705 				curwin->w_wcol += curwin_col_off();
2706 #ifdef FEAT_MBYTE
2707 				col = 0;	/* no correction needed */
2708 #endif
2709 			    }
2710 			    else
2711 			    {
2712 				--curwin->w_wcol;
2713 #ifdef FEAT_MBYTE
2714 				col = curwin->w_cursor.col - 1;
2715 #endif
2716 			    }
2717 			}
2718 			else if (curwin->w_p_wrap && curwin->w_wrow)
2719 			{
2720 			    --curwin->w_wrow;
2721 			    curwin->w_wcol = W_WIDTH(curwin) - 1;
2722 #ifdef FEAT_MBYTE
2723 			    col = curwin->w_cursor.col - 1;
2724 #endif
2725 			}
2726 #ifdef FEAT_MBYTE
2727 			if (has_mbyte && col > 0 && curwin->w_wcol > 0)
2728 			{
2729 			    /* Correct when the cursor is on the right halve
2730 			     * of a double-wide character. */
2731 			    ptr = ml_get_curline();
2732 			    col -= (*mb_head_off)(ptr, ptr + col);
2733 			    if ((*mb_ptr2cells)(ptr + col) > 1)
2734 				--curwin->w_wcol;
2735 			}
2736 #endif
2737 		    }
2738 		    setcursor();
2739 		    out_flush();
2740 #ifdef FEAT_CMDL_INFO
2741 		    new_wcol = curwin->w_wcol;
2742 		    new_wrow = curwin->w_wrow;
2743 #endif
2744 		    curwin->w_wcol = old_wcol;
2745 		    curwin->w_wrow = old_wrow;
2746 		}
2747 		if (c < 0)
2748 		    continue;	/* end of input script reached */
2749 
2750 		/* Allow mapping for just typed characters. When we get here c
2751 		 * is the number of extra bytes and typebuf.tb_len is 1. */
2752 		for (n = 1; n <= c; ++n)
2753 		    typebuf.tb_noremap[typebuf.tb_off + n] = RM_YES;
2754 		typebuf.tb_len += c;
2755 
2756 		/* buffer full, don't map */
2757 		if (typebuf.tb_len >= typebuf.tb_maplen + MAXMAPLEN)
2758 		{
2759 		    timedout = TRUE;
2760 		    continue;
2761 		}
2762 
2763 #ifdef FEAT_EX_EXTRA
2764 		if (ex_normal_busy > 0)
2765 		{
2766 # ifdef FEAT_CMDWIN
2767 		    static int tc = 0;
2768 # endif
2769 
2770 		    /* No typeahead left and inside ":normal".  Must return
2771 		     * something to avoid getting stuck.  When an incomplete
2772 		     * mapping is present, behave like it timed out. */
2773 		    if (typebuf.tb_len > 0)
2774 		    {
2775 			timedout = TRUE;
2776 			continue;
2777 		    }
2778 		    /* When 'insertmode' is set, ESC just beeps in Insert
2779 		     * mode.  Use CTRL-L to make edit() return.
2780 		     * For the command line only CTRL-C always breaks it.
2781 		     * For the cmdline window: Alternate between ESC and
2782 		     * CTRL-C: ESC for most situations and CTRL-C to close the
2783 		     * cmdline window. */
2784 		    if (p_im && (State & INSERT))
2785 			c = Ctrl_L;
2786 		    else if ((State & CMDLINE)
2787 # ifdef FEAT_CMDWIN
2788 			    || (cmdwin_type > 0 && tc == ESC)
2789 # endif
2790 			    )
2791 			c = Ctrl_C;
2792 		    else
2793 			c = ESC;
2794 # ifdef FEAT_CMDWIN
2795 		    tc = c;
2796 # endif
2797 		    break;
2798 		}
2799 #endif
2800 
2801 /*
2802  * get a character: 3. from the user - update display
2803  */
2804 		/* In insert mode a screen update is skipped when characters
2805 		 * are still available.  But when those available characters
2806 		 * are part of a mapping, and we are going to do a blocking
2807 		 * wait here.  Need to update the screen to display the
2808 		 * changed text so far. Also for when 'lazyredraw' is set and
2809 		 * redrawing was postponed because there was something in the
2810 		 * input buffer (e.g., termresponse). */
2811 		if (((State & INSERT) != 0 || p_lz) && (State & CMDLINE) == 0
2812 			  && advance && must_redraw != 0 && !need_wait_return)
2813 		{
2814 		    update_screen(0);
2815 		    setcursor(); /* put cursor back where it belongs */
2816 		}
2817 
2818 		/*
2819 		 * If we have a partial match (and are going to wait for more
2820 		 * input from the user), show the partially matched characters
2821 		 * to the user with showcmd.
2822 		 */
2823 #ifdef FEAT_CMDL_INFO
2824 		i = 0;
2825 #endif
2826 		c1 = 0;
2827 		if (typebuf.tb_len > 0 && advance && !exmode_active)
2828 		{
2829 		    if (((State & (NORMAL | INSERT)) || State == LANGMAP)
2830 			    && State != HITRETURN)
2831 		    {
2832 			/* this looks nice when typing a dead character map */
2833 			if (State & INSERT
2834 			    && ptr2cells(typebuf.tb_buf + typebuf.tb_off
2835 						   + typebuf.tb_len - 1) == 1)
2836 			{
2837 			    edit_putchar(typebuf.tb_buf[typebuf.tb_off
2838 						+ typebuf.tb_len - 1], FALSE);
2839 			    setcursor(); /* put cursor back where it belongs */
2840 			    c1 = 1;
2841 			}
2842 #ifdef FEAT_CMDL_INFO
2843 			/* need to use the col and row from above here */
2844 			old_wcol = curwin->w_wcol;
2845 			old_wrow = curwin->w_wrow;
2846 			curwin->w_wcol = new_wcol;
2847 			curwin->w_wrow = new_wrow;
2848 			push_showcmd();
2849 			if (typebuf.tb_len > SHOWCMD_COLS)
2850 			    i = typebuf.tb_len - SHOWCMD_COLS;
2851 			while (i < typebuf.tb_len)
2852 			    (void)add_to_showcmd(typebuf.tb_buf[typebuf.tb_off
2853 								      + i++]);
2854 			curwin->w_wcol = old_wcol;
2855 			curwin->w_wrow = old_wrow;
2856 #endif
2857 		    }
2858 
2859 		    /* this looks nice when typing a dead character map */
2860 		    if ((State & CMDLINE)
2861 #if defined(FEAT_CRYPT) || defined(FEAT_EVAL)
2862 			    && cmdline_star == 0
2863 #endif
2864 			    && ptr2cells(typebuf.tb_buf + typebuf.tb_off
2865 						   + typebuf.tb_len - 1) == 1)
2866 		    {
2867 			putcmdline(typebuf.tb_buf[typebuf.tb_off
2868 						+ typebuf.tb_len - 1], FALSE);
2869 			c1 = 1;
2870 		    }
2871 		}
2872 
2873 /*
2874  * get a character: 3. from the user - get it
2875  */
2876 		wait_tb_len = typebuf.tb_len;
2877 		c = inchar(typebuf.tb_buf + typebuf.tb_off + typebuf.tb_len,
2878 			typebuf.tb_buflen - typebuf.tb_off - typebuf.tb_len - 1,
2879 			!advance
2880 			    ? 0
2881 			    : ((typebuf.tb_len == 0
2882 				    || !(p_timeout || (p_ttimeout
2883 					       && keylen == KEYLEN_PART_KEY)))
2884 				    ? -1L
2885 				    : ((keylen == KEYLEN_PART_KEY && p_ttm >= 0)
2886 					    ? p_ttm
2887 					    : p_tm)), typebuf.tb_change_cnt);
2888 
2889 #ifdef FEAT_CMDL_INFO
2890 		if (i != 0)
2891 		    pop_showcmd();
2892 #endif
2893 		if (c1 == 1)
2894 		{
2895 		    if (State & INSERT)
2896 			edit_unputchar();
2897 		    if (State & CMDLINE)
2898 			unputcmdline();
2899 		    else
2900 			setcursor();	/* put cursor back where it belongs */
2901 		}
2902 
2903 		if (c < 0)
2904 		    continue;		/* end of input script reached */
2905 		if (c == NUL)		/* no character available */
2906 		{
2907 		    if (!advance)
2908 			break;
2909 		    if (wait_tb_len > 0)	/* timed out */
2910 		    {
2911 			timedout = TRUE;
2912 			continue;
2913 		    }
2914 		}
2915 		else
2916 		{	    /* allow mapping for just typed characters */
2917 		    while (typebuf.tb_buf[typebuf.tb_off
2918 						     + typebuf.tb_len] != NUL)
2919 			typebuf.tb_noremap[typebuf.tb_off
2920 						 + typebuf.tb_len++] = RM_YES;
2921 #ifdef USE_IM_CONTROL
2922 		    /* Get IM status right after getting keys, not after the
2923 		     * timeout for a mapping (focus may be lost by then). */
2924 		    vgetc_im_active = im_get_status();
2925 #endif
2926 		}
2927 	    }	    /* for (;;) */
2928 	}	/* if (!character from stuffbuf) */
2929 
2930 			/* if advance is FALSE don't loop on NULs */
2931     } while (c < 0 || (advance && c == NUL));
2932 
2933     /*
2934      * The "INSERT" message is taken care of here:
2935      *	 if we return an ESC to exit insert mode, the message is deleted
2936      *	 if we don't return an ESC but deleted the message before, redisplay it
2937      */
2938     if (advance && p_smd && msg_silent == 0 && (State & INSERT))
2939     {
2940 	if (c == ESC && !mode_deleted && !no_mapping && mode_displayed)
2941 	{
2942 	    if (typebuf.tb_len && !KeyTyped)
2943 		redraw_cmdline = TRUE;	    /* delete mode later */
2944 	    else
2945 		unshowmode(FALSE);
2946 	}
2947 	else if (c != ESC && mode_deleted)
2948 	{
2949 	    if (typebuf.tb_len && !KeyTyped)
2950 		redraw_cmdline = TRUE;	    /* show mode later */
2951 	    else
2952 		showmode();
2953 	}
2954     }
2955 #ifdef FEAT_GUI
2956     /* may unshow different cursor shape */
2957     if (gui.in_use && shape_changed)
2958 	gui_update_cursor(TRUE, FALSE);
2959 #endif
2960 
2961     --vgetc_busy;
2962 
2963     return c;
2964 }
2965 
2966 /*
2967  * inchar() - get one character from
2968  *	1. a scriptfile
2969  *	2. the keyboard
2970  *
2971  *  As much characters as we can get (upto 'maxlen') are put in "buf" and
2972  *  NUL terminated (buffer length must be 'maxlen' + 1).
2973  *  Minimum for "maxlen" is 3!!!!
2974  *
2975  *  "tb_change_cnt" is the value of typebuf.tb_change_cnt if "buf" points into
2976  *  it.  When typebuf.tb_change_cnt changes (e.g., when a message is received
2977  *  from a remote client) "buf" can no longer be used.  "tb_change_cnt" is 0
2978  *  otherwise.
2979  *
2980  *  If we got an interrupt all input is read until none is available.
2981  *
2982  *  If wait_time == 0  there is no waiting for the char.
2983  *  If wait_time == n  we wait for n msec for a character to arrive.
2984  *  If wait_time == -1 we wait forever for a character to arrive.
2985  *
2986  *  Return the number of obtained characters.
2987  *  Return -1 when end of input script reached.
2988  */
2989     int
2990 inchar(buf, maxlen, wait_time, tb_change_cnt)
2991     char_u	*buf;
2992     int		maxlen;
2993     long	wait_time;	    /* milli seconds */
2994     int		tb_change_cnt;
2995 {
2996     int		len = 0;	    /* init for GCC */
2997     int		retesc = FALSE;	    /* return ESC with gotint */
2998     int		script_char;
2999 
3000     if (wait_time == -1L || wait_time > 100L)  /* flush output before waiting */
3001     {
3002 	cursor_on();
3003 	out_flush();
3004 #ifdef FEAT_GUI
3005 	if (gui.in_use)
3006 	{
3007 	    gui_update_cursor(FALSE, FALSE);
3008 # ifdef FEAT_MOUSESHAPE
3009 	    if (postponed_mouseshape)
3010 		update_mouseshape(-1);
3011 # endif
3012 	}
3013 #endif
3014     }
3015 
3016     /*
3017      * Don't reset these when at the hit-return prompt, otherwise a endless
3018      * recursive loop may result (write error in swapfile, hit-return, timeout
3019      * on char wait, flush swapfile, write error....).
3020      */
3021     if (State != HITRETURN)
3022     {
3023 	did_outofmem_msg = FALSE;   /* display out of memory message (again) */
3024 	did_swapwrite_msg = FALSE;  /* display swap file write error again */
3025     }
3026     undo_off = FALSE;		    /* restart undo now */
3027 
3028     /*
3029      * Get a character from a script file if there is one.
3030      * If interrupted: Stop reading script files, close them all.
3031      */
3032     script_char = -1;
3033     while (scriptin[curscript] != NULL && script_char < 0
3034 #ifdef FEAT_EVAL
3035 	    && !ignore_script
3036 #endif
3037 	    )
3038     {
3039 
3040 #ifdef MESSAGE_QUEUE
3041 	parse_queued_messages();
3042 #endif
3043 
3044 	if (got_int || (script_char = getc(scriptin[curscript])) < 0)
3045 	{
3046 	    /* Reached EOF.
3047 	     * Careful: closescript() frees typebuf.tb_buf[] and buf[] may
3048 	     * point inside typebuf.tb_buf[].  Don't use buf[] after this! */
3049 	    closescript();
3050 	    /*
3051 	     * When reading script file is interrupted, return an ESC to get
3052 	     * back to normal mode.
3053 	     * Otherwise return -1, because typebuf.tb_buf[] has changed.
3054 	     */
3055 	    if (got_int)
3056 		retesc = TRUE;
3057 	    else
3058 		return -1;
3059 	}
3060 	else
3061 	{
3062 	    buf[0] = script_char;
3063 	    len = 1;
3064 	}
3065     }
3066 
3067     if (script_char < 0)	/* did not get a character from script */
3068     {
3069 	/*
3070 	 * If we got an interrupt, skip all previously typed characters and
3071 	 * return TRUE if quit reading script file.
3072 	 * Stop reading typeahead when a single CTRL-C was read,
3073 	 * fill_input_buf() returns this when not able to read from stdin.
3074 	 * Don't use buf[] here, closescript() may have freed typebuf.tb_buf[]
3075 	 * and buf may be pointing inside typebuf.tb_buf[].
3076 	 */
3077 	if (got_int)
3078 	{
3079 #define DUM_LEN MAXMAPLEN * 3 + 3
3080 	    char_u	dum[DUM_LEN + 1];
3081 
3082 	    for (;;)
3083 	    {
3084 		len = ui_inchar(dum, DUM_LEN, 0L, 0);
3085 		if (len == 0 || (len == 1 && dum[0] == 3))
3086 		    break;
3087 	    }
3088 	    return retesc;
3089 	}
3090 
3091 	/*
3092 	 * Always flush the output characters when getting input characters
3093 	 * from the user.
3094 	 */
3095 	out_flush();
3096 
3097 	/*
3098 	 * Fill up to a third of the buffer, because each character may be
3099 	 * tripled below.
3100 	 */
3101 	len = ui_inchar(buf, maxlen / 3, wait_time, tb_change_cnt);
3102     }
3103 
3104     if (typebuf_changed(tb_change_cnt))
3105 	return 0;
3106 
3107     return fix_input_buffer(buf, len, script_char >= 0);
3108 }
3109 
3110 /*
3111  * Fix typed characters for use by vgetc() and check_termcode().
3112  * buf[] must have room to triple the number of bytes!
3113  * Returns the new length.
3114  */
3115     int
3116 fix_input_buffer(buf, len, script)
3117     char_u	*buf;
3118     int		len;
3119     int		script;		/* TRUE when reading from a script */
3120 {
3121     int		i;
3122     char_u	*p = buf;
3123 
3124     /*
3125      * Two characters are special: NUL and K_SPECIAL.
3126      * When compiled With the GUI CSI is also special.
3127      * Replace	     NUL by K_SPECIAL KS_ZERO	 KE_FILLER
3128      * Replace K_SPECIAL by K_SPECIAL KS_SPECIAL KE_FILLER
3129      * Replace       CSI by K_SPECIAL KS_EXTRA   KE_CSI
3130      * Don't replace K_SPECIAL when reading a script file.
3131      */
3132     for (i = len; --i >= 0; ++p)
3133     {
3134 #ifdef FEAT_GUI
3135 	/* When the GUI is used any character can come after a CSI, don't
3136 	 * escape it. */
3137 	if (gui.in_use && p[0] == CSI && i >= 2)
3138 	{
3139 	    p += 2;
3140 	    i -= 2;
3141 	}
3142 	/* When the GUI is not used CSI needs to be escaped. */
3143 	else if (!gui.in_use && p[0] == CSI)
3144 	{
3145 	    mch_memmove(p + 3, p + 1, (size_t)i);
3146 	    *p++ = K_SPECIAL;
3147 	    *p++ = KS_EXTRA;
3148 	    *p = (int)KE_CSI;
3149 	    len += 2;
3150 	}
3151 	else
3152 #endif
3153 	if (p[0] == NUL || (p[0] == K_SPECIAL && !script
3154 #ifdef FEAT_AUTOCMD
3155 		    /* timeout may generate K_CURSORHOLD */
3156 		    && (i < 2 || p[1] != KS_EXTRA || p[2] != (int)KE_CURSORHOLD)
3157 #endif
3158 #if defined(WIN3264) && !defined(FEAT_GUI)
3159 		    /* Win32 console passes modifiers */
3160 		    && (i < 2 || p[1] != KS_MODIFIER)
3161 #endif
3162 		    ))
3163 	{
3164 	    mch_memmove(p + 3, p + 1, (size_t)i);
3165 	    p[2] = K_THIRD(p[0]);
3166 	    p[1] = K_SECOND(p[0]);
3167 	    p[0] = K_SPECIAL;
3168 	    p += 2;
3169 	    len += 2;
3170 	}
3171     }
3172     *p = NUL;		/* add trailing NUL */
3173     return len;
3174 }
3175 
3176 #if defined(USE_INPUT_BUF) || defined(PROTO)
3177 /*
3178  * Return TRUE when bytes are in the input buffer or in the typeahead buffer.
3179  * Normally the input buffer would be sufficient, but the server_to_input_buf()
3180  * or feedkeys() may insert characters in the typeahead buffer while we are
3181  * waiting for input to arrive.
3182  */
3183     int
3184 input_available()
3185 {
3186     return (!vim_is_input_buf_empty()
3187 # if defined(FEAT_CLIENTSERVER) || defined(FEAT_EVAL)
3188 	    || typebuf_was_filled
3189 # endif
3190 	    );
3191 }
3192 #endif
3193 
3194 /*
3195  * map[!]		    : show all key mappings
3196  * map[!] {lhs}		    : show key mapping for {lhs}
3197  * map[!] {lhs} {rhs}	    : set key mapping for {lhs} to {rhs}
3198  * noremap[!] {lhs} {rhs}   : same, but no remapping for {rhs}
3199  * unmap[!] {lhs}	    : remove key mapping for {lhs}
3200  * abbr			    : show all abbreviations
3201  * abbr {lhs}		    : show abbreviations for {lhs}
3202  * abbr {lhs} {rhs}	    : set abbreviation for {lhs} to {rhs}
3203  * noreabbr {lhs} {rhs}	    : same, but no remapping for {rhs}
3204  * unabbr {lhs}		    : remove abbreviation for {lhs}
3205  *
3206  * maptype: 0 for :map, 1 for :unmap, 2 for noremap.
3207  *
3208  * arg is pointer to any arguments. Note: arg cannot be a read-only string,
3209  * it will be modified.
3210  *
3211  * for :map   mode is NORMAL + VISUAL + SELECTMODE + OP_PENDING
3212  * for :map!  mode is INSERT + CMDLINE
3213  * for :cmap  mode is CMDLINE
3214  * for :imap  mode is INSERT
3215  * for :lmap  mode is LANGMAP
3216  * for :nmap  mode is NORMAL
3217  * for :vmap  mode is VISUAL + SELECTMODE
3218  * for :xmap  mode is VISUAL
3219  * for :smap  mode is SELECTMODE
3220  * for :omap  mode is OP_PENDING
3221  *
3222  * for :abbr  mode is INSERT + CMDLINE
3223  * for :iabbr mode is INSERT
3224  * for :cabbr mode is CMDLINE
3225  *
3226  * Return 0 for success
3227  *	  1 for invalid arguments
3228  *	  2 for no match
3229  *	  4 for out of mem
3230  *	  5 for entry not unique
3231  */
3232     int
3233 do_map(maptype, arg, mode, abbrev)
3234     int		maptype;
3235     char_u	*arg;
3236     int		mode;
3237     int		abbrev;		/* not a mapping but an abbreviation */
3238 {
3239     char_u	*keys;
3240     mapblock_T	*mp, **mpp;
3241     char_u	*rhs;
3242     char_u	*p;
3243     int		n;
3244     int		len = 0;	/* init for GCC */
3245     char_u	*newstr;
3246     int		hasarg;
3247     int		haskey;
3248     int		did_it = FALSE;
3249 #ifdef FEAT_LOCALMAP
3250     int		did_local = FALSE;
3251 #endif
3252     int		round;
3253     char_u	*keys_buf = NULL;
3254     char_u	*arg_buf = NULL;
3255     int		retval = 0;
3256     int		do_backslash;
3257     int		hash;
3258     int		new_hash;
3259     mapblock_T	**abbr_table;
3260     mapblock_T	**map_table;
3261     int		unique = FALSE;
3262     int		nowait = FALSE;
3263     int		silent = FALSE;
3264     int		special = FALSE;
3265 #ifdef FEAT_EVAL
3266     int		expr = FALSE;
3267 #endif
3268     int		noremap;
3269     char_u      *orig_rhs;
3270 
3271     keys = arg;
3272     map_table = maphash;
3273     abbr_table = &first_abbr;
3274 
3275     /* For ":noremap" don't remap, otherwise do remap. */
3276     if (maptype == 2)
3277 	noremap = REMAP_NONE;
3278     else
3279 	noremap = REMAP_YES;
3280 
3281     /* Accept <buffer>, <nowait>, <silent>, <expr> <script> and <unique> in
3282      * any order. */
3283     for (;;)
3284     {
3285 #ifdef FEAT_LOCALMAP
3286 	/*
3287 	 * Check for "<buffer>": mapping local to buffer.
3288 	 */
3289 	if (STRNCMP(keys, "<buffer>", 8) == 0)
3290 	{
3291 	    keys = skipwhite(keys + 8);
3292 	    map_table = curbuf->b_maphash;
3293 	    abbr_table = &curbuf->b_first_abbr;
3294 	    continue;
3295 	}
3296 #endif
3297 
3298 	/*
3299 	 * Check for "<nowait>": don't wait for more characters.
3300 	 */
3301 	if (STRNCMP(keys, "<nowait>", 8) == 0)
3302 	{
3303 	    keys = skipwhite(keys + 8);
3304 	    nowait = TRUE;
3305 	    continue;
3306 	}
3307 
3308 	/*
3309 	 * Check for "<silent>": don't echo commands.
3310 	 */
3311 	if (STRNCMP(keys, "<silent>", 8) == 0)
3312 	{
3313 	    keys = skipwhite(keys + 8);
3314 	    silent = TRUE;
3315 	    continue;
3316 	}
3317 
3318 	/*
3319 	 * Check for "<special>": accept special keys in <>
3320 	 */
3321 	if (STRNCMP(keys, "<special>", 9) == 0)
3322 	{
3323 	    keys = skipwhite(keys + 9);
3324 	    special = TRUE;
3325 	    continue;
3326 	}
3327 
3328 #ifdef FEAT_EVAL
3329 	/*
3330 	 * Check for "<script>": remap script-local mappings only
3331 	 */
3332 	if (STRNCMP(keys, "<script>", 8) == 0)
3333 	{
3334 	    keys = skipwhite(keys + 8);
3335 	    noremap = REMAP_SCRIPT;
3336 	    continue;
3337 	}
3338 
3339 	/*
3340 	 * Check for "<expr>": {rhs} is an expression.
3341 	 */
3342 	if (STRNCMP(keys, "<expr>", 6) == 0)
3343 	{
3344 	    keys = skipwhite(keys + 6);
3345 	    expr = TRUE;
3346 	    continue;
3347 	}
3348 #endif
3349 	/*
3350 	 * Check for "<unique>": don't overwrite an existing mapping.
3351 	 */
3352 	if (STRNCMP(keys, "<unique>", 8) == 0)
3353 	{
3354 	    keys = skipwhite(keys + 8);
3355 	    unique = TRUE;
3356 	    continue;
3357 	}
3358 	break;
3359     }
3360 
3361     validate_maphash();
3362 
3363     /*
3364      * Find end of keys and skip CTRL-Vs (and backslashes) in it.
3365      * Accept backslash like CTRL-V when 'cpoptions' does not contain 'B'.
3366      * with :unmap white space is included in the keys, no argument possible.
3367      */
3368     p = keys;
3369     do_backslash = (vim_strchr(p_cpo, CPO_BSLASH) == NULL);
3370     while (*p && (maptype == 1 || !vim_iswhite(*p)))
3371     {
3372 	if ((p[0] == Ctrl_V || (do_backslash && p[0] == '\\')) &&
3373 								  p[1] != NUL)
3374 	    ++p;		/* skip CTRL-V or backslash */
3375 	++p;
3376     }
3377     if (*p != NUL)
3378 	*p++ = NUL;
3379 
3380     p = skipwhite(p);
3381     rhs = p;
3382     hasarg = (*rhs != NUL);
3383     haskey = (*keys != NUL);
3384 
3385     /* check for :unmap without argument */
3386     if (maptype == 1 && !haskey)
3387     {
3388 	retval = 1;
3389 	goto theend;
3390     }
3391 
3392     /*
3393      * If mapping has been given as ^V<C_UP> say, then replace the term codes
3394      * with the appropriate two bytes. If it is a shifted special key, unshift
3395      * it too, giving another two bytes.
3396      * replace_termcodes() may move the result to allocated memory, which
3397      * needs to be freed later (*keys_buf and *arg_buf).
3398      * replace_termcodes() also removes CTRL-Vs and sometimes backslashes.
3399      */
3400     if (haskey)
3401 	keys = replace_termcodes(keys, &keys_buf, TRUE, TRUE, special);
3402     orig_rhs = rhs;
3403     if (hasarg)
3404     {
3405 	if (STRICMP(rhs, "<nop>") == 0)	    /* "<Nop>" means nothing */
3406 	    rhs = (char_u *)"";
3407 	else
3408 	    rhs = replace_termcodes(rhs, &arg_buf, FALSE, TRUE, special);
3409     }
3410 
3411 #ifdef FEAT_FKMAP
3412     /*
3413      * When in right-to-left mode and alternate keymap option set,
3414      * reverse the character flow in the rhs in Farsi.
3415      */
3416     if (p_altkeymap && curwin->w_p_rl)
3417 	lrswap(rhs);
3418 #endif
3419 
3420     /*
3421      * check arguments and translate function keys
3422      */
3423     if (haskey)
3424     {
3425 	len = (int)STRLEN(keys);
3426 	if (len > MAXMAPLEN)		/* maximum length of MAXMAPLEN chars */
3427 	{
3428 	    retval = 1;
3429 	    goto theend;
3430 	}
3431 
3432 	if (abbrev && maptype != 1)
3433 	{
3434 	    /*
3435 	     * If an abbreviation ends in a keyword character, the
3436 	     * rest must be all keyword-char or all non-keyword-char.
3437 	     * Otherwise we won't be able to find the start of it in a
3438 	     * vi-compatible way.
3439 	     */
3440 #ifdef FEAT_MBYTE
3441 	    if (has_mbyte)
3442 	    {
3443 		int	first, last;
3444 		int	same = -1;
3445 
3446 		first = vim_iswordp(keys);
3447 		last = first;
3448 		p = keys + (*mb_ptr2len)(keys);
3449 		n = 1;
3450 		while (p < keys + len)
3451 		{
3452 		    ++n;			/* nr of (multi-byte) chars */
3453 		    last = vim_iswordp(p);	/* type of last char */
3454 		    if (same == -1 && last != first)
3455 			same = n - 1;		/* count of same char type */
3456 		    p += (*mb_ptr2len)(p);
3457 		}
3458 		if (last && n > 2 && same >= 0 && same < n - 1)
3459 		{
3460 		    retval = 1;
3461 		    goto theend;
3462 		}
3463 	    }
3464 	    else
3465 #endif
3466 		if (vim_iswordc(keys[len - 1]))	/* ends in keyword char */
3467 		    for (n = 0; n < len - 2; ++n)
3468 			if (vim_iswordc(keys[n]) != vim_iswordc(keys[len - 2]))
3469 			{
3470 			    retval = 1;
3471 			    goto theend;
3472 			}
3473 	    /* An abbreviation cannot contain white space. */
3474 	    for (n = 0; n < len; ++n)
3475 		if (vim_iswhite(keys[n]))
3476 		{
3477 		    retval = 1;
3478 		    goto theend;
3479 		}
3480 	}
3481     }
3482 
3483     if (haskey && hasarg && abbrev)	/* if we will add an abbreviation */
3484 	no_abbr = FALSE;		/* reset flag that indicates there are
3485 							    no abbreviations */
3486 
3487     if (!haskey || (maptype != 1 && !hasarg))
3488 	msg_start();
3489 
3490 #ifdef FEAT_LOCALMAP
3491     /*
3492      * Check if a new local mapping wasn't already defined globally.
3493      */
3494     if (map_table == curbuf->b_maphash && haskey && hasarg && maptype != 1)
3495     {
3496 	/* need to loop over all global hash lists */
3497 	for (hash = 0; hash < 256 && !got_int; ++hash)
3498 	{
3499 	    if (abbrev)
3500 	    {
3501 		if (hash != 0)	/* there is only one abbreviation list */
3502 		    break;
3503 		mp = first_abbr;
3504 	    }
3505 	    else
3506 		mp = maphash[hash];
3507 	    for ( ; mp != NULL && !got_int; mp = mp->m_next)
3508 	    {
3509 		/* check entries with the same mode */
3510 		if ((mp->m_mode & mode) != 0
3511 			&& mp->m_keylen == len
3512 			&& unique
3513 			&& STRNCMP(mp->m_keys, keys, (size_t)len) == 0)
3514 		{
3515 		    if (abbrev)
3516 			EMSG2(_("E224: global abbreviation already exists for %s"),
3517 				mp->m_keys);
3518 		    else
3519 			EMSG2(_("E225: global mapping already exists for %s"),
3520 				mp->m_keys);
3521 		    retval = 5;
3522 		    goto theend;
3523 		}
3524 	    }
3525 	}
3526     }
3527 
3528     /*
3529      * When listing global mappings, also list buffer-local ones here.
3530      */
3531     if (map_table != curbuf->b_maphash && !hasarg && maptype != 1)
3532     {
3533 	/* need to loop over all global hash lists */
3534 	for (hash = 0; hash < 256 && !got_int; ++hash)
3535 	{
3536 	    if (abbrev)
3537 	    {
3538 		if (hash != 0)	/* there is only one abbreviation list */
3539 		    break;
3540 		mp = curbuf->b_first_abbr;
3541 	    }
3542 	    else
3543 		mp = curbuf->b_maphash[hash];
3544 	    for ( ; mp != NULL && !got_int; mp = mp->m_next)
3545 	    {
3546 		/* check entries with the same mode */
3547 		if ((mp->m_mode & mode) != 0)
3548 		{
3549 		    if (!haskey)		    /* show all entries */
3550 		    {
3551 			showmap(mp, TRUE);
3552 			did_local = TRUE;
3553 		    }
3554 		    else
3555 		    {
3556 			n = mp->m_keylen;
3557 			if (STRNCMP(mp->m_keys, keys,
3558 					    (size_t)(n < len ? n : len)) == 0)
3559 			{
3560 			    showmap(mp, TRUE);
3561 			    did_local = TRUE;
3562 			}
3563 		    }
3564 		}
3565 	    }
3566 	}
3567     }
3568 #endif
3569 
3570     /*
3571      * Find an entry in the maphash[] list that matches.
3572      * For :unmap we may loop two times: once to try to unmap an entry with a
3573      * matching 'from' part, a second time, if the first fails, to unmap an
3574      * entry with a matching 'to' part. This was done to allow ":ab foo bar"
3575      * to be unmapped by typing ":unab foo", where "foo" will be replaced by
3576      * "bar" because of the abbreviation.
3577      */
3578     for (round = 0; (round == 0 || maptype == 1) && round <= 1
3579 					      && !did_it && !got_int; ++round)
3580     {
3581 	/* need to loop over all hash lists */
3582 	for (hash = 0; hash < 256 && !got_int; ++hash)
3583 	{
3584 	    if (abbrev)
3585 	    {
3586 		if (hash > 0)	/* there is only one abbreviation list */
3587 		    break;
3588 		mpp = abbr_table;
3589 	    }
3590 	    else
3591 		mpp = &(map_table[hash]);
3592 	    for (mp = *mpp; mp != NULL && !got_int; mp = *mpp)
3593 	    {
3594 
3595 		if (!(mp->m_mode & mode))   /* skip entries with wrong mode */
3596 		{
3597 		    mpp = &(mp->m_next);
3598 		    continue;
3599 		}
3600 		if (!haskey)		    /* show all entries */
3601 		{
3602 		    showmap(mp, map_table != maphash);
3603 		    did_it = TRUE;
3604 		}
3605 		else			    /* do we have a match? */
3606 		{
3607 		    if (round)	    /* second round: Try unmap "rhs" string */
3608 		    {
3609 			n = (int)STRLEN(mp->m_str);
3610 			p = mp->m_str;
3611 		    }
3612 		    else
3613 		    {
3614 			n = mp->m_keylen;
3615 			p = mp->m_keys;
3616 		    }
3617 		    if (STRNCMP(p, keys, (size_t)(n < len ? n : len)) == 0)
3618 		    {
3619 			if (maptype == 1)	/* delete entry */
3620 			{
3621 			    /* Only accept a full match.  For abbreviations we
3622 			     * ignore trailing space when matching with the
3623 			     * "lhs", since an abbreviation can't have
3624 			     * trailing space. */
3625 			    if (n != len && (!abbrev || round || n > len
3626 					       || *skipwhite(keys + n) != NUL))
3627 			    {
3628 				mpp = &(mp->m_next);
3629 				continue;
3630 			    }
3631 			    /*
3632 			     * We reset the indicated mode bits. If nothing is
3633 			     * left the entry is deleted below.
3634 			     */
3635 			    mp->m_mode &= ~mode;
3636 			    did_it = TRUE;	/* remember we did something */
3637 			}
3638 			else if (!hasarg)	/* show matching entry */
3639 			{
3640 			    showmap(mp, map_table != maphash);
3641 			    did_it = TRUE;
3642 			}
3643 			else if (n != len)	/* new entry is ambiguous */
3644 			{
3645 			    mpp = &(mp->m_next);
3646 			    continue;
3647 			}
3648 			else if (unique)
3649 			{
3650 			    if (abbrev)
3651 				EMSG2(_("E226: abbreviation already exists for %s"),
3652 									   p);
3653 			    else
3654 				EMSG2(_("E227: mapping already exists for %s"), p);
3655 			    retval = 5;
3656 			    goto theend;
3657 			}
3658 			else			/* new rhs for existing entry */
3659 			{
3660 			    mp->m_mode &= ~mode;	/* remove mode bits */
3661 			    if (mp->m_mode == 0 && !did_it) /* reuse entry */
3662 			    {
3663 				newstr = vim_strsave(rhs);
3664 				if (newstr == NULL)
3665 				{
3666 				    retval = 4;		/* no mem */
3667 				    goto theend;
3668 				}
3669 				vim_free(mp->m_str);
3670 				mp->m_str = newstr;
3671 				vim_free(mp->m_orig_str);
3672 				mp->m_orig_str = vim_strsave(orig_rhs);
3673 				mp->m_noremap = noremap;
3674 				mp->m_nowait = nowait;
3675 				mp->m_silent = silent;
3676 				mp->m_mode = mode;
3677 #ifdef FEAT_EVAL
3678 				mp->m_expr = expr;
3679 				mp->m_script_ID = current_SID;
3680 #endif
3681 				did_it = TRUE;
3682 			    }
3683 			}
3684 			if (mp->m_mode == 0)	/* entry can be deleted */
3685 			{
3686 			    map_free(mpp);
3687 			    continue;		/* continue with *mpp */
3688 			}
3689 
3690 			/*
3691 			 * May need to put this entry into another hash list.
3692 			 */
3693 			new_hash = MAP_HASH(mp->m_mode, mp->m_keys[0]);
3694 			if (!abbrev && new_hash != hash)
3695 			{
3696 			    *mpp = mp->m_next;
3697 			    mp->m_next = map_table[new_hash];
3698 			    map_table[new_hash] = mp;
3699 
3700 			    continue;		/* continue with *mpp */
3701 			}
3702 		    }
3703 		}
3704 		mpp = &(mp->m_next);
3705 	    }
3706 	}
3707     }
3708 
3709     if (maptype == 1)			    /* delete entry */
3710     {
3711 	if (!did_it)
3712 	    retval = 2;			    /* no match */
3713 	else if (*keys == Ctrl_C)
3714 	{
3715 	    /* If CTRL-C has been unmapped, reuse it for Interrupting. */
3716 #ifdef FEAT_LOCALMAP
3717 	    if (map_table == curbuf->b_maphash)
3718 		curbuf->b_mapped_ctrl_c &= ~mode;
3719 	    else
3720 #endif
3721 		mapped_ctrl_c &= ~mode;
3722 	}
3723 	goto theend;
3724     }
3725 
3726     if (!haskey || !hasarg)		    /* print entries */
3727     {
3728 	if (!did_it
3729 #ifdef FEAT_LOCALMAP
3730 		&& !did_local
3731 #endif
3732 		)
3733 	{
3734 	    if (abbrev)
3735 		MSG(_("No abbreviation found"));
3736 	    else
3737 		MSG(_("No mapping found"));
3738 	}
3739 	goto theend;			    /* listing finished */
3740     }
3741 
3742     if (did_it)			/* have added the new entry already */
3743 	goto theend;
3744 
3745     /*
3746      * Get here when adding a new entry to the maphash[] list or abbrlist.
3747      */
3748     mp = (mapblock_T *)alloc((unsigned)sizeof(mapblock_T));
3749     if (mp == NULL)
3750     {
3751 	retval = 4;	    /* no mem */
3752 	goto theend;
3753     }
3754 
3755     /* If CTRL-C has been mapped, don't always use it for Interrupting. */
3756     if (*keys == Ctrl_C)
3757     {
3758 #ifdef FEAT_LOCALMAP
3759 	if (map_table == curbuf->b_maphash)
3760 	    curbuf->b_mapped_ctrl_c |= mode;
3761 	else
3762 #endif
3763 	    mapped_ctrl_c |= mode;
3764     }
3765 
3766     mp->m_keys = vim_strsave(keys);
3767     mp->m_str = vim_strsave(rhs);
3768     mp->m_orig_str = vim_strsave(orig_rhs);
3769     if (mp->m_keys == NULL || mp->m_str == NULL)
3770     {
3771 	vim_free(mp->m_keys);
3772 	vim_free(mp->m_str);
3773 	vim_free(mp->m_orig_str);
3774 	vim_free(mp);
3775 	retval = 4;	/* no mem */
3776 	goto theend;
3777     }
3778     mp->m_keylen = (int)STRLEN(mp->m_keys);
3779     mp->m_noremap = noremap;
3780     mp->m_nowait = nowait;
3781     mp->m_silent = silent;
3782     mp->m_mode = mode;
3783 #ifdef FEAT_EVAL
3784     mp->m_expr = expr;
3785     mp->m_script_ID = current_SID;
3786 #endif
3787 
3788     /* add the new entry in front of the abbrlist or maphash[] list */
3789     if (abbrev)
3790     {
3791 	mp->m_next = *abbr_table;
3792 	*abbr_table = mp;
3793     }
3794     else
3795     {
3796 	n = MAP_HASH(mp->m_mode, mp->m_keys[0]);
3797 	mp->m_next = map_table[n];
3798 	map_table[n] = mp;
3799     }
3800 
3801 theend:
3802     vim_free(keys_buf);
3803     vim_free(arg_buf);
3804     return retval;
3805 }
3806 
3807 /*
3808  * Delete one entry from the abbrlist or maphash[].
3809  * "mpp" is a pointer to the m_next field of the PREVIOUS entry!
3810  */
3811     static void
3812 map_free(mpp)
3813     mapblock_T	**mpp;
3814 {
3815     mapblock_T	*mp;
3816 
3817     mp = *mpp;
3818     vim_free(mp->m_keys);
3819     vim_free(mp->m_str);
3820     vim_free(mp->m_orig_str);
3821     *mpp = mp->m_next;
3822     vim_free(mp);
3823 }
3824 
3825 /*
3826  * Initialize maphash[] for first use.
3827  */
3828     static void
3829 validate_maphash()
3830 {
3831     if (!maphash_valid)
3832     {
3833 	vim_memset(maphash, 0, sizeof(maphash));
3834 	maphash_valid = TRUE;
3835     }
3836 }
3837 
3838 /*
3839  * Get the mapping mode from the command name.
3840  */
3841     int
3842 get_map_mode(cmdp, forceit)
3843     char_u	**cmdp;
3844     int		forceit;
3845 {
3846     char_u	*p;
3847     int		modec;
3848     int		mode;
3849 
3850     p = *cmdp;
3851     modec = *p++;
3852     if (modec == 'i')
3853 	mode = INSERT;				/* :imap */
3854     else if (modec == 'l')
3855 	mode = LANGMAP;				/* :lmap */
3856     else if (modec == 'c')
3857 	mode = CMDLINE;				/* :cmap */
3858     else if (modec == 'n' && *p != 'o')		    /* avoid :noremap */
3859 	mode = NORMAL;				/* :nmap */
3860     else if (modec == 'v')
3861 	mode = VISUAL + SELECTMODE;		/* :vmap */
3862     else if (modec == 'x')
3863 	mode = VISUAL;				/* :xmap */
3864     else if (modec == 's')
3865 	mode = SELECTMODE;			/* :smap */
3866     else if (modec == 'o')
3867 	mode = OP_PENDING;			/* :omap */
3868     else
3869     {
3870 	--p;
3871 	if (forceit)
3872 	    mode = INSERT + CMDLINE;		/* :map ! */
3873 	else
3874 	    mode = VISUAL + SELECTMODE + NORMAL + OP_PENDING;/* :map */
3875     }
3876 
3877     *cmdp = p;
3878     return mode;
3879 }
3880 
3881 /*
3882  * Clear all mappings or abbreviations.
3883  * 'abbr' should be FALSE for mappings, TRUE for abbreviations.
3884  */
3885     void
3886 map_clear(cmdp, arg, forceit, abbr)
3887     char_u	*cmdp;
3888     char_u	*arg UNUSED;
3889     int		forceit;
3890     int		abbr;
3891 {
3892     int		mode;
3893 #ifdef FEAT_LOCALMAP
3894     int		local;
3895 
3896     local = (STRCMP(arg, "<buffer>") == 0);
3897     if (!local && *arg != NUL)
3898     {
3899 	EMSG(_(e_invarg));
3900 	return;
3901     }
3902 #endif
3903 
3904     mode = get_map_mode(&cmdp, forceit);
3905     map_clear_int(curbuf, mode,
3906 #ifdef FEAT_LOCALMAP
3907 	    local,
3908 #else
3909 	    FALSE,
3910 #endif
3911 	    abbr);
3912 }
3913 
3914 /*
3915  * Clear all mappings in "mode".
3916  */
3917     void
3918 map_clear_int(buf, mode, local, abbr)
3919     buf_T	*buf UNUSED;	/* buffer for local mappings */
3920     int		mode;		/* mode in which to delete */
3921     int		local UNUSED;	/* TRUE for buffer-local mappings */
3922     int		abbr;		/* TRUE for abbreviations */
3923 {
3924     mapblock_T	*mp, **mpp;
3925     int		hash;
3926     int		new_hash;
3927 
3928     validate_maphash();
3929 
3930     for (hash = 0; hash < 256; ++hash)
3931     {
3932 	if (abbr)
3933 	{
3934 	    if (hash > 0)	/* there is only one abbrlist */
3935 		break;
3936 #ifdef FEAT_LOCALMAP
3937 	    if (local)
3938 		mpp = &buf->b_first_abbr;
3939 	    else
3940 #endif
3941 		mpp = &first_abbr;
3942 	}
3943 	else
3944 	{
3945 #ifdef FEAT_LOCALMAP
3946 	    if (local)
3947 		mpp = &buf->b_maphash[hash];
3948 	    else
3949 #endif
3950 		mpp = &maphash[hash];
3951 	}
3952 	while (*mpp != NULL)
3953 	{
3954 	    mp = *mpp;
3955 	    if (mp->m_mode & mode)
3956 	    {
3957 		mp->m_mode &= ~mode;
3958 		if (mp->m_mode == 0) /* entry can be deleted */
3959 		{
3960 		    map_free(mpp);
3961 		    continue;
3962 		}
3963 		/*
3964 		 * May need to put this entry into another hash list.
3965 		 */
3966 		new_hash = MAP_HASH(mp->m_mode, mp->m_keys[0]);
3967 		if (!abbr && new_hash != hash)
3968 		{
3969 		    *mpp = mp->m_next;
3970 #ifdef FEAT_LOCALMAP
3971 		    if (local)
3972 		    {
3973 			mp->m_next = buf->b_maphash[new_hash];
3974 			buf->b_maphash[new_hash] = mp;
3975 		    }
3976 		    else
3977 #endif
3978 		    {
3979 			mp->m_next = maphash[new_hash];
3980 			maphash[new_hash] = mp;
3981 		    }
3982 		    continue;		/* continue with *mpp */
3983 		}
3984 	    }
3985 	    mpp = &(mp->m_next);
3986 	}
3987     }
3988 }
3989 
3990 /*
3991  * Return characters to represent the map mode in an allocated string.
3992  * Returns NULL when out of memory.
3993  */
3994     char_u *
3995 map_mode_to_chars(mode)
3996     int mode;
3997 {
3998     garray_T    mapmode;
3999 
4000     ga_init2(&mapmode, 1, 7);
4001 
4002     if ((mode & (INSERT + CMDLINE)) == INSERT + CMDLINE)
4003 	ga_append(&mapmode, '!');			/* :map! */
4004     else if (mode & INSERT)
4005 	ga_append(&mapmode, 'i');			/* :imap */
4006     else if (mode & LANGMAP)
4007 	ga_append(&mapmode, 'l');			/* :lmap */
4008     else if (mode & CMDLINE)
4009 	ga_append(&mapmode, 'c');			/* :cmap */
4010     else if ((mode & (NORMAL + VISUAL + SELECTMODE + OP_PENDING))
4011 				 == NORMAL + VISUAL + SELECTMODE + OP_PENDING)
4012 	ga_append(&mapmode, ' ');			/* :map */
4013     else
4014     {
4015 	if (mode & NORMAL)
4016 	    ga_append(&mapmode, 'n');			/* :nmap */
4017 	if (mode & OP_PENDING)
4018 	    ga_append(&mapmode, 'o');			/* :omap */
4019 	if ((mode & (VISUAL + SELECTMODE)) == VISUAL + SELECTMODE)
4020 	    ga_append(&mapmode, 'v');			/* :vmap */
4021 	else
4022 	{
4023 	    if (mode & VISUAL)
4024 		ga_append(&mapmode, 'x');		/* :xmap */
4025 	    if (mode & SELECTMODE)
4026 		ga_append(&mapmode, 's');		/* :smap */
4027 	}
4028     }
4029 
4030     ga_append(&mapmode, NUL);
4031     return (char_u *)mapmode.ga_data;
4032 }
4033 
4034     static void
4035 showmap(mp, local)
4036     mapblock_T	*mp;
4037     int		local;	    /* TRUE for buffer-local map */
4038 {
4039     int		len = 1;
4040     char_u	*mapchars;
4041 
4042     if (msg_didout || msg_silent != 0)
4043     {
4044 	msg_putchar('\n');
4045 	if (got_int)	    /* 'q' typed at MORE prompt */
4046 	    return;
4047     }
4048 
4049     mapchars = map_mode_to_chars(mp->m_mode);
4050     if (mapchars != NULL)
4051     {
4052 	msg_puts(mapchars);
4053 	len = (int)STRLEN(mapchars);
4054 	vim_free(mapchars);
4055     }
4056 
4057     while (++len <= 3)
4058 	msg_putchar(' ');
4059 
4060     /* Display the LHS.  Get length of what we write. */
4061     len = msg_outtrans_special(mp->m_keys, TRUE);
4062     do
4063     {
4064 	msg_putchar(' ');		/* padd with blanks */
4065 	++len;
4066     } while (len < 12);
4067 
4068     if (mp->m_noremap == REMAP_NONE)
4069 	msg_puts_attr((char_u *)"*", hl_attr(HLF_8));
4070     else if (mp->m_noremap == REMAP_SCRIPT)
4071 	msg_puts_attr((char_u *)"&", hl_attr(HLF_8));
4072     else
4073 	msg_putchar(' ');
4074 
4075     if (local)
4076 	msg_putchar('@');
4077     else
4078 	msg_putchar(' ');
4079 
4080     /* Use FALSE below if we only want things like <Up> to show up as such on
4081      * the rhs, and not M-x etc, TRUE gets both -- webb */
4082     if (*mp->m_str == NUL)
4083 	msg_puts_attr((char_u *)"<Nop>", hl_attr(HLF_8));
4084     else
4085     {
4086 	/* Remove escaping of CSI, because "m_str" is in a format to be used
4087 	 * as typeahead. */
4088 	char_u *s = vim_strsave(mp->m_str);
4089 	if (s != NULL)
4090 	{
4091 	    vim_unescape_csi(s);
4092 	    msg_outtrans_special(s, FALSE);
4093 	    vim_free(s);
4094 	}
4095     }
4096 #ifdef FEAT_EVAL
4097     if (p_verbose > 0)
4098 	last_set_msg(mp->m_script_ID);
4099 #endif
4100     out_flush();			/* show one line at a time */
4101 }
4102 
4103 #if defined(FEAT_EVAL) || defined(PROTO)
4104 /*
4105  * Return TRUE if a map exists that has "str" in the rhs for mode "modechars".
4106  * Recognize termcap codes in "str".
4107  * Also checks mappings local to the current buffer.
4108  */
4109     int
4110 map_to_exists(str, modechars, abbr)
4111     char_u	*str;
4112     char_u	*modechars;
4113     int		abbr;
4114 {
4115     int		mode = 0;
4116     char_u	*rhs;
4117     char_u	*buf;
4118     int		retval;
4119 
4120     rhs = replace_termcodes(str, &buf, FALSE, TRUE, FALSE);
4121 
4122     if (vim_strchr(modechars, 'n') != NULL)
4123 	mode |= NORMAL;
4124     if (vim_strchr(modechars, 'v') != NULL)
4125 	mode |= VISUAL + SELECTMODE;
4126     if (vim_strchr(modechars, 'x') != NULL)
4127 	mode |= VISUAL;
4128     if (vim_strchr(modechars, 's') != NULL)
4129 	mode |= SELECTMODE;
4130     if (vim_strchr(modechars, 'o') != NULL)
4131 	mode |= OP_PENDING;
4132     if (vim_strchr(modechars, 'i') != NULL)
4133 	mode |= INSERT;
4134     if (vim_strchr(modechars, 'l') != NULL)
4135 	mode |= LANGMAP;
4136     if (vim_strchr(modechars, 'c') != NULL)
4137 	mode |= CMDLINE;
4138 
4139     retval = map_to_exists_mode(rhs, mode, abbr);
4140     vim_free(buf);
4141 
4142     return retval;
4143 }
4144 #endif
4145 
4146 /*
4147  * Return TRUE if a map exists that has "str" in the rhs for mode "mode".
4148  * Also checks mappings local to the current buffer.
4149  */
4150     int
4151 map_to_exists_mode(rhs, mode, abbr)
4152     char_u	*rhs;
4153     int		mode;
4154     int		abbr;
4155 {
4156     mapblock_T	*mp;
4157     int		hash;
4158 # ifdef FEAT_LOCALMAP
4159     int		expand_buffer = FALSE;
4160 
4161     validate_maphash();
4162 
4163     /* Do it twice: once for global maps and once for local maps. */
4164     for (;;)
4165     {
4166 # endif
4167 	for (hash = 0; hash < 256; ++hash)
4168 	{
4169 	    if (abbr)
4170 	    {
4171 		if (hash > 0)		/* there is only one abbr list */
4172 		    break;
4173 #ifdef FEAT_LOCALMAP
4174 		if (expand_buffer)
4175 		    mp = curbuf->b_first_abbr;
4176 		else
4177 #endif
4178 		    mp = first_abbr;
4179 	    }
4180 # ifdef FEAT_LOCALMAP
4181 	    else if (expand_buffer)
4182 		mp = curbuf->b_maphash[hash];
4183 # endif
4184 	    else
4185 		mp = maphash[hash];
4186 	    for (; mp; mp = mp->m_next)
4187 	    {
4188 		if ((mp->m_mode & mode)
4189 			&& strstr((char *)mp->m_str, (char *)rhs) != NULL)
4190 		    return TRUE;
4191 	    }
4192 	}
4193 # ifdef FEAT_LOCALMAP
4194 	if (expand_buffer)
4195 	    break;
4196 	expand_buffer = TRUE;
4197     }
4198 # endif
4199 
4200     return FALSE;
4201 }
4202 
4203 #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
4204 /*
4205  * Used below when expanding mapping/abbreviation names.
4206  */
4207 static int	expand_mapmodes = 0;
4208 static int	expand_isabbrev = 0;
4209 #ifdef FEAT_LOCALMAP
4210 static int	expand_buffer = FALSE;
4211 #endif
4212 
4213 /*
4214  * Work out what to complete when doing command line completion of mapping
4215  * or abbreviation names.
4216  */
4217     char_u *
4218 set_context_in_map_cmd(xp, cmd, arg, forceit, isabbrev, isunmap, cmdidx)
4219     expand_T	*xp;
4220     char_u	*cmd;
4221     char_u	*arg;
4222     int		forceit;	/* TRUE if '!' given */
4223     int		isabbrev;	/* TRUE if abbreviation */
4224     int		isunmap;	/* TRUE if unmap/unabbrev command */
4225     cmdidx_T	cmdidx;
4226 {
4227     if (forceit && cmdidx != CMD_map && cmdidx != CMD_unmap)
4228 	xp->xp_context = EXPAND_NOTHING;
4229     else
4230     {
4231 	if (isunmap)
4232 	    expand_mapmodes = get_map_mode(&cmd, forceit || isabbrev);
4233 	else
4234 	{
4235 	    expand_mapmodes = INSERT + CMDLINE;
4236 	    if (!isabbrev)
4237 		expand_mapmodes += VISUAL + SELECTMODE + NORMAL + OP_PENDING;
4238 	}
4239 	expand_isabbrev = isabbrev;
4240 	xp->xp_context = EXPAND_MAPPINGS;
4241 #ifdef FEAT_LOCALMAP
4242 	expand_buffer = FALSE;
4243 #endif
4244 	for (;;)
4245 	{
4246 #ifdef FEAT_LOCALMAP
4247 	    if (STRNCMP(arg, "<buffer>", 8) == 0)
4248 	    {
4249 		expand_buffer = TRUE;
4250 		arg = skipwhite(arg + 8);
4251 		continue;
4252 	    }
4253 #endif
4254 	    if (STRNCMP(arg, "<unique>", 8) == 0)
4255 	    {
4256 		arg = skipwhite(arg + 8);
4257 		continue;
4258 	    }
4259 	    if (STRNCMP(arg, "<nowait>", 8) == 0)
4260 	    {
4261 		arg = skipwhite(arg + 8);
4262 		continue;
4263 	    }
4264 	    if (STRNCMP(arg, "<silent>", 8) == 0)
4265 	    {
4266 		arg = skipwhite(arg + 8);
4267 		continue;
4268 	    }
4269 #ifdef FEAT_EVAL
4270 	    if (STRNCMP(arg, "<script>", 8) == 0)
4271 	    {
4272 		arg = skipwhite(arg + 8);
4273 		continue;
4274 	    }
4275 	    if (STRNCMP(arg, "<expr>", 6) == 0)
4276 	    {
4277 		arg = skipwhite(arg + 6);
4278 		continue;
4279 	    }
4280 #endif
4281 	    break;
4282 	}
4283 	xp->xp_pattern = arg;
4284     }
4285 
4286     return NULL;
4287 }
4288 
4289 /*
4290  * Find all mapping/abbreviation names that match regexp 'prog'.
4291  * For command line expansion of ":[un]map" and ":[un]abbrev" in all modes.
4292  * Return OK if matches found, FAIL otherwise.
4293  */
4294     int
4295 ExpandMappings(regmatch, num_file, file)
4296     regmatch_T	*regmatch;
4297     int		*num_file;
4298     char_u	***file;
4299 {
4300     mapblock_T	*mp;
4301     int		hash;
4302     int		count;
4303     int		round;
4304     char_u	*p;
4305     int		i;
4306 
4307     validate_maphash();
4308 
4309     *num_file = 0;		    /* return values in case of FAIL */
4310     *file = NULL;
4311 
4312     /*
4313      * round == 1: Count the matches.
4314      * round == 2: Build the array to keep the matches.
4315      */
4316     for (round = 1; round <= 2; ++round)
4317     {
4318 	count = 0;
4319 
4320 	for (i = 0; i < 6; ++i)
4321 	{
4322 	    if (i == 0)
4323 		p = (char_u *)"<silent>";
4324 	    else if (i == 1)
4325 		p = (char_u *)"<unique>";
4326 #ifdef FEAT_EVAL
4327 	    else if (i == 2)
4328 		p = (char_u *)"<script>";
4329 	    else if (i == 3)
4330 		p = (char_u *)"<expr>";
4331 #endif
4332 #ifdef FEAT_LOCALMAP
4333 	    else if (i == 4 && !expand_buffer)
4334 		p = (char_u *)"<buffer>";
4335 #endif
4336 	    else if (i == 5)
4337 		p = (char_u *)"<nowait>";
4338 	    else
4339 		continue;
4340 
4341 	    if (vim_regexec(regmatch, p, (colnr_T)0))
4342 	    {
4343 		if (round == 1)
4344 		    ++count;
4345 		else
4346 		    (*file)[count++] = vim_strsave(p);
4347 	    }
4348 	}
4349 
4350 	for (hash = 0; hash < 256; ++hash)
4351 	{
4352 	    if (expand_isabbrev)
4353 	    {
4354 		if (hash > 0)	/* only one abbrev list */
4355 		    break; /* for (hash) */
4356 		mp = first_abbr;
4357 	    }
4358 #ifdef FEAT_LOCALMAP
4359 	    else if (expand_buffer)
4360 		mp = curbuf->b_maphash[hash];
4361 #endif
4362 	    else
4363 		mp = maphash[hash];
4364 	    for (; mp; mp = mp->m_next)
4365 	    {
4366 		if (mp->m_mode & expand_mapmodes)
4367 		{
4368 		    p = translate_mapping(mp->m_keys, TRUE);
4369 		    if (p != NULL && vim_regexec(regmatch, p, (colnr_T)0))
4370 		    {
4371 			if (round == 1)
4372 			    ++count;
4373 			else
4374 			{
4375 			    (*file)[count++] = p;
4376 			    p = NULL;
4377 			}
4378 		    }
4379 		    vim_free(p);
4380 		}
4381 	    } /* for (mp) */
4382 	} /* for (hash) */
4383 
4384 	if (count == 0)			/* no match found */
4385 	    break; /* for (round) */
4386 
4387 	if (round == 1)
4388 	{
4389 	    *file = (char_u **)alloc((unsigned)(count * sizeof(char_u *)));
4390 	    if (*file == NULL)
4391 		return FAIL;
4392 	}
4393     } /* for (round) */
4394 
4395     if (count > 1)
4396     {
4397 	char_u	**ptr1;
4398 	char_u	**ptr2;
4399 	char_u	**ptr3;
4400 
4401 	/* Sort the matches */
4402 	sort_strings(*file, count);
4403 
4404 	/* Remove multiple entries */
4405 	ptr1 = *file;
4406 	ptr2 = ptr1 + 1;
4407 	ptr3 = ptr1 + count;
4408 
4409 	while (ptr2 < ptr3)
4410 	{
4411 	    if (STRCMP(*ptr1, *ptr2))
4412 		*++ptr1 = *ptr2++;
4413 	    else
4414 	    {
4415 		vim_free(*ptr2++);
4416 		count--;
4417 	    }
4418 	}
4419     }
4420 
4421     *num_file = count;
4422     return (count == 0 ? FAIL : OK);
4423 }
4424 #endif /* FEAT_CMDL_COMPL */
4425 
4426 /*
4427  * Check for an abbreviation.
4428  * Cursor is at ptr[col]. When inserting, mincol is where insert started.
4429  * "c" is the character typed before check_abbr was called.  It may have
4430  * ABBR_OFF added to avoid prepending a CTRL-V to it.
4431  *
4432  * Historic vi practice: The last character of an abbreviation must be an id
4433  * character ([a-zA-Z0-9_]). The characters in front of it must be all id
4434  * characters or all non-id characters. This allows for abbr. "#i" to
4435  * "#include".
4436  *
4437  * Vim addition: Allow for abbreviations that end in a non-keyword character.
4438  * Then there must be white space before the abbr.
4439  *
4440  * return TRUE if there is an abbreviation, FALSE if not
4441  */
4442     int
4443 check_abbr(c, ptr, col, mincol)
4444     int		c;
4445     char_u	*ptr;
4446     int		col;
4447     int		mincol;
4448 {
4449     int		len;
4450     int		scol;		/* starting column of the abbr. */
4451     int		j;
4452     char_u	*s;
4453     char_u	tb[MB_MAXBYTES + 4];
4454     mapblock_T	*mp;
4455 #ifdef FEAT_LOCALMAP
4456     mapblock_T	*mp2;
4457 #endif
4458 #ifdef FEAT_MBYTE
4459     int		clen = 0;	/* length in characters */
4460 #endif
4461     int		is_id = TRUE;
4462     int		vim_abbr;
4463 
4464     if (typebuf.tb_no_abbr_cnt)	/* abbrev. are not recursive */
4465 	return FALSE;
4466 
4467     /* no remapping implies no abbreviation, except for CTRL-] */
4468     if ((KeyNoremap & (RM_NONE|RM_SCRIPT)) != 0 && c != Ctrl_RSB)
4469 	return FALSE;
4470 
4471     /*
4472      * Check for word before the cursor: If it ends in a keyword char all
4473      * chars before it must be keyword chars or non-keyword chars, but not
4474      * white space. If it ends in a non-keyword char we accept any characters
4475      * before it except white space.
4476      */
4477     if (col == 0)				/* cannot be an abbr. */
4478 	return FALSE;
4479 
4480 #ifdef FEAT_MBYTE
4481     if (has_mbyte)
4482     {
4483 	char_u *p;
4484 
4485 	p = mb_prevptr(ptr, ptr + col);
4486 	if (!vim_iswordp(p))
4487 	    vim_abbr = TRUE;			/* Vim added abbr. */
4488 	else
4489 	{
4490 	    vim_abbr = FALSE;			/* vi compatible abbr. */
4491 	    if (p > ptr)
4492 		is_id = vim_iswordp(mb_prevptr(ptr, p));
4493 	}
4494 	clen = 1;
4495 	while (p > ptr + mincol)
4496 	{
4497 	    p = mb_prevptr(ptr, p);
4498 	    if (vim_isspace(*p) || (!vim_abbr && is_id != vim_iswordp(p)))
4499 	    {
4500 		p += (*mb_ptr2len)(p);
4501 		break;
4502 	    }
4503 	    ++clen;
4504 	}
4505 	scol = (int)(p - ptr);
4506     }
4507     else
4508 #endif
4509     {
4510 	if (!vim_iswordc(ptr[col - 1]))
4511 	    vim_abbr = TRUE;			/* Vim added abbr. */
4512 	else
4513 	{
4514 	    vim_abbr = FALSE;			/* vi compatible abbr. */
4515 	    if (col > 1)
4516 		is_id = vim_iswordc(ptr[col - 2]);
4517 	}
4518 	for (scol = col - 1; scol > 0 && !vim_isspace(ptr[scol - 1])
4519 		&& (vim_abbr || is_id == vim_iswordc(ptr[scol - 1])); --scol)
4520 	    ;
4521     }
4522 
4523     if (scol < mincol)
4524 	scol = mincol;
4525     if (scol < col)		/* there is a word in front of the cursor */
4526     {
4527 	ptr += scol;
4528 	len = col - scol;
4529 #ifdef FEAT_LOCALMAP
4530 	mp = curbuf->b_first_abbr;
4531 	mp2 = first_abbr;
4532 	if (mp == NULL)
4533 	{
4534 	    mp = mp2;
4535 	    mp2 = NULL;
4536 	}
4537 #else
4538 	mp = first_abbr;
4539 #endif
4540 	for ( ; mp;
4541 #ifdef FEAT_LOCALMAP
4542 		mp->m_next == NULL ? (mp = mp2, mp2 = NULL) :
4543 #endif
4544 		(mp = mp->m_next))
4545 	{
4546 	    int		qlen = mp->m_keylen;
4547 	    char_u	*q = mp->m_keys;
4548 	    int		match;
4549 
4550 	    if (vim_strbyte(mp->m_keys, K_SPECIAL) != NULL)
4551 	    {
4552 		/* might have CSI escaped mp->m_keys */
4553 		q = vim_strsave(mp->m_keys);
4554 		if (q != NULL)
4555 		{
4556 		    vim_unescape_csi(q);
4557 		    qlen = (int)STRLEN(q);
4558 		}
4559 	    }
4560 
4561 	    /* find entries with right mode and keys */
4562 	    match =    (mp->m_mode & State)
4563 		    && qlen == len
4564 		    && !STRNCMP(q, ptr, (size_t)len);
4565 	    if (q != mp->m_keys)
4566 		vim_free(q);
4567 	    if (match)
4568 		break;
4569 	}
4570 	if (mp != NULL)
4571 	{
4572 	    /*
4573 	     * Found a match:
4574 	     * Insert the rest of the abbreviation in typebuf.tb_buf[].
4575 	     * This goes from end to start.
4576 	     *
4577 	     * Characters 0x000 - 0x100: normal chars, may need CTRL-V,
4578 	     * except K_SPECIAL: Becomes K_SPECIAL KS_SPECIAL KE_FILLER
4579 	     * Characters where IS_SPECIAL() == TRUE: key codes, need
4580 	     * K_SPECIAL. Other characters (with ABBR_OFF): don't use CTRL-V.
4581 	     *
4582 	     * Character CTRL-] is treated specially - it completes the
4583 	     * abbreviation, but is not inserted into the input stream.
4584 	     */
4585 	    j = 0;
4586 	    if (c != Ctrl_RSB)
4587 	    {
4588 					/* special key code, split up */
4589 		if (IS_SPECIAL(c) || c == K_SPECIAL)
4590 		{
4591 		    tb[j++] = K_SPECIAL;
4592 		    tb[j++] = K_SECOND(c);
4593 		    tb[j++] = K_THIRD(c);
4594 		}
4595 		else
4596 		{
4597 		    if (c < ABBR_OFF && (c < ' ' || c > '~'))
4598 			tb[j++] = Ctrl_V;	/* special char needs CTRL-V */
4599 #ifdef FEAT_MBYTE
4600 		    if (has_mbyte)
4601 		    {
4602 			/* if ABBR_OFF has been added, remove it here */
4603 			if (c >= ABBR_OFF)
4604 			    c -= ABBR_OFF;
4605 			j += (*mb_char2bytes)(c, tb + j);
4606 		    }
4607 		    else
4608 #endif
4609 			tb[j++] = c;
4610 		}
4611 		tb[j] = NUL;
4612 					/* insert the last typed char */
4613 		(void)ins_typebuf(tb, 1, 0, TRUE, mp->m_silent);
4614 	    }
4615 #ifdef FEAT_EVAL
4616 	    if (mp->m_expr)
4617 		s = eval_map_expr(mp->m_str, c);
4618 	    else
4619 #endif
4620 		s = mp->m_str;
4621 	    if (s != NULL)
4622 	    {
4623 					/* insert the to string */
4624 		(void)ins_typebuf(s, mp->m_noremap, 0, TRUE, mp->m_silent);
4625 					/* no abbrev. for these chars */
4626 		typebuf.tb_no_abbr_cnt += (int)STRLEN(s) + j + 1;
4627 #ifdef FEAT_EVAL
4628 		if (mp->m_expr)
4629 		    vim_free(s);
4630 #endif
4631 	    }
4632 
4633 	    tb[0] = Ctrl_H;
4634 	    tb[1] = NUL;
4635 #ifdef FEAT_MBYTE
4636 	    if (has_mbyte)
4637 		len = clen;	/* Delete characters instead of bytes */
4638 #endif
4639 	    while (len-- > 0)		/* delete the from string */
4640 		(void)ins_typebuf(tb, 1, 0, TRUE, mp->m_silent);
4641 	    return TRUE;
4642 	}
4643     }
4644     return FALSE;
4645 }
4646 
4647 #ifdef FEAT_EVAL
4648 /*
4649  * Evaluate the RHS of a mapping or abbreviations and take care of escaping
4650  * special characters.
4651  */
4652     static char_u *
4653 eval_map_expr(str, c)
4654     char_u	*str;
4655     int		c;	    /* NUL or typed character for abbreviation */
4656 {
4657     char_u	*res;
4658     char_u	*p;
4659     char_u	*expr;
4660     char_u	*save_cmd;
4661     pos_T	save_cursor;
4662     int		save_msg_col;
4663     int		save_msg_row;
4664 
4665     /* Remove escaping of CSI, because "str" is in a format to be used as
4666      * typeahead. */
4667     expr = vim_strsave(str);
4668     if (expr == NULL)
4669 	return NULL;
4670     vim_unescape_csi(expr);
4671 
4672     save_cmd = save_cmdline_alloc();
4673     if (save_cmd == NULL)
4674     {
4675 	vim_free(expr);
4676 	return NULL;
4677     }
4678 
4679     /* Forbid changing text or using ":normal" to avoid most of the bad side
4680      * effects.  Also restore the cursor position. */
4681     ++textlock;
4682 #ifdef FEAT_EX_EXTRA
4683     ++ex_normal_lock;
4684 #endif
4685     set_vim_var_char(c);  /* set v:char to the typed character */
4686     save_cursor = curwin->w_cursor;
4687     save_msg_col = msg_col;
4688     save_msg_row = msg_row;
4689     p = eval_to_string(expr, NULL, FALSE);
4690     --textlock;
4691 #ifdef FEAT_EX_EXTRA
4692     --ex_normal_lock;
4693 #endif
4694     curwin->w_cursor = save_cursor;
4695     msg_col = save_msg_col;
4696     msg_row = save_msg_row;
4697 
4698     restore_cmdline_alloc(save_cmd);
4699     vim_free(expr);
4700 
4701     if (p == NULL)
4702 	return NULL;
4703     /* Escape CSI in the result to be able to use the string as typeahead. */
4704     res = vim_strsave_escape_csi(p);
4705     vim_free(p);
4706 
4707     return res;
4708 }
4709 #endif
4710 
4711 /*
4712  * Copy "p" to allocated memory, escaping K_SPECIAL and CSI so that the result
4713  * can be put in the typeahead buffer.
4714  * Returns NULL when out of memory.
4715  */
4716     char_u *
4717 vim_strsave_escape_csi(p)
4718     char_u *p;
4719 {
4720     char_u	*res;
4721     char_u	*s, *d;
4722 
4723     /* Need a buffer to hold up to three times as much. */
4724     res = alloc((unsigned)(STRLEN(p) * 3) + 1);
4725     if (res != NULL)
4726     {
4727 	d = res;
4728 	for (s = p; *s != NUL; )
4729 	{
4730 	    if (s[0] == K_SPECIAL && s[1] != NUL && s[2] != NUL)
4731 	    {
4732 		/* Copy special key unmodified. */
4733 		*d++ = *s++;
4734 		*d++ = *s++;
4735 		*d++ = *s++;
4736 	    }
4737 	    else
4738 	    {
4739 #ifdef FEAT_MBYTE
4740 		int len  = mb_char2len(PTR2CHAR(s));
4741 		int len2 = mb_ptr2len(s);
4742 #endif
4743 		/* Add character, possibly multi-byte to destination, escaping
4744 		 * CSI and K_SPECIAL. */
4745 		d = add_char2buf(PTR2CHAR(s), d);
4746 #ifdef FEAT_MBYTE
4747 		while (len < len2)
4748 		{
4749 		    /* add following combining char */
4750 		    d = add_char2buf(PTR2CHAR(s + len), d);
4751 		    len += mb_char2len(PTR2CHAR(s + len));
4752 		}
4753 #endif
4754 		mb_ptr_adv(s);
4755 	    }
4756 	}
4757 	*d = NUL;
4758     }
4759     return res;
4760 }
4761 
4762 /*
4763  * Remove escaping from CSI and K_SPECIAL characters.  Reverse of
4764  * vim_strsave_escape_csi().  Works in-place.
4765  */
4766     void
4767 vim_unescape_csi(p)
4768     char_u *p;
4769 {
4770     char_u	*s = p, *d = p;
4771 
4772     while (*s != NUL)
4773     {
4774 	if (s[0] == K_SPECIAL && s[1] == KS_SPECIAL && s[2] == KE_FILLER)
4775 	{
4776 	    *d++ = K_SPECIAL;
4777 	    s += 3;
4778 	}
4779 	else if ((s[0] == K_SPECIAL || s[0] == CSI)
4780 				   && s[1] == KS_EXTRA && s[2] == (int)KE_CSI)
4781 	{
4782 	    *d++ = CSI;
4783 	    s += 3;
4784 	}
4785 	else
4786 	    *d++ = *s++;
4787     }
4788     *d = NUL;
4789 }
4790 
4791 /*
4792  * Write map commands for the current mappings to an .exrc file.
4793  * Return FAIL on error, OK otherwise.
4794  */
4795     int
4796 makemap(fd, buf)
4797     FILE	*fd;
4798     buf_T	*buf;	    /* buffer for local mappings or NULL */
4799 {
4800     mapblock_T	*mp;
4801     char_u	c1, c2, c3;
4802     char_u	*p;
4803     char	*cmd;
4804     int		abbr;
4805     int		hash;
4806     int		did_cpo = FALSE;
4807     int		i;
4808 
4809     validate_maphash();
4810 
4811     /*
4812      * Do the loop twice: Once for mappings, once for abbreviations.
4813      * Then loop over all map hash lists.
4814      */
4815     for (abbr = 0; abbr < 2; ++abbr)
4816 	for (hash = 0; hash < 256; ++hash)
4817 	{
4818 	    if (abbr)
4819 	    {
4820 		if (hash > 0)		/* there is only one abbr list */
4821 		    break;
4822 #ifdef FEAT_LOCALMAP
4823 		if (buf != NULL)
4824 		    mp = buf->b_first_abbr;
4825 		else
4826 #endif
4827 		    mp = first_abbr;
4828 	    }
4829 	    else
4830 	    {
4831 #ifdef FEAT_LOCALMAP
4832 		if (buf != NULL)
4833 		    mp = buf->b_maphash[hash];
4834 		else
4835 #endif
4836 		    mp = maphash[hash];
4837 	    }
4838 
4839 	    for ( ; mp; mp = mp->m_next)
4840 	    {
4841 		/* skip script-local mappings */
4842 		if (mp->m_noremap == REMAP_SCRIPT)
4843 		    continue;
4844 
4845 		/* skip mappings that contain a <SNR> (script-local thing),
4846 		 * they probably don't work when loaded again */
4847 		for (p = mp->m_str; *p != NUL; ++p)
4848 		    if (p[0] == K_SPECIAL && p[1] == KS_EXTRA
4849 						       && p[2] == (int)KE_SNR)
4850 			break;
4851 		if (*p != NUL)
4852 		    continue;
4853 
4854 		/* It's possible to create a mapping and then ":unmap" certain
4855 		 * modes.  We recreate this here by mapping the individual
4856 		 * modes, which requires up to three of them. */
4857 		c1 = NUL;
4858 		c2 = NUL;
4859 		c3 = NUL;
4860 		if (abbr)
4861 		    cmd = "abbr";
4862 		else
4863 		    cmd = "map";
4864 		switch (mp->m_mode)
4865 		{
4866 		    case NORMAL + VISUAL + SELECTMODE + OP_PENDING:
4867 			break;
4868 		    case NORMAL:
4869 			c1 = 'n';
4870 			break;
4871 		    case VISUAL:
4872 			c1 = 'x';
4873 			break;
4874 		    case SELECTMODE:
4875 			c1 = 's';
4876 			break;
4877 		    case OP_PENDING:
4878 			c1 = 'o';
4879 			break;
4880 		    case NORMAL + VISUAL:
4881 			c1 = 'n';
4882 			c2 = 'x';
4883 			break;
4884 		    case NORMAL + SELECTMODE:
4885 			c1 = 'n';
4886 			c2 = 's';
4887 			break;
4888 		    case NORMAL + OP_PENDING:
4889 			c1 = 'n';
4890 			c2 = 'o';
4891 			break;
4892 		    case VISUAL + SELECTMODE:
4893 			c1 = 'v';
4894 			break;
4895 		    case VISUAL + OP_PENDING:
4896 			c1 = 'x';
4897 			c2 = 'o';
4898 			break;
4899 		    case SELECTMODE + OP_PENDING:
4900 			c1 = 's';
4901 			c2 = 'o';
4902 			break;
4903 		    case NORMAL + VISUAL + SELECTMODE:
4904 			c1 = 'n';
4905 			c2 = 'v';
4906 			break;
4907 		    case NORMAL + VISUAL + OP_PENDING:
4908 			c1 = 'n';
4909 			c2 = 'x';
4910 			c3 = 'o';
4911 			break;
4912 		    case NORMAL + SELECTMODE + OP_PENDING:
4913 			c1 = 'n';
4914 			c2 = 's';
4915 			c3 = 'o';
4916 			break;
4917 		    case VISUAL + SELECTMODE + OP_PENDING:
4918 			c1 = 'v';
4919 			c2 = 'o';
4920 			break;
4921 		    case CMDLINE + INSERT:
4922 			if (!abbr)
4923 			    cmd = "map!";
4924 			break;
4925 		    case CMDLINE:
4926 			c1 = 'c';
4927 			break;
4928 		    case INSERT:
4929 			c1 = 'i';
4930 			break;
4931 		    case LANGMAP:
4932 			c1 = 'l';
4933 			break;
4934 		    default:
4935 			EMSG(_("E228: makemap: Illegal mode"));
4936 			return FAIL;
4937 		}
4938 		do	/* do this twice if c2 is set, 3 times with c3 */
4939 		{
4940 		    /* When outputting <> form, need to make sure that 'cpo'
4941 		     * is set to the Vim default. */
4942 		    if (!did_cpo)
4943 		    {
4944 			if (*mp->m_str == NUL)		/* will use <Nop> */
4945 			    did_cpo = TRUE;
4946 			else
4947 			    for (i = 0; i < 2; ++i)
4948 				for (p = (i ? mp->m_str : mp->m_keys); *p; ++p)
4949 				    if (*p == K_SPECIAL || *p == NL)
4950 					did_cpo = TRUE;
4951 			if (did_cpo)
4952 			{
4953 			    if (fprintf(fd, "let s:cpo_save=&cpo") < 0
4954 				    || put_eol(fd) < 0
4955 				    || fprintf(fd, "set cpo&vim") < 0
4956 				    || put_eol(fd) < 0)
4957 				return FAIL;
4958 			}
4959 		    }
4960 		    if (c1 && putc(c1, fd) < 0)
4961 			return FAIL;
4962 		    if (mp->m_noremap != REMAP_YES && fprintf(fd, "nore") < 0)
4963 			return FAIL;
4964 		    if (fputs(cmd, fd) < 0)
4965 			return FAIL;
4966 		    if (buf != NULL && fputs(" <buffer>", fd) < 0)
4967 			return FAIL;
4968 		    if (mp->m_nowait && fputs(" <nowait>", fd) < 0)
4969 			return FAIL;
4970 		    if (mp->m_silent && fputs(" <silent>", fd) < 0)
4971 			return FAIL;
4972 #ifdef FEAT_EVAL
4973 		    if (mp->m_noremap == REMAP_SCRIPT
4974 						 && fputs("<script>", fd) < 0)
4975 			return FAIL;
4976 		    if (mp->m_expr && fputs(" <expr>", fd) < 0)
4977 			return FAIL;
4978 #endif
4979 
4980 		    if (       putc(' ', fd) < 0
4981 			    || put_escstr(fd, mp->m_keys, 0) == FAIL
4982 			    || putc(' ', fd) < 0
4983 			    || put_escstr(fd, mp->m_str, 1) == FAIL
4984 			    || put_eol(fd) < 0)
4985 			return FAIL;
4986 		    c1 = c2;
4987 		    c2 = c3;
4988 		    c3 = NUL;
4989 		} while (c1 != NUL);
4990 	    }
4991 	}
4992 
4993     if (did_cpo)
4994 	if (fprintf(fd, "let &cpo=s:cpo_save") < 0
4995 		|| put_eol(fd) < 0
4996 		|| fprintf(fd, "unlet s:cpo_save") < 0
4997 		|| put_eol(fd) < 0)
4998 	    return FAIL;
4999     return OK;
5000 }
5001 
5002 /*
5003  * write escape string to file
5004  * "what": 0 for :map lhs, 1 for :map rhs, 2 for :set
5005  *
5006  * return FAIL for failure, OK otherwise
5007  */
5008     int
5009 put_escstr(fd, strstart, what)
5010     FILE	*fd;
5011     char_u	*strstart;
5012     int		what;
5013 {
5014     char_u	*str = strstart;
5015     int		c;
5016     int		modifiers;
5017 
5018     /* :map xx <Nop> */
5019     if (*str == NUL && what == 1)
5020     {
5021 	if (fprintf(fd, "<Nop>") < 0)
5022 	    return FAIL;
5023 	return OK;
5024     }
5025 
5026     for ( ; *str != NUL; ++str)
5027     {
5028 #ifdef FEAT_MBYTE
5029 	char_u	*p;
5030 
5031 	/* Check for a multi-byte character, which may contain escaped
5032 	 * K_SPECIAL and CSI bytes */
5033 	p = mb_unescape(&str);
5034 	if (p != NULL)
5035 	{
5036 	    while (*p != NUL)
5037 		if (fputc(*p++, fd) < 0)
5038 		    return FAIL;
5039 	    --str;
5040 	    continue;
5041 	}
5042 #endif
5043 
5044 	c = *str;
5045 	/*
5046 	 * Special key codes have to be translated to be able to make sense
5047 	 * when they are read back.
5048 	 */
5049 	if (c == K_SPECIAL && what != 2)
5050 	{
5051 	    modifiers = 0x0;
5052 	    if (str[1] == KS_MODIFIER)
5053 	    {
5054 		modifiers = str[2];
5055 		str += 3;
5056 		c = *str;
5057 	    }
5058 	    if (c == K_SPECIAL)
5059 	    {
5060 		c = TO_SPECIAL(str[1], str[2]);
5061 		str += 2;
5062 	    }
5063 	    if (IS_SPECIAL(c) || modifiers)	/* special key */
5064 	    {
5065 		if (fputs((char *)get_special_key_name(c, modifiers), fd) < 0)
5066 		    return FAIL;
5067 		continue;
5068 	    }
5069 	}
5070 
5071 	/*
5072 	 * A '\n' in a map command should be written as <NL>.
5073 	 * A '\n' in a set command should be written as \^V^J.
5074 	 */
5075 	if (c == NL)
5076 	{
5077 	    if (what == 2)
5078 	    {
5079 		if (fprintf(fd, IF_EB("\\\026\n", "\\" CTRL_V_STR "\n")) < 0)
5080 		    return FAIL;
5081 	    }
5082 	    else
5083 	    {
5084 		if (fprintf(fd, "<NL>") < 0)
5085 		    return FAIL;
5086 	    }
5087 	    continue;
5088 	}
5089 
5090 	/*
5091 	 * Some characters have to be escaped with CTRL-V to
5092 	 * prevent them from misinterpreted in DoOneCmd().
5093 	 * A space, Tab and '"' has to be escaped with a backslash to
5094 	 * prevent it to be misinterpreted in do_set().
5095 	 * A space has to be escaped with a CTRL-V when it's at the start of a
5096 	 * ":map" rhs.
5097 	 * A '<' has to be escaped with a CTRL-V to prevent it being
5098 	 * interpreted as the start of a special key name.
5099 	 * A space in the lhs of a :map needs a CTRL-V.
5100 	 */
5101 	if (what == 2 && (vim_iswhite(c) || c == '"' || c == '\\'))
5102 	{
5103 	    if (putc('\\', fd) < 0)
5104 		return FAIL;
5105 	}
5106 	else if (c < ' ' || c > '~' || c == '|'
5107 		|| (what == 0 && c == ' ')
5108 		|| (what == 1 && str == strstart && c == ' ')
5109 		|| (what != 2 && c == '<'))
5110 	{
5111 	    if (putc(Ctrl_V, fd) < 0)
5112 		return FAIL;
5113 	}
5114 	if (putc(c, fd) < 0)
5115 	    return FAIL;
5116     }
5117     return OK;
5118 }
5119 
5120 /*
5121  * Check all mappings for the presence of special key codes.
5122  * Used after ":set term=xxx".
5123  */
5124     void
5125 check_map_keycodes()
5126 {
5127     mapblock_T	*mp;
5128     char_u	*p;
5129     int		i;
5130     char_u	buf[3];
5131     char_u	*save_name;
5132     int		abbr;
5133     int		hash;
5134 #ifdef FEAT_LOCALMAP
5135     buf_T	*bp;
5136 #endif
5137 
5138     validate_maphash();
5139     save_name = sourcing_name;
5140     sourcing_name = (char_u *)"mappings"; /* avoids giving error messages */
5141 
5142 #ifdef FEAT_LOCALMAP
5143     /* This this once for each buffer, and then once for global
5144      * mappings/abbreviations with bp == NULL */
5145     for (bp = firstbuf; ; bp = bp->b_next)
5146     {
5147 #endif
5148 	/*
5149 	 * Do the loop twice: Once for mappings, once for abbreviations.
5150 	 * Then loop over all map hash lists.
5151 	 */
5152 	for (abbr = 0; abbr <= 1; ++abbr)
5153 	    for (hash = 0; hash < 256; ++hash)
5154 	    {
5155 		if (abbr)
5156 		{
5157 		    if (hash)	    /* there is only one abbr list */
5158 			break;
5159 #ifdef FEAT_LOCALMAP
5160 		    if (bp != NULL)
5161 			mp = bp->b_first_abbr;
5162 		    else
5163 #endif
5164 			mp = first_abbr;
5165 		}
5166 		else
5167 		{
5168 #ifdef FEAT_LOCALMAP
5169 		    if (bp != NULL)
5170 			mp = bp->b_maphash[hash];
5171 		    else
5172 #endif
5173 			mp = maphash[hash];
5174 		}
5175 		for ( ; mp != NULL; mp = mp->m_next)
5176 		{
5177 		    for (i = 0; i <= 1; ++i)	/* do this twice */
5178 		    {
5179 			if (i == 0)
5180 			    p = mp->m_keys;	/* once for the "from" part */
5181 			else
5182 			    p = mp->m_str;	/* and once for the "to" part */
5183 			while (*p)
5184 			{
5185 			    if (*p == K_SPECIAL)
5186 			    {
5187 				++p;
5188 				if (*p < 128)   /* for "normal" tcap entries */
5189 				{
5190 				    buf[0] = p[0];
5191 				    buf[1] = p[1];
5192 				    buf[2] = NUL;
5193 				    (void)add_termcap_entry(buf, FALSE);
5194 				}
5195 				++p;
5196 			    }
5197 			    ++p;
5198 			}
5199 		    }
5200 		}
5201 	    }
5202 #ifdef FEAT_LOCALMAP
5203 	if (bp == NULL)
5204 	    break;
5205     }
5206 #endif
5207     sourcing_name = save_name;
5208 }
5209 
5210 #if defined(FEAT_EVAL) || defined(PROTO)
5211 /*
5212  * Check the string "keys" against the lhs of all mappings.
5213  * Return pointer to rhs of mapping (mapblock->m_str).
5214  * NULL when no mapping found.
5215  */
5216     char_u *
5217 check_map(keys, mode, exact, ign_mod, abbr, mp_ptr, local_ptr)
5218     char_u	*keys;
5219     int		mode;
5220     int		exact;		/* require exact match */
5221     int		ign_mod;	/* ignore preceding modifier */
5222     int		abbr;		/* do abbreviations */
5223     mapblock_T	**mp_ptr;	/* return: pointer to mapblock or NULL */
5224     int		*local_ptr;	/* return: buffer-local mapping or NULL */
5225 {
5226     int		hash;
5227     int		len, minlen;
5228     mapblock_T	*mp;
5229     char_u	*s;
5230 #ifdef FEAT_LOCALMAP
5231     int		local;
5232 #endif
5233 
5234     validate_maphash();
5235 
5236     len = (int)STRLEN(keys);
5237 #ifdef FEAT_LOCALMAP
5238     for (local = 1; local >= 0; --local)
5239 #endif
5240 	/* loop over all hash lists */
5241 	for (hash = 0; hash < 256; ++hash)
5242 	{
5243 	    if (abbr)
5244 	    {
5245 		if (hash > 0)		/* there is only one list. */
5246 		    break;
5247 #ifdef FEAT_LOCALMAP
5248 		if (local)
5249 		    mp = curbuf->b_first_abbr;
5250 		else
5251 #endif
5252 		    mp = first_abbr;
5253 	    }
5254 #ifdef FEAT_LOCALMAP
5255 	    else if (local)
5256 		mp = curbuf->b_maphash[hash];
5257 #endif
5258 	    else
5259 		mp = maphash[hash];
5260 	    for ( ; mp != NULL; mp = mp->m_next)
5261 	    {
5262 		/* skip entries with wrong mode, wrong length and not matching
5263 		 * ones */
5264 		if ((mp->m_mode & mode) && (!exact || mp->m_keylen == len))
5265 		{
5266 		    if (len > mp->m_keylen)
5267 			minlen = mp->m_keylen;
5268 		    else
5269 			minlen = len;
5270 		    s = mp->m_keys;
5271 		    if (ign_mod && s[0] == K_SPECIAL && s[1] == KS_MODIFIER
5272 							       && s[2] != NUL)
5273 		    {
5274 			s += 3;
5275 			if (len > mp->m_keylen - 3)
5276 			    minlen = mp->m_keylen - 3;
5277 		    }
5278 		    if (STRNCMP(s, keys, minlen) == 0)
5279 		    {
5280 			if (mp_ptr != NULL)
5281 			    *mp_ptr = mp;
5282 			if (local_ptr != NULL)
5283 #ifdef FEAT_LOCALMAP
5284 			    *local_ptr = local;
5285 #else
5286 			    *local_ptr = 0;
5287 #endif
5288 			return mp->m_str;
5289 		    }
5290 		}
5291 	    }
5292 	}
5293 
5294     return NULL;
5295 }
5296 #endif
5297 
5298 #if defined(MSDOS) || defined(MSWIN) || defined(OS2) || defined(MACOS)
5299 
5300 #define VIS_SEL	(VISUAL+SELECTMODE)	/* abbreviation */
5301 
5302 /*
5303  * Default mappings for some often used keys.
5304  */
5305 static struct initmap
5306 {
5307     char_u	*arg;
5308     int		mode;
5309 } initmappings[] =
5310 {
5311 #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
5312 	/* Use the Windows (CUA) keybindings. */
5313 # ifdef FEAT_GUI
5314 	/* paste, copy and cut */
5315 	{(char_u *)"<S-Insert> \"*P", NORMAL},
5316 	{(char_u *)"<S-Insert> \"-d\"*P", VIS_SEL},
5317 	{(char_u *)"<S-Insert> <C-R><C-O>*", INSERT+CMDLINE},
5318 	{(char_u *)"<C-Insert> \"*y", VIS_SEL},
5319 	{(char_u *)"<S-Del> \"*d", VIS_SEL},
5320 	{(char_u *)"<C-Del> \"*d", VIS_SEL},
5321 	{(char_u *)"<C-X> \"*d", VIS_SEL},
5322 	/* Missing: CTRL-C (cancel) and CTRL-V (block selection) */
5323 # else
5324 	{(char_u *)"\316w <C-Home>", NORMAL+VIS_SEL},
5325 	{(char_u *)"\316w <C-Home>", INSERT+CMDLINE},
5326 	{(char_u *)"\316u <C-End>", NORMAL+VIS_SEL},
5327 	{(char_u *)"\316u <C-End>", INSERT+CMDLINE},
5328 
5329 	/* paste, copy and cut */
5330 #  ifdef FEAT_CLIPBOARD
5331 #   ifdef DJGPP
5332 	{(char_u *)"\316\122 \"*P", NORMAL},	    /* SHIFT-Insert is "*P */
5333 	{(char_u *)"\316\122 \"-d\"*P", VIS_SEL},   /* SHIFT-Insert is "-d"*P */
5334 	{(char_u *)"\316\122 \022\017*", INSERT},  /* SHIFT-Insert is ^R^O* */
5335 	{(char_u *)"\316\222 \"*y", VIS_SEL},	    /* CTRL-Insert is "*y */
5336 #    if 0 /* Shift-Del produces the same code as Del */
5337 	{(char_u *)"\316\123 \"*d", VIS_SEL},	    /* SHIFT-Del is "*d */
5338 #    endif
5339 	{(char_u *)"\316\223 \"*d", VIS_SEL},	    /* CTRL-Del is "*d */
5340 	{(char_u *)"\030 \"-d", VIS_SEL},	    /* CTRL-X is "-d */
5341 #   else
5342 	{(char_u *)"\316\324 \"*P", NORMAL},	    /* SHIFT-Insert is "*P */
5343 	{(char_u *)"\316\324 \"-d\"*P", VIS_SEL},   /* SHIFT-Insert is "-d"*P */
5344 	{(char_u *)"\316\324 \022\017*", INSERT},  /* SHIFT-Insert is ^R^O* */
5345 	{(char_u *)"\316\325 \"*y", VIS_SEL},	    /* CTRL-Insert is "*y */
5346 	{(char_u *)"\316\327 \"*d", VIS_SEL},	    /* SHIFT-Del is "*d */
5347 	{(char_u *)"\316\330 \"*d", VIS_SEL},	    /* CTRL-Del is "*d */
5348 	{(char_u *)"\030 \"-d", VIS_SEL},	    /* CTRL-X is "-d */
5349 #   endif
5350 #  else
5351 	{(char_u *)"\316\324 P", NORMAL},	    /* SHIFT-Insert is P */
5352 	{(char_u *)"\316\324 \"-dP", VIS_SEL},	    /* SHIFT-Insert is "-dP */
5353 	{(char_u *)"\316\324 \022\017\"", INSERT}, /* SHIFT-Insert is ^R^O" */
5354 	{(char_u *)"\316\325 y", VIS_SEL},	    /* CTRL-Insert is y */
5355 	{(char_u *)"\316\327 d", VIS_SEL},	    /* SHIFT-Del is d */
5356 	{(char_u *)"\316\330 d", VIS_SEL},	    /* CTRL-Del is d */
5357 #  endif
5358 # endif
5359 #endif
5360 
5361 #if defined(MACOS)
5362 	/* Use the Standard MacOS binding. */
5363 	/* paste, copy and cut */
5364 	{(char_u *)"<D-v> \"*P", NORMAL},
5365 	{(char_u *)"<D-v> \"-d\"*P", VIS_SEL},
5366 	{(char_u *)"<D-v> <C-R>*", INSERT+CMDLINE},
5367 	{(char_u *)"<D-c> \"*y", VIS_SEL},
5368 	{(char_u *)"<D-x> \"*d", VIS_SEL},
5369 	{(char_u *)"<Backspace> \"-d", VIS_SEL},
5370 #endif
5371 };
5372 
5373 # undef VIS_SEL
5374 #endif
5375 
5376 /*
5377  * Set up default mappings.
5378  */
5379     void
5380 init_mappings()
5381 {
5382 #if defined(MSDOS) || defined(MSWIN) || defined(OS2) || defined(MACOS)
5383     int		i;
5384 
5385     for (i = 0; i < sizeof(initmappings) / sizeof(struct initmap); ++i)
5386 	add_map(initmappings[i].arg, initmappings[i].mode);
5387 #endif
5388 }
5389 
5390 #if defined(MSDOS) || defined(MSWIN) || defined(OS2) \
5391 	|| defined(FEAT_CMDWIN) || defined(MACOS) || defined(PROTO)
5392 /*
5393  * Add a mapping "map" for mode "mode".
5394  * Need to put string in allocated memory, because do_map() will modify it.
5395  */
5396     void
5397 add_map(map, mode)
5398     char_u	*map;
5399     int		mode;
5400 {
5401     char_u	*s;
5402     char_u	*cpo_save = p_cpo;
5403 
5404     p_cpo = (char_u *)"";	/* Allow <> notation */
5405     s = vim_strsave(map);
5406     if (s != NULL)
5407     {
5408 	(void)do_map(0, s, mode, FALSE);
5409 	vim_free(s);
5410     }
5411     p_cpo = cpo_save;
5412 }
5413 #endif
5414