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