getchar.c
上传用户:gddssl
上传日期:2007-01-06
资源大小:1003k
文件大小:67k
源码类别:

编辑器/阅读器

开发平台:

DOS

  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.  */
  8. /*
  9.  * getchar.c
  10.  *
  11.  * functions related with getting a character from the user/mapping/redo/...
  12.  *
  13.  * manipulations with redo buffer and stuff buffer
  14.  * mappings and abbreviations
  15.  */
  16. #include "vim.h"
  17. /*
  18.  * structure used to store one block of the stuff/redo/macro buffers
  19.  */
  20. struct bufblock
  21. {
  22. struct bufblock *b_next; /* pointer to next bufblock */
  23. char_u b_str[1]; /* contents (actually longer) */
  24. };
  25. #define MINIMAL_SIZE 20 /* minimal size for b_str */
  26. /*
  27.  * header used for the stuff buffer and the redo buffer
  28.  */
  29. struct buffheader
  30. {
  31. struct bufblock bh_first; /* first (dummy) block of list */
  32. struct bufblock *bh_curr; /* bufblock for appending */
  33. int bh_index; /* index for reading */
  34. int bh_space; /* space in bh_curr for appending */
  35. };
  36. static struct buffheader stuffbuff = {{NULL, {NUL}}, NULL, 0, 0};
  37. static struct buffheader redobuff = {{NULL, {NUL}}, NULL, 0, 0};
  38. static struct buffheader old_redobuff = {{NULL, {NUL}}, NULL, 0, 0};
  39. #if defined(AUTOCMD) || defined(WANT_EVAL) || defined(PROTO)
  40. static struct buffheader save_redobuff = {{NULL, {NUL}}, NULL, 0, 0};
  41. static struct buffheader save_old_redobuff = {{NULL, {NUL}}, NULL, 0, 0};
  42. #endif
  43. static struct buffheader recordbuff = {{NULL, {NUL}}, NULL, 0, 0};
  44. /*
  45.  * when block_redo is TRUE redo buffer will not be changed
  46.  * used by edit() to repeat insertions and 'V' command for redoing
  47.  */
  48. static int block_redo = FALSE;
  49. /*
  50.  * structure used for mapping
  51.  */
  52. struct mapblock
  53. {
  54.     struct mapblock *m_next;     /* next mapblock in list */
  55.     char_u     *m_keys;     /* mapped from */
  56.     int      m_keylen;     /* strlen(m_keys) */
  57.     char_u     *m_str;     /* mapped to */
  58.     int      m_mode;     /* valid mode */
  59.     int      m_noremap;     /* if non-zero no re-mapping for m_str */
  60. };
  61. /*
  62.  * Make a hash value for a mapping.
  63.  * "mode" is the lower 4 bits of the State for the mapping.
  64.  * "c1" is the first character of the "lhs".
  65.  * Returns a value between 0 and 255, index in maphash.
  66.  * Put Normal/Visual mode mappings mostly separately from Insert/Cmdline mode.
  67.  */
  68. #define MAP_HASH(mode, c1) (((mode) & (NORMAL + VISUAL + OP_PENDING)) ? (c1) : ((c1) ^ 0x80))
  69. /*
  70.  * Each mapping is put in one of the 256 hash lists, to speed up finding it.
  71.  */
  72. static struct mapblock *(maphash[256]);
  73. static int maphash_valid = FALSE;
  74. /*
  75.  * List used for abbreviations.
  76.  */
  77. static struct mapblock *first_abbr = NULL; /* first entry in abbrlist */
  78. /*
  79.  * variables used by vgetorpeek() and flush_buffers()
  80.  *
  81.  * typebuf[] contains all characters that are not consumed yet.
  82.  * typebuf[typeoff] is the first valid character in typebuf[].
  83.  * typebuf[typeoff + typelen - 1] is the last valid char.
  84.  * typebuf[typeoff + typelen] must be NUL.
  85.  * The part in front may contain the result of mappings, abbreviations and
  86.  * @a commands. The length of this part is typemaplen.
  87.  * After it are characters that come from the terminal.
  88.  * no_abbr_cnt is the number of characters in typebuf that should not be
  89.  * considered for abbreviations.
  90.  * Some parts of typebuf may not be mapped. These parts are remembered in
  91.  * noremapbuf, which is the same length as typebuf and contains TRUE for the
  92.  * characters that are not to be remapped. noremapbuf[typeoff] is the first
  93.  * valid flag.
  94.  * (typebuf has been put in globals.h, because check_termcode() needs it).
  95.  */
  96. static char_u *noremapbuf = NULL;   /* flags for typeahead characters */
  97. /* typebuf has three parts: room in front (for result of mappings), the middle
  98.  * for typeahead and room for new characters (which needs to be 3 * MAXMAPLEN)
  99.  * for the Amiga).
  100.  */
  101. #define TYPELEN_INIT (5 * (MAXMAPLEN + 3))
  102. static char_u typebuf_init[TYPELEN_INIT];     /* initial typebuf */
  103. static char_u noremapbuf_init[TYPELEN_INIT];     /* initial noremapbuf */
  104. static int typemaplen = 0;     /* nr of mapped characters in typebuf */
  105. static int no_abbr_cnt = 0;    /* nr of chars without abbrev. in typebuf */
  106. static int last_recorded_len = 0; /* number of last recorded chars */
  107. static void free_buff __ARGS((struct buffheader *));
  108. static char_u *get_bufcont __ARGS((struct buffheader *, int));
  109. static void add_buff __ARGS((struct buffheader *, char_u *));
  110. static void add_num_buff __ARGS((struct buffheader *, long));
  111. static void add_char_buff __ARGS((struct buffheader *, int));
  112. static int read_stuff __ARGS((int));
  113. static void start_stuff __ARGS((void));
  114. static int read_redo __ARGS((int, int));
  115. static void copy_redo __ARGS((int));
  116. static void init_typebuf __ARGS((void));
  117. static void gotchars __ARGS((char_u *, int));
  118. static void may_sync_undo __ARGS((void));
  119. static void closescript __ARGS((void));
  120. static int vgetorpeek __ARGS((int));
  121. static void map_free __ARGS((struct mapblock **));
  122. static void validate_maphash __ARGS((void));
  123. static void showmap __ARGS((struct mapblock *));
  124. /*
  125.  * free and clear a buffer
  126.  */
  127.     static void
  128. free_buff(buf)
  129.     struct buffheader *buf;
  130. {
  131. struct bufblock     *p, *np;
  132. for (p = buf->bh_first.b_next; p != NULL; p = np)
  133. {
  134. np = p->b_next;
  135. vim_free(p);
  136. }
  137. buf->bh_first.b_next = NULL;
  138. }
  139. /*
  140.  * return the contents of a buffer as a single string
  141.  */
  142.     static char_u *
  143. get_bufcont(buffer, dozero)
  144.     struct buffheader *buffer;
  145.     int dozero;     /* count == zero is not an error */
  146. {
  147.     long_u     count = 0;
  148.     char_u     *p = NULL;
  149.     char_u     *p2;
  150.     char_u     *str;
  151.     struct bufblock *bp;
  152. /* compute the total length of the string */
  153.     for (bp = buffer->bh_first.b_next; bp != NULL; bp = bp->b_next)
  154. count += STRLEN(bp->b_str);
  155.     if ((count || dozero) && (p = lalloc(count + 1, TRUE)) != NULL)
  156.     {
  157. p2 = p;
  158. for (bp = buffer->bh_first.b_next; bp != NULL; bp = bp->b_next)
  159.     for (str = bp->b_str; *str; )
  160. *p2++ = *str++;
  161. *p2 = NUL;
  162.     }
  163.     return (p);
  164. }
  165. /*
  166.  * return the contents of the record buffer as a single string
  167.  *  and clear the record buffer
  168.  */
  169.     char_u *
  170. get_recorded()
  171. {
  172.     char_u *p;
  173.     size_t  len;
  174.     p = get_bufcont(&recordbuff, TRUE);
  175.     free_buff(&recordbuff);
  176.     /*
  177.      * Remove the characters that were added the last time, these must be the
  178.      * (possibly mapped) characters that stopped recording.
  179.      */
  180.     len = STRLEN(p);
  181.     if ((int)len >= last_recorded_len)
  182. p[len - last_recorded_len] = NUL;
  183.     return (p);
  184. }
  185. /*
  186.  * return the contents of the redo buffer as a single string
  187.  */
  188.     char_u *
  189. get_inserted()
  190. {
  191.     return(get_bufcont(&redobuff, FALSE));
  192. }
  193. /*
  194.  * add string "s" after the current block of buffer "buf"
  195.  */
  196.     static void
  197. add_buff(buf, s)
  198.     struct buffheader *buf;
  199.     char_u *s;
  200. {
  201.     struct bufblock *p;
  202.     long_u     n;
  203.     long_u     len;
  204.     if ((n = STRLEN(s)) == 0)     /* don't add empty strings */
  205. return;
  206.     if (buf->bh_first.b_next == NULL)     /* first add to list */
  207.     {
  208. buf->bh_space = 0;
  209. buf->bh_curr = &(buf->bh_first);
  210.     }
  211.     else if (buf->bh_curr == NULL)     /* buffer has already been read */
  212.     {
  213. EMSG("Add to read buffer");
  214. return;
  215.     }
  216.     else if (buf->bh_index != 0)
  217. STRCPY(buf->bh_first.b_next->b_str,
  218.  buf->bh_first.b_next->b_str + buf->bh_index);
  219.     buf->bh_index = 0;
  220.     if (buf->bh_space >= (int)n)
  221.     {
  222. strcat((char *)buf->bh_curr->b_str, (char *)s);
  223. buf->bh_space -= n;
  224.     }
  225.     else
  226.     {
  227. if (n < MINIMAL_SIZE)
  228.     len = MINIMAL_SIZE;
  229. else
  230.     len = n;
  231. p = (struct bufblock *)lalloc((long_u)(sizeof(struct bufblock) + len),
  232. TRUE);
  233. if (p == NULL)
  234.     return; /* no space, just forget it */
  235. buf->bh_space = len - n;
  236. STRCPY(p->b_str, s);
  237. p->b_next = buf->bh_curr->b_next;
  238. buf->bh_curr->b_next = p;
  239. buf->bh_curr = p;
  240.     }
  241.     return;
  242. }
  243.     static void
  244. add_num_buff(buf, n)
  245.     struct buffheader *buf;
  246.     long       n;
  247. {
  248. char_u number[32];
  249. sprintf((char *)number, "%ld", n);
  250. add_buff(buf, number);
  251. }
  252.     static void
  253. add_char_buff(buf, c)
  254.     struct buffheader *buf;
  255.     int       c;
  256. {
  257.     char_u  temp[4];
  258.     /*
  259.      * translate special key code into three byte sequence
  260.      */
  261.     if (IS_SPECIAL(c) || c == K_SPECIAL || c == NUL)
  262.     {
  263. temp[0] = K_SPECIAL;
  264. temp[1] = K_SECOND(c);
  265. temp[2] = K_THIRD(c);
  266. temp[3] = NUL;
  267.     }
  268.     else
  269.     {
  270. temp[0] = c;
  271. temp[1] = NUL;
  272.     }
  273.     add_buff(buf, temp);
  274. }
  275. /*
  276.  * get one character from the stuff buffer
  277.  * If advance == TRUE go to the next char.
  278.  */
  279.     static int
  280. read_stuff(advance)
  281.     int advance;
  282. {
  283.     char_u c;
  284.     struct bufblock *curr;
  285.     if (stuffbuff.bh_first.b_next == NULL)  /* buffer is empty */
  286. return NUL;
  287.     curr = stuffbuff.bh_first.b_next;
  288.     c = curr->b_str[stuffbuff.bh_index];
  289.     if (advance)
  290.     {
  291. if (curr->b_str[++stuffbuff.bh_index] == NUL)
  292. {
  293.     stuffbuff.bh_first.b_next = curr->b_next;
  294.     vim_free(curr);
  295.     stuffbuff.bh_index = 0;
  296. }
  297.     }
  298.     return c;
  299. }
  300. /*
  301.  * prepare stuff buffer for reading (if it contains something)
  302.  */
  303.     static void
  304. start_stuff()
  305. {
  306.     if (stuffbuff.bh_first.b_next != NULL)
  307.     {
  308. stuffbuff.bh_curr = &(stuffbuff.bh_first);
  309. stuffbuff.bh_space = 0;
  310.     }
  311. }
  312. /*
  313.  * check if the stuff buffer is empty
  314.  */
  315.     int
  316. stuff_empty()
  317. {
  318.     return (stuffbuff.bh_first.b_next == NULL);
  319. }
  320. /*
  321.  * Remove the contents of the stuff buffer and the mapped characters in the
  322.  * typeahead buffer (used in case of an error). If 'typeahead' is true,
  323.  * flush all typeahead characters (used when interrupted by a CTRL-C).
  324.  */
  325.     void
  326. flush_buffers(typeahead)
  327.     int typeahead;
  328. {
  329.     init_typebuf();
  330.     start_stuff();
  331.     while (read_stuff(TRUE) != NUL)
  332. ;
  333.     if (typeahead)     /* remove all typeahead */
  334.     {
  335. /*
  336.  * We have to get all characters, because we may delete the first part
  337.  * of an escape sequence.
  338.  * In an xterm we get one char at a time and we have to get them all.
  339.  */
  340. while (inchar(typebuf, typebuflen - 1, 10L))
  341.     ;
  342. typeoff = MAXMAPLEN;
  343. typelen = 0;
  344.     }
  345.     else     /* remove mapped characters only */
  346.     {
  347. typeoff += typemaplen;
  348. typelen -= typemaplen;
  349.     }
  350.     typemaplen = 0;
  351.     no_abbr_cnt = 0;
  352. }
  353. /*
  354.  * The previous contents of the redo buffer is kept in old_redobuffer.
  355.  * This is used for the CTRL-O <.> command in insert mode.
  356.  */
  357.     void
  358. ResetRedobuff()
  359. {
  360.     if (!block_redo)
  361.     {
  362. free_buff(&old_redobuff);
  363. old_redobuff = redobuff;
  364. redobuff.bh_first.b_next = NULL;
  365.     }
  366. }
  367. #if defined(AUTOCMD) || defined(WANT_EVAL) || defined(PROTO)
  368. /*
  369.  * Save redobuff and old_redobuff to save_redobuff and save_old_redobuff.
  370.  * Used before executing autocommands and user functions.
  371.  */
  372. static int save_level = 0;
  373.     void
  374. saveRedobuff()
  375. {
  376.     if (save_level++ == 0)
  377.     {
  378. save_redobuff = redobuff;
  379. redobuff.bh_first.b_next = NULL;
  380. save_old_redobuff = old_redobuff;
  381. old_redobuff.bh_first.b_next = NULL;
  382.     }
  383. }
  384. /*
  385.  * Restore redobuff and old_redobuff from save_redobuff and save_old_redobuff.
  386.  * Used after executing autocommands and user functions.
  387.  */
  388.     void
  389. restoreRedobuff()
  390. {
  391.     if (--save_level == 0)
  392.     {
  393. free_buff(&redobuff);
  394. redobuff = save_redobuff;
  395. free_buff(&old_redobuff);
  396. old_redobuff = save_old_redobuff;
  397.     }
  398. }
  399. #endif
  400.     void
  401. AppendToRedobuff(s)
  402.     char_u    *s;
  403. {
  404.     if (!block_redo)
  405. add_buff(&redobuff, s);
  406. }
  407.     void
  408. AppendCharToRedobuff(c)
  409.     int    c;
  410. {
  411.     if (!block_redo)
  412. add_char_buff(&redobuff, c);
  413. }
  414.     void
  415. AppendNumberToRedobuff(n)
  416.     long     n;
  417. {
  418.     if (!block_redo)
  419. add_num_buff(&redobuff, n);
  420. }
  421.     void
  422. stuffReadbuff(s)
  423.     char_u    *s;
  424. {
  425.     add_buff(&stuffbuff, s);
  426. }
  427.     void
  428. stuffcharReadbuff(c)
  429.     int    c;
  430. {
  431.     add_char_buff(&stuffbuff, c);
  432. }
  433.     void
  434. stuffnumReadbuff(n)
  435.     long    n;
  436. {
  437.     add_num_buff(&stuffbuff, n);
  438. }
  439. /*
  440.  * Read a character from the redo buffer.
  441.  * The redo buffer is left as it is.
  442.  * if init is TRUE, prepare for redo, return FAIL if nothing to redo, OK
  443.  * otherwise
  444.  * if old is TRUE, use old_redobuff instead of redobuff
  445.  */
  446.     static int
  447. read_redo(init, old_redo)
  448.     int init;
  449.     int old_redo;
  450. {
  451.     static struct bufblock  *bp;
  452.     static char_u     *p;
  453.     int     c;
  454.     if (init)
  455.     {
  456. if (old_redo)
  457.     bp = old_redobuff.bh_first.b_next;
  458. else
  459.     bp = redobuff.bh_first.b_next;
  460. if (bp == NULL)
  461.     return FAIL;
  462. p = bp->b_str;
  463. return OK;
  464.     }
  465.     if ((c = *p) != NUL)
  466.     {
  467. if (c == K_SPECIAL)
  468. {
  469.     c = TO_SPECIAL(p[1], p[2]);
  470.     p += 2;
  471. }
  472. if (*++p == NUL && bp->b_next != NULL)
  473. {
  474.     bp = bp->b_next;
  475.     p = bp->b_str;
  476. }
  477.     }
  478.     return c;
  479. }
  480. /*
  481.  * copy the rest of the redo buffer into the stuff buffer (could be done faster)
  482.  * if old_redo is TRUE, use old_redobuff instead of redobuff
  483.  */
  484.     static void
  485. copy_redo(old_redo)
  486.     int     old_redo;
  487. {
  488.     int     c;
  489.     while ((c = read_redo(FALSE, old_redo)) != NUL)
  490. stuffcharReadbuff(c);
  491. }
  492. /*
  493.  * Stuff the redo buffer into the stuffbuff.
  494.  * Insert the redo count into the command.
  495.  * If 'old_redo' is TRUE, the last but one command is repeated
  496.  * instead of the last command (inserting text). This is used for
  497.  * CTRL-O <.> in insert mode
  498.  *
  499.  * return FAIL for failure, OK otherwise
  500.  */
  501.     int
  502. start_redo(count, old_redo)
  503.     long    count;
  504.     int     old_redo;
  505. {
  506.     int     c;
  507.     /* init the pointers; return if nothing to redo */
  508.     if (read_redo(TRUE, old_redo) == FAIL)
  509. return FAIL;
  510.     c = read_redo(FALSE, old_redo);
  511.     /* copy the buffer name, if present */
  512.     if (c == '"')
  513.     {
  514. add_buff(&stuffbuff, (char_u *)""");
  515. c = read_redo(FALSE, old_redo);
  516. /* if a numbered buffer is used, increment the number */
  517. if (c >= '1' && c < '9')
  518.     ++c;
  519. add_char_buff(&stuffbuff, c);
  520. c = read_redo(FALSE, old_redo);
  521.     }
  522.     if (c == 'v')   /* redo Visual */
  523.     {
  524. VIsual = curwin->w_cursor;
  525. VIsual_active = TRUE;
  526. VIsual_reselect = TRUE;
  527. redo_VIsual_busy = TRUE;
  528. c = read_redo(FALSE, old_redo);
  529.     }
  530.     /* try to enter the count (in place of a previous count) */
  531.     if (count)
  532.     {
  533. while (isdigit(c)) /* skip "old" count */
  534.     c = read_redo(FALSE, old_redo);
  535. add_num_buff(&stuffbuff, count);
  536.     }
  537.     /* copy from the redo buffer into the stuff buffer */
  538.     add_char_buff(&stuffbuff, c);
  539.     copy_redo(old_redo);
  540.     return OK;
  541. }
  542. /*
  543.  * Repeat the last insert (R, o, O, a, A, i or I command) by stuffing
  544.  * the redo buffer into the stuffbuff.
  545.  * return FAIL for failure, OK otherwise
  546.  */
  547.     int
  548. start_redo_ins()
  549. {
  550.     int     c;
  551.     if (read_redo(TRUE, FALSE) == FAIL)
  552. return FAIL;
  553.     start_stuff();
  554. /* skip the count and the command character */
  555.     while ((c = read_redo(FALSE, FALSE)) != NUL)
  556.     {
  557. if (vim_strchr((char_u *)"AaIiRrOo", c) != NULL)
  558. {
  559.     if (c == 'O' || c == 'o')
  560. stuffReadbuff(NL_STR);
  561.     break;
  562. }
  563.     }
  564. /* copy the typed text from the redo buffer into the stuff buffer */
  565.     copy_redo(FALSE);
  566.     block_redo = TRUE;
  567.     return OK;
  568. }
  569.     void
  570. set_redo_ins()
  571. {
  572.     block_redo = TRUE;
  573. }
  574.     void
  575. stop_redo_ins()
  576. {
  577.     block_redo = FALSE;
  578. }
  579. /*
  580.  * Initialize typebuf to point to typebuf_init.
  581.  * Alloc() cannot be used here: In out-of-memory situations it would
  582.  * be impossible to type anything.
  583.  */
  584.     static void
  585. init_typebuf()
  586. {
  587.     if (typebuf == NULL)
  588.     {
  589. typebuf = typebuf_init;
  590. noremapbuf = noremapbuf_init;
  591. typebuflen = TYPELEN_INIT;
  592. typelen = 0;
  593. typeoff = 0;
  594.     }
  595. }
  596. /*
  597.  * insert a string in position 'offset' in the typeahead buffer (for "@r"
  598.  * and ":normal" command, vgetorpeek() and check_termcode())
  599.  *
  600.  * If noremap is 0, new string can be mapped again.
  601.  * If noremap is -1, new string cannot be mapped again.
  602.  * If noremap is >0, that many characters of the new string cannot be mapped.
  603.  *
  604.  * If nottyped is TRUE, the string does not return KeyTyped (don't use when
  605.  * offset is non-zero!).
  606.  *
  607.  * return FAIL for failure, OK otherwise
  608.  */
  609.     int
  610. ins_typebuf(str, noremap, offset, nottyped)
  611.     char_u  *str;
  612.     int     noremap;
  613.     int     offset;
  614.     int     nottyped;
  615. {
  616.     char_u  *s1, *s2;
  617.     int     newlen;
  618.     int     addlen;
  619.     int     i;
  620.     int     newoff;
  621.     init_typebuf();
  622.     addlen = STRLEN(str);
  623.     /*
  624.      * Easy case: there is room in front of typebuf[typeoff]
  625.      */
  626.     if (offset == 0 && addlen <= typeoff)
  627.     {
  628. typeoff -= addlen;
  629. mch_memmove(typebuf + typeoff, str, (size_t)addlen);
  630.     }
  631.     /*
  632.      * Need to allocate new buffer.
  633.      * In typebuf there must always be room for 3 * MAXMAPLEN + 4 characters.
  634.      * We add some extra room to avoid having to allocate too often.
  635.      */
  636.     else
  637.     {
  638. newoff = MAXMAPLEN + 4;
  639. newlen = typelen + addlen + newoff + 4 * (MAXMAPLEN + 4);
  640. if (newlen < 0)     /* string is getting too long */
  641. {
  642.     emsg(e_toocompl);     /* also calls flush_buffers */
  643.     setcursor();
  644.     return FAIL;
  645. }
  646. s1 = alloc(newlen);
  647. if (s1 == NULL)     /* out of memory */
  648.     return FAIL;
  649. s2 = alloc(newlen);
  650. if (s2 == NULL)     /* out of memory */
  651. {
  652.     vim_free(s1);
  653.     return FAIL;
  654. }
  655. typebuflen = newlen;
  656. /* copy the old chars, before the insertion point */
  657. mch_memmove(s1 + newoff, typebuf + typeoff, (size_t)offset);
  658. /* copy the new chars */
  659. mch_memmove(s1 + newoff + offset, str, (size_t)addlen);
  660. /* copy the old chars, after the insertion point, including the NUL at
  661.  * the end */
  662. mch_memmove(s1 + newoff + offset + addlen, typebuf + typeoff + offset,
  663.       (size_t)(typelen - offset + 1));
  664. if (typebuf != typebuf_init)
  665.     vim_free(typebuf);
  666. typebuf = s1;
  667. mch_memmove(s2 + newoff, noremapbuf + typeoff, (size_t)offset);
  668. mch_memmove(s2 + newoff + offset + addlen,
  669.    noremapbuf + typeoff + offset, (size_t)(typelen - offset));
  670. if (noremapbuf != noremapbuf_init)
  671.     vim_free(noremapbuf);
  672. noremapbuf = s2;
  673. typeoff = newoff;
  674.     }
  675.     typelen += addlen;
  676.     /*
  677.      * Adjust noremapbuf[] for the new characters:
  678.      * If noremap  < 0: all the new characters are flagged not remappable
  679.      * If noremap == 0: all the new characters are flagged mappable
  680.      * If noremap  > 0: 'noremap' characters are flagged not remappable, the
  681.      * rest mappable
  682.      */
  683.     if (noremap < 0)     /* length not specified */
  684. noremap = addlen;
  685.     for (i = 0; i < addlen; ++i)
  686. noremapbuf[typeoff + i + offset] = (noremap-- > 0);
  687.     /* this is only correct for offset == 0! */
  688.     if (nottyped) /* the inserted string is not typed */
  689. typemaplen += addlen;
  690.     if (no_abbr_cnt && offset == 0) /* and not used for abbreviations */
  691. no_abbr_cnt += addlen;
  692.     return OK;
  693. }
  694. /*
  695.  * Return TRUE if there are no characters in the typeahead buffer that have
  696.  * not been typed (result from a mapping or come from ":normal").
  697.  */
  698.     int
  699. typebuf_typed()
  700. {
  701.     return typemaplen == 0;
  702. }
  703. /*
  704.  * Return the number of characters that are mapped (or not typed).
  705.  */
  706.     int
  707. typebuf_maplen()
  708. {
  709.     return typemaplen;
  710. }
  711. /*
  712.  * remove "len" characters from typebuf[typeoff + offset]
  713.  */
  714.     void
  715. del_typebuf(len, offset)
  716.     int len;
  717.     int offset;
  718. {
  719.     int     i;
  720.     typelen -= len;
  721.     /*
  722.      * Easy case: Just increase typeoff.
  723.      */
  724.     if (offset == 0 && typebuflen - (typeoff + len) >= 3 * MAXMAPLEN + 3)
  725. typeoff += len;
  726.     /*
  727.      * Have to move the characters in typebuf[] and noremapbuf[]
  728.      */
  729.     else
  730.     {
  731. i = typeoff + offset;
  732. /*
  733.  * Leave some extra room at the end to avoid reallocation.
  734.  */
  735. if (typeoff > MAXMAPLEN)
  736. {
  737.     mch_memmove(typebuf + MAXMAPLEN, typebuf + typeoff, (size_t)offset);
  738.     mch_memmove(noremapbuf + MAXMAPLEN, noremapbuf + typeoff,
  739.       (size_t)offset);
  740.     typeoff = MAXMAPLEN;
  741. }
  742. /* adjust typebuf (include the NUL at the end) */
  743. mch_memmove(typebuf + typeoff + offset, typebuf + i + len,
  744.       (size_t)(typelen - offset + 1));
  745. /* adjust noremapbuf[] */
  746. mch_memmove(noremapbuf + typeoff + offset, noremapbuf + i + len,
  747.   (size_t)(typelen - offset));
  748.     }
  749.     if (typemaplen > offset) /* adjust typemaplen */
  750.     {
  751. if (typemaplen < offset + len)
  752.     typemaplen = offset;
  753. else
  754.     typemaplen -= len;
  755.     }
  756.     if (no_abbr_cnt > offset) /* adjust no_abbr_cnt */
  757.     {
  758. if (no_abbr_cnt < offset + len)
  759.     no_abbr_cnt = offset;
  760. else
  761.     no_abbr_cnt -= len;
  762.     }
  763. }
  764. /*
  765.  * Write typed characters to script file.
  766.  * If recording is on put the character in the recordbuffer.
  767.  */
  768.     static void
  769. gotchars(s, len)
  770.     char_u  *s;
  771.     int     len;
  772. {
  773.     int     c;
  774.     char_u  buf[2];
  775.     /* remember how many chars were last recorded */
  776.     if (Recording)
  777. last_recorded_len += len;
  778.     buf[1] = NUL;
  779.     while (len--)
  780.     {
  781. c = *s++;
  782. updatescript(c);
  783. if (Recording)
  784. {
  785.     buf[0] = c;
  786.     add_buff(&recordbuff, buf);
  787. }
  788.     }
  789.     may_sync_undo();
  790. }
  791. /*
  792.  * Sync undo.  Called when typed characters are obtained from the typeahead
  793.  * buffer, or when a menu is used.
  794.  * Do not sync:
  795.  * - In Insert mode, unless cursor key has been used.
  796.  * - While reading a script file.
  797.  * - When no_u_sync is non-zero.
  798.  */
  799.     static void
  800. may_sync_undo()
  801. {
  802.     if ((!(State & (INSERT + CMDLINE)) || arrow_used) &&
  803.     scriptin[curscript] == NULL && !no_u_sync)
  804. u_sync();
  805. }
  806. /*
  807.  * When doing ":so! file", the current typeahead needs to be saved, and
  808.  * restored when "file" has been read completely.
  809.  */
  810. static char_u *(sv_typebuf[NSCRIPT]);
  811. static char_u *(sv_noremapbuf[NSCRIPT]);
  812. static int sv_typebuflen[NSCRIPT];
  813. static int sv_typeoff[NSCRIPT];
  814. static int sv_typelen[NSCRIPT];
  815. static int sv_typemaplen[NSCRIPT];
  816. static int sv_no_abbr_cnt[NSCRIPT];
  817.     int
  818. save_typebuf()
  819. {
  820.     init_typebuf();
  821.     sv_typebuf[curscript] = typebuf;
  822.     sv_noremapbuf[curscript] = noremapbuf;
  823.     sv_typebuflen[curscript] = typebuflen;
  824.     sv_typeoff[curscript] = typeoff;
  825.     sv_typelen[curscript] = typelen;
  826.     sv_typemaplen[curscript] = typemaplen;
  827.     sv_no_abbr_cnt[curscript] = no_abbr_cnt;
  828.     typebuf = alloc(TYPELEN_INIT);
  829.     noremapbuf = alloc(TYPELEN_INIT);
  830.     typebuflen = TYPELEN_INIT;
  831.     typeoff = 0;
  832.     typelen = 0;
  833.     typemaplen = 0;
  834.     no_abbr_cnt = 0;
  835.     /* If out of memory: restore typebuf and close file. */
  836.     if (typebuf == NULL || noremapbuf == NULL)
  837.     {
  838. closescript();
  839. return FAIL;
  840.     }
  841.     return OK;
  842. }
  843. /*
  844.  * open new script file for ":so!" command
  845.  * return OK on success, FAIL on error
  846.  */
  847.     int
  848. openscript(name)
  849.     char_u *name;
  850. {
  851.     int oldcurscript;
  852.     if (curscript + 1 == NSCRIPT)
  853.     {
  854. emsg(e_nesting);
  855. return FAIL;
  856.     }
  857.     if (scriptin[curscript] != NULL)    /* already reading script */
  858. ++curscript;
  859. /* use NameBuff for expanded name */
  860.     expand_env(name, NameBuff, MAXPATHL);
  861.     if ((scriptin[curscript] = fopen((char *)NameBuff, READBIN)) == NULL)
  862.     {
  863. emsg2(e_notopen, name);
  864. if (curscript)
  865.     --curscript;
  866. return FAIL;
  867.     }
  868.     if (save_typebuf() == FAIL)
  869. return FAIL;
  870.     /*
  871.      * With command ":g/pat/so! file" we have to execute the
  872.      * commands from the file now.
  873.      */
  874.     if (global_busy)
  875.     {
  876. OPARG oa;
  877. clear_oparg(&oa);
  878. State = NORMAL;
  879. oldcurscript = curscript;
  880. do
  881. {
  882.     adjust_cursor();    /* put cursor on an existing line */
  883.     normal_cmd(&oa, FALSE);
  884.     vpeekc();     /* check for end of file */
  885. }
  886. while (scriptin[oldcurscript] != NULL);
  887. State = CMDLINE;
  888.     }
  889.     return OK;
  890. }
  891. /*
  892.  * Close the currently active input script.
  893.  */
  894.     static void
  895. closescript()
  896. {
  897.     vim_free(typebuf);
  898.     vim_free(noremapbuf);
  899.     typebuf = sv_typebuf[curscript];
  900.     noremapbuf = sv_noremapbuf[curscript];
  901.     typebuflen = sv_typebuflen[curscript];
  902.     typelen = sv_typelen[curscript];
  903.     typeoff = sv_typeoff[curscript];
  904.     typemaplen = sv_typemaplen[curscript];
  905.     no_abbr_cnt = sv_no_abbr_cnt[curscript];
  906.     fclose(scriptin[curscript]);
  907.     scriptin[curscript] = NULL;
  908.     if (curscript)
  909. --curscript;
  910. }
  911. /*
  912.  * updatescipt() is called when a character can be written into the script file
  913.  * or when we have waited some time for a character (c == 0)
  914.  *
  915.  * All the changed memfiles are synced if c == 0 or when the number of typed
  916.  * characters reaches 'updatecount' and 'updatecount' is non-zero.
  917.  */
  918.     void
  919. updatescript(c)
  920.     int c;
  921. {
  922.     static int     count = 0;
  923.     if (c && scriptout)
  924. putc(c, scriptout);
  925.     if (c == 0 || (p_uc > 0 && ++count >= p_uc))
  926.     {
  927. ml_sync_all(c == 0, TRUE);
  928. count = 0;
  929.     }
  930. }
  931. #define K_NEEDMORET -1 /* keylen value for incomplete key-code */
  932. #define M_NEEDMORET -2 /* keylen value for incomplete mapping */
  933. static int old_char = -1; /* ungotten character */
  934.     int
  935. vgetc()
  936. {
  937.     int     c, c2;
  938.     mod_mask = 0x0;
  939.     last_recorded_len = 0;
  940.     for (;;) /* this is done twice if there are modifiers */
  941.     {
  942. if (mod_mask) /* no mapping after modifier has been read */
  943. {
  944.     ++no_mapping;
  945.     ++allow_keys;
  946. }
  947. c = vgetorpeek(TRUE);
  948. if (mod_mask)
  949. {
  950.     --no_mapping;
  951.     --allow_keys;
  952. }
  953. /* Get two extra bytes for special keys */
  954. if (c == K_SPECIAL)
  955. {
  956.     ++no_mapping;
  957.     c2 = vgetorpeek(TRUE); /* no mapping for these chars */
  958.     c = vgetorpeek(TRUE);
  959.     --no_mapping;
  960.     if (c2 == KS_MODIFIER)
  961.     {
  962. mod_mask = c;
  963. continue;
  964.     }
  965.     c = TO_SPECIAL(c2, c);
  966. #ifdef USE_GUI_WIN32
  967.     /* Handle K_TEAROFF here, the caller of vgetc() doesn't need to
  968.      * know that a menu was torn off */
  969.     if (c == K_TEAROFF)
  970.     {
  971. char_u name[200];
  972. int i;
  973. /* get menu path, it ends with a <CR> */
  974. for (i = 0; (c = vgetorpeek(TRUE)) != 'r'; )
  975. {
  976.     name[i] = c;
  977.     if (i < 199)
  978. ++i;
  979. }
  980. name[i] = NUL;
  981. gui_make_tearoff(name);
  982. continue;
  983.     }
  984. #endif
  985. }
  986. #ifdef MSDOS
  987. /*
  988.  * If K_NUL was typed, it is replaced by K_NUL, 3 in mch_inchar().
  989.  * Delete the 3 here.
  990.  */
  991. else if (c == K_NUL && vpeekc() == 3)
  992.     (void)vgetorpeek(TRUE);
  993. #endif
  994. return c;
  995.     }
  996. }
  997.     int
  998. vpeekc()
  999. {
  1000.     return (vgetorpeek(FALSE));
  1001. }
  1002. /*
  1003.  * Call vpeekc() without causing anything to be mapped.
  1004.  * Return TRUE if a character is available, FALSE otherwise.
  1005.  */
  1006.     int
  1007. char_avail()
  1008. {
  1009.     int     retval;
  1010.     ++no_mapping;
  1011.     retval = vgetorpeek(FALSE);
  1012.     --no_mapping;
  1013.     return (retval != NUL);
  1014. }
  1015.     void
  1016. vungetc(c) /* unget one character (can only be done once!) */
  1017.     int     c;
  1018. {
  1019.     old_char = c;
  1020. }
  1021. /*
  1022.  * get a character: 1. from a previously ungotten character
  1023.  *     2. from the stuffbuffer
  1024.  *     3. from the typeahead buffer
  1025.  *     4. from the user
  1026.  *
  1027.  * if "advance" is TRUE (vgetc()):
  1028.  * really get the character.
  1029.  * KeyTyped is set to TRUE in the case the user typed the key.
  1030.  * KeyStuffed is TRUE if the character comes from the stuff buffer.
  1031.  * if "advance" is FALSE (vpeekc()):
  1032.  * just look whether there is a character available.
  1033.  */
  1034.     static int
  1035. vgetorpeek(advance)
  1036.     int     advance;
  1037. {
  1038.     int     c, c1;
  1039.     int     keylen = 0;     /* init for gcc */
  1040.     char_u     *s;
  1041.     struct mapblock *mp;
  1042.     int     timedout = FALSE;     /* waited for more than 1 second
  1043. for mapping to complete */
  1044.     int     mapdepth = 0;     /* check for recursive mapping */
  1045.     int     mode_deleted = FALSE;   /* set when mode has been deleted */
  1046.     int     local_State;
  1047.     int     mlen;
  1048.     int     max_mlen;
  1049. #ifdef SHOWCMD
  1050.     int     i;
  1051.     int     new_wcol, new_wrow;
  1052. #endif
  1053. #ifdef USE_GUI
  1054.     int     idx;
  1055.     int     shape_changed = FALSE;  /* adjusted cursor shape */
  1056. #endif
  1057.     int     n;
  1058. #ifdef HAVE_LANGMAP
  1059.     int     c2;
  1060. #endif
  1061.     int     old_wcol, old_wrow;
  1062.     /*
  1063.      * This function doesn't work very well when called recursively.  This may
  1064.      * happen though, because of:
  1065.      * 1. The call to add_to_showcmd(). char_avail() is then used to check if
  1066.      * there is a character available, which calls this function.  In that
  1067.      * case we must return NUL, to indicate no character is available.
  1068.      * 2. A GUI callback function writes to the screen, causing a
  1069.      * wait_return().
  1070.      */
  1071.     if (vgetc_busy)
  1072. return NUL;
  1073.     local_State = get_real_state();
  1074. /*
  1075.  * get a character: 1. from a previously ungotten character
  1076.  */
  1077.     if (old_char >= 0)
  1078.     {
  1079. c = old_char;
  1080. if (advance)
  1081.     old_char = -1;
  1082. return c;
  1083.     }
  1084.     vgetc_busy = TRUE;
  1085.     if (advance)
  1086. KeyStuffed = FALSE;
  1087.     init_typebuf();
  1088.     start_stuff();
  1089.     if (advance && typemaplen == 0)
  1090. Exec_reg = FALSE;
  1091.     do
  1092.     {
  1093. /*
  1094.  * get a character: 2. from the stuffbuffer
  1095.  */
  1096. c = read_stuff(advance);
  1097. if (c != NUL && !got_int)
  1098. {
  1099.     if (advance)
  1100.     {
  1101. KeyTyped = FALSE;
  1102. KeyStuffed = TRUE;
  1103.     }
  1104.     if (no_abbr_cnt == 0)
  1105. no_abbr_cnt = 1; /* no abbreviations now */
  1106. }
  1107. else
  1108. {
  1109.     /*
  1110.      * Loop until we either find a matching mapped key, or we
  1111.      * are sure that it is not a mapped key.
  1112.      * If a mapped key sequence is found we go back to the start to
  1113.      * try re-mapping.
  1114.      */
  1115.     for (;;)
  1116.     {
  1117. /*
  1118.  * ui_breakcheck() is slow, don't use it too often when
  1119.  * inside a mapping.  But call it each time for typed
  1120.  * characters.
  1121.  */
  1122. if (typemaplen)
  1123.     line_breakcheck();
  1124. else
  1125.     ui_breakcheck(); /* check for CTRL-C */
  1126. if (got_int)
  1127. {
  1128.     /* flush all input */
  1129.     c = inchar(typebuf, typebuflen - 1, 0L);
  1130.     /*
  1131.      * If inchar returns TRUE (script file was active) or we
  1132.      * are inside a mapping, get out of insert mode.
  1133.      * Otherwise we behave like having gotten a CTRL-C.
  1134.      * As a result typing CTRL-C in insert mode will
  1135.      * really insert a CTRL-C.
  1136.      */
  1137.     if ((c || typemaplen) && (State & (INSERT + CMDLINE)))
  1138. c = ESC;
  1139.     else
  1140. c = Ctrl('C');
  1141.     flush_buffers(TRUE); /* flush all typeahead */
  1142.     break;
  1143. }
  1144. else if (typelen > 0) /* check for a mappable key sequence */
  1145. {
  1146.     /*
  1147.      * walk through one maphash[] list until we find an
  1148.      * entry that matches.
  1149.      *
  1150.      * Don't look for mappings if:
  1151.      * - timed out
  1152.      * - no_mapping set: mapping disabled (e.g. for CTRL-V)
  1153.      * - maphash_valid not set: no mappings present.
  1154.      * - typebuf[typeoff] should not be remapped
  1155.      * - in insert or cmdline mode and 'paste' option set
  1156.      * - waiting for "hit return to continue" and CR or SPACE
  1157.      *  typed
  1158.      * - waiting for a char with --more--
  1159.      * - in Ctrl-X mode, and we get a valid char for that mode
  1160.      */
  1161.     mp = NULL;
  1162.     max_mlen = 0;
  1163.     if (!timedout && no_mapping == 0 && maphash_valid
  1164.     && (typemaplen == 0 ||
  1165.     (p_remap && noremapbuf[typeoff] == FALSE))
  1166.     && !(p_paste && (State & (INSERT + CMDLINE)))
  1167.     && !(State == HITRETURN && (typebuf[typeoff] == CR
  1168.   || typebuf[typeoff] == ' '))
  1169.     && State != ASKMORE
  1170.     && State != CONFIRM
  1171. #ifdef INSERT_EXPAND
  1172.     && !(ctrl_x_mode
  1173.        && vim_is_ctrl_x_key(typebuf[typeoff]))
  1174. #endif
  1175.     )
  1176.     {
  1177. c1 = typebuf[typeoff];
  1178. #ifdef HAVE_LANGMAP
  1179. LANGMAP_ADJUST(c1, TRUE);
  1180. #endif
  1181. for (mp = maphash[MAP_HASH(local_State, c1)];
  1182.   mp != NULL; mp = mp->m_next)
  1183. {
  1184.     /*
  1185.      * Only consider an entry if the first character
  1186.      * matches and it is for the current state.
  1187.      */
  1188.     if (mp->m_keys[0] == c1 &&
  1189.    (mp->m_mode & local_State))
  1190.     {
  1191. /* find the match length of this mapping */
  1192. for (mlen = 1; mlen < typelen; ++mlen)
  1193. {
  1194. #ifdef HAVE_LANGMAP
  1195.     c2 = typebuf[typeoff + mlen];
  1196.     LANGMAP_ADJUST(c2, TRUE);
  1197.     if (mp->m_keys[mlen] != c2)
  1198. #else
  1199.     if (mp->m_keys[mlen] !=
  1200.     typebuf[typeoff + mlen])
  1201. #endif
  1202. break;
  1203. }
  1204. /*
  1205.  * Check an entry whether it matches.
  1206.  * - Full match: mlen == keylen
  1207.  * - Partly match: mlen == typelen
  1208.  */
  1209. keylen = mp->m_keylen;
  1210. if (mlen == keylen ||
  1211. (mlen == typelen && typelen < keylen))
  1212. {
  1213.     /*
  1214.      * If one of the typed keys cannot be
  1215.      * remapped, skip the entry.
  1216.      */
  1217.     s = noremapbuf + typeoff;
  1218.     for (n = mlen; --n >= 0; )
  1219. if (*s++)
  1220.     break;
  1221.     if (n >= 0)
  1222. continue;
  1223.     /*
  1224.      * Need more chars for partly match.
  1225.      */
  1226.     if (keylen > typelen)
  1227. keylen = M_NEEDMORET;
  1228.     break;
  1229. }
  1230. /*
  1231.  * no match, may have to check for termcode at
  1232.  * next character
  1233.  */
  1234. if (max_mlen < mlen)
  1235.     max_mlen = mlen;
  1236.     }
  1237. }
  1238.     }
  1239.     if (mp == NULL)     /* no matching mapping found */
  1240.     {
  1241. /*
  1242.  * Check if we have a terminal code, when:
  1243.  *  mapping is allowed,
  1244.  *  keys have not been mapped,
  1245.  *  and not an ESC sequence, not in insert mode or
  1246.  * p_ek is on,
  1247.  *  and when not timed out,
  1248.  */
  1249. if ((no_mapping == 0 || allow_keys != 0) &&
  1250. (typemaplen == 0 ||
  1251.  (p_remap && !noremapbuf[typeoff])) &&
  1252. !timedout)
  1253. {
  1254.     keylen = check_termcode(max_mlen + 1);
  1255.     /*
  1256.      * When getting a partial match, but the last
  1257.      * characters were not typed, don't wait for a
  1258.      * typed character to complete the termcode.
  1259.      * This helps a lot when a ":normal" command ends
  1260.      * in an ESC.
  1261.      */
  1262.     if (keylen < 0 && typelen == typemaplen)
  1263. keylen = 0;
  1264. }
  1265. else
  1266.     keylen = 0;
  1267. if (keylen == 0) /* no matching terminal code */
  1268. {
  1269. #ifdef AMIGA /* check for window bounds report */
  1270.     if (typemaplen == 0 &&
  1271.     (typebuf[typeoff] & 0xff) == CSI)
  1272.     {
  1273. for (s = typebuf + typeoff + 1;
  1274. s < typebuf + typeoff + typelen &&
  1275. (isdigit(*s) || *s == ';' || *s == ' ');
  1276. ++s)
  1277.     ;
  1278. if (*s == 'r' || *s == '|') /* found one */
  1279. {
  1280.     del_typebuf((int)(s + 1 -
  1281.        (typebuf + typeoff)), 0);
  1282. /* get size and redraw screen */
  1283.     set_winsize(0, 0, FALSE);
  1284.     continue;
  1285. }
  1286. if (*s == NUL)     /* need more characters */
  1287.     keylen = K_NEEDMORET;
  1288.     }
  1289.     if (keylen >= 0)
  1290. #endif
  1291.     {
  1292. /*
  1293.  * get a character: 3. from the typeahead buffer
  1294.  */
  1295. c = typebuf[typeoff] & 255;
  1296. if (advance) /* remove chars from typebuf */
  1297. {
  1298.     if (typemaplen)
  1299. KeyTyped = FALSE;
  1300.     else
  1301.     {
  1302. KeyTyped = TRUE;
  1303. ++maptick;
  1304. /* write char to script file(s) */
  1305. gotchars(typebuf + typeoff, 1);
  1306.     }
  1307.     del_typebuf(1, 0);
  1308. }
  1309. break;     /* got character, break for loop */
  1310.     }
  1311. }
  1312. if (keylen > 0)     /* full matching terminal code */
  1313. {
  1314. #ifdef USE_GUI
  1315.     if (typebuf[typeoff] == K_SPECIAL &&
  1316.       typebuf[typeoff + 1] == KS_MENU)
  1317.     {
  1318. /*
  1319.  * Using a menu may cause a break in undo!
  1320.  * It's like using gotchars(), but without
  1321.  * recording or writing to a script file.
  1322.  */
  1323. may_sync_undo();
  1324. del_typebuf(3, 0);
  1325. idx = gui_get_menu_index(current_menu,
  1326.  local_State);
  1327. if (idx != MENU_INDEX_INVALID)
  1328. {
  1329.     /*
  1330.      * In Select mode, a Visual mode menu is
  1331.      * used.  Switch to Visual mode
  1332.      * temporarily.  Append K_SELECT to switch
  1333.      * back to Select mode.
  1334.      */
  1335.     if (VIsual_active && VIsual_select)
  1336.     {
  1337. VIsual_select = FALSE;
  1338. (void)ins_typebuf(K_SELECT_STRING, -1,
  1339.   0, TRUE);
  1340.     }
  1341.     ins_typebuf(current_menu->strings[idx],
  1342. current_menu->noremap[idx] ? -1 : 0,
  1343. 0, TRUE);
  1344. }
  1345.     }
  1346. #endif /* USE_GUI */
  1347.     continue; /* try mapping again */
  1348. }
  1349. /* partial match: get some more characters */
  1350. keylen = K_NEEDMORET;
  1351.     }
  1352.     /* complete match */
  1353.     if (keylen >= 0 && keylen <= typelen)
  1354.     {
  1355. /* write chars to script file(s) */
  1356. if (keylen > typemaplen)
  1357.     gotchars(typebuf + typeoff + typemaplen,
  1358. keylen - typemaplen);
  1359. del_typebuf(keylen, 0); /* remove the mapped keys */
  1360. /*
  1361.  * Put the replacement string in front of mapstr.
  1362.  * The depth check catches ":map x y" and ":map y x".
  1363.  */
  1364. if (++mapdepth >= p_mmd)
  1365. {
  1366.     EMSG("recursive mapping");
  1367.     if (State == CMDLINE)
  1368. redrawcmdline();
  1369.     else
  1370. setcursor();
  1371.     flush_buffers(FALSE);
  1372.     mapdepth = 0; /* for next one */
  1373.     c = -1;
  1374.     break;
  1375. }
  1376. /*
  1377.  * In Select mode, a Visual mode mapping is used.
  1378.  * Switch to Visual mode temporarily.  Append K_SELECT
  1379.  * to switch back to Select mode.
  1380.  */
  1381. if (VIsual_active && VIsual_select)
  1382. {
  1383.     VIsual_select = FALSE;
  1384.     (void)ins_typebuf(K_SELECT_STRING, -1, 0, TRUE);
  1385. }
  1386. /*
  1387.  * Insert the 'to' part in the typebuf.
  1388.  * If 'from' field is the same as the start of the
  1389.  * 'to' field, don't remap the first character.
  1390.  * If m_noremap is set, don't remap the whole 'to'
  1391.  * part.
  1392.  */
  1393. if (ins_typebuf(mp->m_str,
  1394. mp->m_noremap ? -1
  1395.       : STRNCMP(mp->m_str, mp->m_keys,
  1396.       (size_t)keylen) ? 0 : 1,
  1397. 0, TRUE) == FAIL)
  1398. {
  1399.     c = -1;
  1400.     break;
  1401. }
  1402. continue;
  1403.     }
  1404. }
  1405. /*
  1406.  * special case: if we get an <ESC> in insert mode and there
  1407.  * are no more characters at once, we pretend to go out of
  1408.  * insert mode.  This prevents the one second delay after
  1409.  * typing an <ESC>.  If we get something after all, we may
  1410.  * have to redisplay the mode. That the cursor is in the wrong
  1411.  * place does not matter.
  1412.  */
  1413. c = 0;
  1414. #ifdef SHOWCMD
  1415. new_wcol = curwin->w_wcol;
  1416. new_wrow = curwin->w_wrow;
  1417. #endif
  1418. if (    advance
  1419. && typelen == 1
  1420. && typebuf[typeoff] == ESC
  1421. && !no_mapping
  1422. && typemaplen == 0
  1423. && (State & INSERT)
  1424. && (p_timeout || (keylen == K_NEEDMORET && p_ttimeout))
  1425. && (c = inchar(typebuf + typeoff + typelen, 3, 25L))
  1426.  == 0)
  1427. {
  1428.     colnr_t col, vcol;
  1429.     char_u *ptr;
  1430.     if (p_smd)
  1431.     {
  1432. unshowmode(TRUE);
  1433. mode_deleted = TRUE;
  1434.     }
  1435. #ifdef USE_GUI
  1436.     /* may show different cursor shape */
  1437.     if (gui.in_use)
  1438.     {
  1439. int     save_State;
  1440. save_State = State;
  1441. State = NORMAL;
  1442. gui_update_cursor(TRUE, FALSE);
  1443. State = save_State;
  1444. shape_changed = TRUE;
  1445.     }
  1446. #endif
  1447.     validate_cursor();
  1448.     old_wcol = curwin->w_wcol;
  1449.     old_wrow = curwin->w_wrow;
  1450.     /* move cursor left, if possible */
  1451.     if (curwin->w_cursor.col != 0)
  1452.     {
  1453. if (curwin->w_wcol)
  1454. {
  1455.     if (did_ai)
  1456.     {
  1457. /*
  1458.  * We are expecting to truncate the trailing
  1459.  * white-space, so find the last non-white
  1460.  * character -- webb
  1461.  */
  1462. col = vcol = curwin->w_wcol = 0;
  1463. ptr = ml_get_curline();
  1464. while (col < curwin->w_cursor.col)
  1465. {
  1466.     if (!vim_iswhite(ptr[col]))
  1467. curwin->w_wcol = vcol;
  1468.     vcol += lbr_chartabsize(ptr + col,
  1469.        (colnr_t)vcol);
  1470.     ++col;
  1471. }
  1472. if (curwin->w_p_nu)
  1473.     curwin->w_wcol += 8;
  1474.     }
  1475.     else
  1476. --curwin->w_wcol;
  1477. }
  1478. else if (curwin->w_p_wrap && curwin->w_wrow)
  1479. {
  1480. --curwin->w_wrow;
  1481. curwin->w_wcol = Columns - 1;
  1482. }
  1483.     }
  1484.     setcursor();
  1485.     out_flush();
  1486. #ifdef SHOWCMD
  1487.     new_wcol = curwin->w_wcol;
  1488.     new_wrow = curwin->w_wrow;
  1489. #endif
  1490.     curwin->w_wcol = old_wcol;
  1491.     curwin->w_wrow = old_wrow;
  1492. }
  1493. if (c < 0)
  1494.     continue; /* end of input script reached */
  1495. typelen += c;
  1496. /* buffer full, don't map */
  1497. if (typelen >= typemaplen + MAXMAPLEN)
  1498. {
  1499.     timedout = TRUE;
  1500.     continue;
  1501. }
  1502. /*
  1503.  * get a character: 4. from the user
  1504.  */
  1505. #ifdef SHOWCMD
  1506. /*
  1507.  * If we have a partial match (and are going to wait for more
  1508.  * input from the user), show the partially matched characters
  1509.  * to the user with showcmd -- webb.
  1510.  */
  1511. i = 0;
  1512. if (typelen > 0 && (State & (NORMAL | INSERT)) &&
  1513.     advance && !exmode_active)
  1514. {
  1515.     /* need to use the col and row from above here */
  1516.     old_wcol = curwin->w_wcol;
  1517.     old_wrow = curwin->w_wrow;
  1518.     curwin->w_wcol = new_wcol;
  1519.     curwin->w_wrow = new_wrow;
  1520.     push_showcmd();
  1521.     if (typelen > SHOWCMD_COLS)
  1522. i = typelen - SHOWCMD_COLS;
  1523.     while (i < typelen)
  1524. (void)add_to_showcmd(typebuf[typeoff + i++]);
  1525.     curwin->w_wcol = old_wcol;
  1526.     curwin->w_wrow = old_wrow;
  1527. }
  1528. #endif
  1529. c = inchar(typebuf + typeoff + typelen,
  1530. typebuflen - typeoff - typelen - 1,
  1531. !advance
  1532.     ? 0
  1533.     : ((typelen == 0 || !(p_timeout || (p_ttimeout &&
  1534. keylen == K_NEEDMORET)))
  1535.     ? -1L
  1536.     : ((keylen == K_NEEDMORET && p_ttm >= 0)
  1537.     ? p_ttm
  1538.     : p_tm)));
  1539. #ifdef SHOWCMD
  1540. if (i)
  1541.     pop_showcmd();
  1542. #endif
  1543. if (c < 0)
  1544.     continue; /* end of input script reached */
  1545. if (c == NUL) /* no character available */
  1546. {
  1547.     if (!advance)
  1548. break;
  1549.     if (typelen) /* timed out */
  1550.     {
  1551. timedout = TRUE;
  1552. continue;
  1553.     }
  1554. }
  1555. else
  1556. {     /* allow mapping for just typed characters */
  1557.     while (typebuf[typeoff + typelen] != NUL)
  1558. noremapbuf[typeoff + typelen++] = FALSE;
  1559. }
  1560.     }     /* for (;;) */
  1561. } /* if (!character from stuffbuf) */
  1562. /* if advance is FALSE don't loop on NULs */
  1563.     } while (c < 0 || (advance && c == NUL));
  1564.     /*
  1565.      * The "INSERT" message is taken care of here:
  1566.      *  if we return an ESC to exit insert mode, the message is deleted
  1567.      *  if we don't return an ESC but deleted the message before, redisplay it
  1568.      */
  1569.     if (advance && p_smd && (State & INSERT))
  1570.     {
  1571. if (c == ESC && !mode_deleted && !no_mapping)
  1572. {
  1573.     if (typelen && !KeyTyped)
  1574. redraw_cmdline = TRUE;     /* delete mode later */
  1575.     else
  1576. unshowmode(FALSE);
  1577. }
  1578. else if (c != ESC && mode_deleted)
  1579. {
  1580.     if (typelen && !KeyTyped)
  1581. redraw_cmdline = TRUE;     /* show mode later */
  1582.     else
  1583. showmode();
  1584. }
  1585.     }
  1586. #ifdef USE_GUI
  1587.     /* may unshow different cursor shape */
  1588.     if (gui.in_use && shape_changed)
  1589. gui_update_cursor(TRUE, FALSE);
  1590. #endif
  1591.     vgetc_busy = FALSE;
  1592.     return c;
  1593. }
  1594. /*
  1595.  * inchar() - get one character from
  1596.  * 1. a scriptfile
  1597.  * 2. the keyboard
  1598.  *
  1599.  *  As much characters as we can get (upto 'maxlen') are put in buf and
  1600.  *  NUL terminated (buffer length must be 'maxlen' + 1).
  1601.  *  Minimum for 'maxlen' is 3!!!!
  1602.  *
  1603.  *  If we got an interrupt all input is read until none is available.
  1604.  *
  1605.  *  If wait_time == 0  there is no waiting for the char.
  1606.  *  If wait_time == n  we wait for n msec for a character to arrive.
  1607.  *  If wait_time == -1 we wait forever for a character to arrive.
  1608.  *
  1609.  *  Return the number of obtained characters.
  1610.  *  Return -1 when end of input script reached.
  1611.  */
  1612.     int
  1613. inchar(buf, maxlen, wait_time)
  1614.     char_u  *buf;
  1615.     int     maxlen;
  1616.     long    wait_time;     /* milli seconds */
  1617. {
  1618.     int len = 0;     /* init for GCC */
  1619.     int retesc = FALSE;     /* return ESC with gotint */
  1620.     int c;
  1621.     int i;
  1622.     if (wait_time == -1L || wait_time > 100L)  /* flush output before waiting */
  1623.     {
  1624. cursor_on();
  1625. out_flush();
  1626.     }
  1627.     /*
  1628.      * Don't reset these when at the hit-return prompt, otherwise a endless
  1629.      * recursive loop may result (write error in swapfile, hit-return, timeout
  1630.      * on char wait, flush swapfile, write error....).
  1631.      */
  1632.     if (State != HITRETURN)
  1633.     {
  1634. did_outofmem_msg = FALSE;   /* display out of memory message (again) */
  1635. did_swapwrite_msg = FALSE;  /* display swap file write error again */
  1636.     }
  1637.     undo_off = FALSE;     /* restart undo now */
  1638.     /*
  1639.      * first try script file
  1640.      * If interrupted: Stop reading script files.
  1641.      */
  1642.     c = -1;
  1643.     while (scriptin[curscript] != NULL && c < 0)
  1644.     {
  1645. if (got_int || (c = getc(scriptin[curscript])) < 0) /* reached EOF */
  1646. {
  1647.     closescript();
  1648.     /*
  1649.      * When reading script file is interrupted, return an ESC to get
  1650.      * back to normal mode.
  1651.      * Otherwise return -1, because typebuf[] has changed.
  1652.      */
  1653.     if (got_int)
  1654. retesc = TRUE;
  1655.     else
  1656. return -1;
  1657. }
  1658. else
  1659. {
  1660.     buf[0] = c;
  1661.     len = 1;
  1662. }
  1663.     }
  1664.     if (c < 0) /* did not get a character from script */
  1665.     {
  1666. /*
  1667.  * If we got an interrupt, skip all previously typed characters and
  1668.  * return TRUE if quit reading script file.
  1669.  */
  1670. if (got_int)
  1671. {
  1672.     while (ui_inchar(buf, maxlen, 0L))
  1673. ;
  1674.     return retesc;
  1675. }
  1676. /*
  1677.  * Always flush the output characters when getting input characters
  1678.  * from the user.
  1679.  */
  1680. out_flush();
  1681. /*
  1682.  * fill up to a third of the buffer, because each character may be
  1683.  * tripled below
  1684.  */
  1685. len = ui_inchar(buf, maxlen / 3, wait_time);
  1686.     }
  1687.     /*
  1688.      * Two characters are special: NUL and K_SPECIAL.
  1689.      * Replace      NUL by K_SPECIAL KS_ZERO  K_FILLER
  1690.      * Replace K_SPECIAL by K_SPECIAL KS_SPECIAL K_FILLER
  1691.      * Don't replace K_SPECIAL when reading a script file.
  1692.      */
  1693.     for (i = len; --i >= 0; ++buf)
  1694.     {
  1695. #ifdef USE_GUI
  1696. /* Any character can come after a CSI, don't escape it. */
  1697. if (buf[0] == CSI && i >= 2)
  1698. {
  1699.     buf += 2;
  1700.     i   -= 2;
  1701.     continue;
  1702. }
  1703. #endif
  1704. if (buf[0] == NUL || (buf[0] == K_SPECIAL && c < 0))
  1705. {
  1706.     mch_memmove(buf + 3, buf + 1, (size_t)i);
  1707.     buf[2] = K_THIRD(buf[0]);
  1708.     buf[1] = K_SECOND(buf[0]);
  1709.     buf[0] = K_SPECIAL;
  1710.     buf += 2;
  1711.     len += 2;
  1712. }
  1713.     }
  1714.     *buf = NUL;     /* add trailing NUL */
  1715.     return len;
  1716. }
  1717. /*
  1718.  * map[!]     : show all key mappings
  1719.  * map[!] {lhs}     : show key mapping for {lhs}
  1720.  * map[!] {lhs} {rhs}     : set key mapping for {lhs} to {rhs}
  1721.  * noremap[!] {lhs} {rhs}   : same, but no remapping for {rhs}
  1722.  * unmap[!] {lhs}     : remove key mapping for {lhs}
  1723.  * abbr     : show all abbreviations
  1724.  * abbr {lhs}     : show abbreviations for {lhs}
  1725.  * abbr {lhs} {rhs}     : set abbreviation for {lhs} to {rhs}
  1726.  * noreabbr {lhs} {rhs}     : same, but no remapping for {rhs}
  1727.  * unabbr {lhs}     : remove abbreviation for {lhs}
  1728.  *
  1729.  * maptype == 1 for unmap command, 2 for noremap command.
  1730.  *
  1731.  * keys is pointer to any arguments. Note: keys cannot be a read-only string,
  1732.  * it will be modified.
  1733.  *
  1734.  * for :map   mode is NORMAL + VISUAL + OP_PENDING
  1735.  * for :map!  mode is INSERT + CMDLINE
  1736.  * for :cmap  mode is CMDLINE
  1737.  * for :imap  mode is INSERT
  1738.  * for :nmap  mode is NORMAL
  1739.  * for :vmap  mode is VISUAL
  1740.  * for :omap  mode is OP_PENDING
  1741.  *
  1742.  * for :abbr  mode is INSERT + CMDLINE
  1743.  * for :iabbr mode is INSERT
  1744.  * for :cabbr mode is CMDLINE
  1745.  *
  1746.  * Return 0 for success
  1747.  *   1 for invalid arguments
  1748.  *   2 for no match
  1749.  *   3 for ambiguety
  1750.  *   4 for out of mem
  1751.  */
  1752.     int
  1753. do_map(maptype, keys, mode, abbrev)
  1754.     int     maptype;
  1755.     char_u  *keys;
  1756.     int     mode;
  1757.     int     abbrev; /* not a mapping but an abbreviation */
  1758. {
  1759.     struct mapblock *mp, **mpp;
  1760.     char_u *arg;
  1761.     char_u *p;
  1762.     int n;
  1763.     int len = 0; /* init for GCC */
  1764.     char_u *newstr;
  1765.     int hasarg;
  1766.     int haskey;
  1767.     int did_it = FALSE;
  1768.     int round;
  1769.     char_u *keys_buf = NULL;
  1770.     char_u *arg_buf = NULL;
  1771.     int retval = 0;
  1772.     int do_backslash;
  1773.     int hash;
  1774.     int new_hash;
  1775.     validate_maphash();
  1776. /*
  1777.  * find end of keys and skip CTRL-Vs (and backslashes) in it
  1778.  * Accept backslash like CTRL-V when 'cpoptions' does not contain 'B'.
  1779.  * with :unmap white space is included in the keys, no argument possible
  1780.  */
  1781.     p = keys;
  1782.     do_backslash = (vim_strchr(p_cpo, CPO_BSLASH) == NULL);
  1783.     while (*p && (maptype == 1 || !vim_iswhite(*p)))
  1784.     {
  1785. if ((p[0] == Ctrl('V') || (do_backslash && p[0] == '\')) &&
  1786.   p[1] != NUL)
  1787.     ++p; /* skip CTRL-V or backslash */
  1788. ++p;
  1789.     }
  1790.     if (*p != NUL)
  1791. *p++ = NUL;
  1792.     p = skipwhite(p);
  1793.     arg = p;
  1794.     hasarg = (*arg != NUL);
  1795.     haskey = (*keys != NUL);
  1796. /* check for :unmap without argument */
  1797.     if (maptype == 1 && !haskey)
  1798.     {
  1799. retval = 1;
  1800. goto theend;
  1801.     }
  1802.     /*
  1803.      * If mapping has been given as ^V<C_UP> say, then replace the term codes
  1804.      * with the appropriate two bytes. If it is a shifted special key, unshift
  1805.      * it too, giving another two bytes.
  1806.      * replace_termcodes() may move the result to allocated memory, which
  1807.      * needs to be freed later (*keys_buf and *arg_buf).
  1808.      * replace_termcodes() also removes CTRL-Vs and sometimes backslashes.
  1809.      */
  1810.     if (haskey)
  1811. keys = replace_termcodes(keys, &keys_buf, TRUE, TRUE);
  1812.     if (hasarg)
  1813.     {
  1814. if (STRICMP(arg, "<nop>") == 0)     /* "<Nop>" means nothing */
  1815.     arg = (char_u *)"";
  1816. else
  1817.     arg = replace_termcodes(arg, &arg_buf, FALSE, TRUE);
  1818.     }
  1819. #ifdef FKMAP
  1820.     /*
  1821.      * when in right-to-left mode and alternate keymap option set,
  1822.      * reverse the character flow in the arg in Farsi.
  1823.      */
  1824.     if (p_altkeymap && curwin->w_p_rl)
  1825. lrswap(arg);
  1826. #endif
  1827.     /*
  1828.      * check arguments and translate function keys
  1829.      */
  1830.     if (haskey)
  1831.     {
  1832. len = STRLEN(keys);
  1833. if (len > MAXMAPLEN) /* maximum length of MAXMAPLEN chars */
  1834. {
  1835.     retval = 1;
  1836.     goto theend;
  1837. }
  1838. if (abbrev && maptype != 1)
  1839. {
  1840.     /*
  1841.      * If an abbreviation ends in a keyword character, the
  1842.      * rest must be all keyword-char or all non-keyword-char.
  1843.      * Otherwise we won't be able to find the start of it in a
  1844.      * vi-compatible way.
  1845.      * An abbrevation cannot contain white space.
  1846.      */
  1847.     if (vim_iswordc(keys[len - 1])) /* ends in keyword char */
  1848. for (n = 0; n < len - 2; ++n)
  1849.     if (vim_iswordc(keys[n]) != vim_iswordc(keys[len - 2]))
  1850.     {
  1851. retval = 1;
  1852. goto theend;
  1853.     }
  1854.     for (n = 0; n < len; ++n)
  1855. if (vim_iswhite(keys[n]))
  1856. {
  1857.     retval = 1;
  1858.     goto theend;
  1859. }
  1860. }
  1861.     }
  1862.     if (haskey && hasarg && abbrev) /* if we will add an abbreviation */
  1863. no_abbr = FALSE; /* reset flag that indicates there are
  1864.     no abbreviations */
  1865.     if (!haskey || (maptype != 1 && !hasarg))
  1866. msg_start();
  1867.     /*
  1868.      * Find an entry in the maphash[] list that matches.
  1869.      * For :unmap we may loop two times: once to try to unmap an entry with a
  1870.      * matching 'from' part, a second time, if the first fails, to unmap an
  1871.      * entry with a matching 'to' part. This was done to allow ":ab foo bar"
  1872.      * to be unmapped by typing ":unab foo", where "foo" will be replaced by
  1873.      * "bar" because of the abbreviation.
  1874.      */
  1875.     for (round = 0; (round == 0 || maptype == 1) && round <= 1 &&
  1876.  !did_it && !got_int; ++round)
  1877.     {
  1878. /* need to loop over all hash lists */
  1879. for (hash = 0; hash < 256 && !got_int; ++hash)
  1880. {
  1881.     if (abbrev)
  1882.     {
  1883. if (hash) /* there is only one abbreviation list */
  1884.     break;
  1885. mpp = &first_abbr;
  1886.     }
  1887.     else
  1888. mpp = &(maphash[hash]);
  1889.     for (mp = *mpp; mp != NULL && !got_int; mp = *mpp)
  1890.     {
  1891. if (!(mp->m_mode & mode))   /* skip entries with wrong mode */
  1892. {
  1893.     mpp = &(mp->m_next);
  1894.     continue;
  1895. }
  1896. if (!haskey)     /* show all entries */
  1897. {
  1898.     showmap(mp);
  1899.     did_it = TRUE;
  1900. }
  1901. else     /* do we have a match? */
  1902. {
  1903.     if (round)     /* second round: Try unmap "rhs" string */
  1904.     {
  1905. n = STRLEN(mp->m_str);
  1906. p = mp->m_str;
  1907.     }
  1908.     else
  1909.     {
  1910. n = mp->m_keylen;
  1911. p = mp->m_keys;
  1912.     }
  1913.     if (!STRNCMP(p, keys, (size_t)(n < len ? n : len)))
  1914.     {
  1915. if (maptype == 1) /* delete entry */
  1916. {
  1917.     if (n != len) /* not a full match */
  1918.     {
  1919. mpp = &(mp->m_next);
  1920. continue;
  1921.     }
  1922.     /*
  1923.      * We reset the indicated mode bits. If nothing is
  1924.      * left the entry is deleted below.
  1925.      */
  1926.     mp->m_mode &= ~mode;
  1927.     did_it = TRUE; /* remember we did something */
  1928. }
  1929. else if (!hasarg) /* show matching entry */
  1930. {
  1931.     showmap(mp);
  1932.     did_it = TRUE;
  1933. }
  1934. else if (n != len) /* new entry is ambigious */
  1935. {
  1936.     if (abbrev) /* for abbrev's that's ok */
  1937.     {
  1938. mpp = &(mp->m_next);
  1939. continue;
  1940.     }
  1941.     retval = 3;
  1942.     goto theend;
  1943. }
  1944. else /* new rhs for existing entry */
  1945. {
  1946.     mp->m_mode &= ~mode; /* remove mode bits */
  1947.     if (mp->m_mode == 0 && !did_it) /* reuse entry */
  1948.     {
  1949. newstr = vim_strsave(arg);
  1950. if (newstr == NULL)
  1951. {
  1952.     retval = 4; /* no mem */
  1953.     goto theend;
  1954. }
  1955. vim_free(mp->m_str);
  1956. mp->m_str = newstr;
  1957. mp->m_noremap = maptype;
  1958. mp->m_mode = mode;
  1959. did_it = TRUE;
  1960.     }
  1961. }
  1962. if (mp->m_mode == 0) /* entry can be deleted */
  1963. {
  1964.     map_free(mpp);
  1965.     continue; /* continue with *mpp */
  1966. }
  1967. /*
  1968.  * May need to put this entry into another hash list.
  1969.  */
  1970. new_hash = MAP_HASH(mp->m_mode, mp->m_keys[0]);
  1971. if (!abbrev && new_hash != hash)
  1972. {
  1973.     *mpp = mp->m_next;
  1974.     mp->m_next = maphash[new_hash];
  1975.     maphash[new_hash] = mp;
  1976.     continue; /* continue with *mpp */
  1977. }
  1978.     }
  1979. }
  1980. mpp = &(mp->m_next);
  1981.     }
  1982. }
  1983.     }
  1984.     if (maptype == 1)     /* delete entry */
  1985.     {
  1986. if (!did_it)
  1987.     retval = 2;     /* no match */
  1988. goto theend;
  1989.     }
  1990.     if (!haskey || !hasarg)     /* print entries */
  1991.     {
  1992. if (!did_it)
  1993. {
  1994.     if (abbrev)
  1995. MSG("No abbreviation found");
  1996.     else
  1997. MSG("No mapping found");
  1998. }
  1999. goto theend;     /* listing finished */
  2000.     }
  2001.     if (did_it) /* have added the new entry already */
  2002. goto theend;
  2003. /*
  2004.  * Get here when we have to add a new entry to the maphash[] list or abbrlist.
  2005.  */
  2006.     mp = (struct mapblock *)alloc((unsigned)sizeof(struct mapblock));
  2007.     if (mp == NULL)
  2008.     {
  2009. retval = 4;     /* no mem */
  2010. goto theend;
  2011.     }
  2012. #ifdef USE_GUI_WIN32
  2013.     /* If CTRL-C has been mapped, don't use it for Interrupting */
  2014.     if (*keys == Ctrl('C'))
  2015. mapped_ctrl_c = TRUE;
  2016. #endif
  2017.     mp->m_keys = vim_strsave(keys);
  2018.     mp->m_str = vim_strsave(arg);
  2019.     if (mp->m_keys == NULL || mp->m_str == NULL)
  2020.     {
  2021. vim_free(mp->m_keys);
  2022. vim_free(mp->m_str);
  2023. vim_free(mp);
  2024. retval = 4; /* no mem */
  2025. goto theend;
  2026.     }
  2027.     mp->m_keylen = STRLEN(mp->m_keys);
  2028.     mp->m_noremap = maptype;
  2029.     mp->m_mode = mode;
  2030.     /* add the new entry in front of the abbrlist or maphash[] list */
  2031.     if (abbrev)
  2032.     {
  2033. mp->m_next = first_abbr;
  2034. first_abbr = mp;
  2035.     }
  2036.     else
  2037.     {
  2038. n = MAP_HASH(mp->m_mode, mp->m_keys[0]);
  2039. mp->m_next = maphash[n];
  2040. maphash[n] = mp;
  2041.     }
  2042. theend:
  2043.     vim_free(keys_buf);
  2044.     vim_free(arg_buf);
  2045.     return retval;
  2046. }
  2047. /*
  2048.  * Delete one entry from the abbrlist or maphash[].
  2049.  * "mpp" is a pointer to the m_next field of the PREVIOUS entry!
  2050.  */
  2051.     static void
  2052. map_free(mpp)
  2053.     struct mapblock **mpp;
  2054. {
  2055.     struct mapblock *mp;
  2056.     mp = *mpp;
  2057.     vim_free(mp->m_keys);
  2058.     vim_free(mp->m_str);
  2059.     *mpp = mp->m_next;
  2060.     vim_free(mp);
  2061. }
  2062. /*
  2063.  * Initialize maphash[] for first use.
  2064.  */
  2065.     static void
  2066. validate_maphash()
  2067. {
  2068.     if (!maphash_valid)
  2069.     {
  2070. vim_memset(maphash, 0, sizeof(maphash));
  2071. maphash_valid = TRUE;
  2072.     }
  2073. }
  2074. /*
  2075.  * Get the mapping mode from the command name.
  2076.  */
  2077.     int
  2078. get_map_mode(cmdp, forceit)
  2079.     char_u **cmdp;
  2080.     int forceit;
  2081. {
  2082.     char_u *p;
  2083.     int modec;
  2084.     int mode;
  2085.     p = *cmdp;
  2086.     modec = *p++;
  2087.     if (modec == 'i')
  2088. mode = INSERT; /* :imap */
  2089.     else if (modec == 'c')
  2090. mode = CMDLINE; /* :cmap */
  2091.     else if (modec == 'n' && *p != 'o')     /* avoid :noremap */
  2092. mode = NORMAL; /* :nmap */
  2093.     else if (modec == 'v')
  2094. mode = VISUAL; /* :vmap */
  2095.     else if (modec == 'o')
  2096. mode = OP_PENDING; /* :omap */
  2097.     else
  2098.     {
  2099. --p;
  2100. if (forceit)
  2101.     mode = INSERT + CMDLINE; /* :map ! */
  2102. else
  2103.     mode = VISUAL + NORMAL + OP_PENDING;/* :map */
  2104.     }
  2105.     *cmdp = p;
  2106.     return mode;
  2107. }
  2108. /*
  2109.  * Clear all mappings or abbreviations.
  2110.  * 'abbr' should be FALSE for mappings, TRUE for abbreviations.
  2111.  */
  2112.     void
  2113. map_clear(cmdp, forceit, abbr)
  2114.     char_u  *cmdp;
  2115.     int     forceit;
  2116.     int     abbr;
  2117. {
  2118.     struct mapblock *mp, **mpp;
  2119.     int     mode;
  2120.     int     hash;
  2121.     int     new_hash;
  2122.     validate_maphash();
  2123.     mode = get_map_mode(&cmdp, forceit);
  2124.     for (hash = 0; hash < 256; ++hash)
  2125.     {
  2126. if (abbr)
  2127. {
  2128.     if (hash)     /* there is only one abbrlist */
  2129. break;
  2130.     mpp = &first_abbr;
  2131. }
  2132. else
  2133.     mpp = &maphash[hash];
  2134. while (*mpp != NULL)
  2135. {
  2136.     mp = *mpp;
  2137.     if (mp->m_mode & mode)
  2138.     {
  2139. mp->m_mode &= ~mode;
  2140. if (mp->m_mode == 0) /* entry can be deleted */
  2141. {
  2142.     map_free(mpp);
  2143.     continue;
  2144. }
  2145. /*
  2146.  * May need to put this entry into another hash list.
  2147.  */
  2148. new_hash = MAP_HASH(mp->m_mode, mp->m_keys[0]);
  2149. if (!abbr && new_hash != hash)
  2150. {
  2151.     *mpp = mp->m_next;
  2152.     mp->m_next = maphash[new_hash];
  2153.     maphash[new_hash] = mp;
  2154.     continue; /* continue with *mpp */
  2155. }
  2156.     }
  2157.     mpp = &(mp->m_next);
  2158. }
  2159.     }
  2160. }
  2161.     static void
  2162. showmap(mp)
  2163.     struct mapblock *mp;
  2164. {
  2165.     int len = 1;
  2166.     if (msg_didout)
  2167. msg_putchar('n');
  2168.     if ((mp->m_mode & (INSERT + CMDLINE)) == INSERT + CMDLINE)
  2169. msg_putchar('!'); /* :map! */
  2170.     else if (mp->m_mode & INSERT)
  2171. msg_putchar('i'); /* :imap */
  2172.     else if (mp->m_mode & CMDLINE)
  2173. msg_putchar('c'); /* :cmap */
  2174.     else if ((mp->m_mode & (NORMAL + VISUAL + OP_PENDING))
  2175.       == NORMAL + VISUAL + OP_PENDING)
  2176. msg_putchar(' '); /* :map */
  2177.     else
  2178.     {
  2179. len = 0;
  2180. if (mp->m_mode & NORMAL)
  2181. {
  2182.     msg_putchar('n'); /* :nmap */
  2183.     ++len;
  2184. }
  2185. if (mp->m_mode & OP_PENDING)
  2186. {
  2187.     msg_putchar('o'); /* :omap */
  2188.     ++len;
  2189. }
  2190. if (mp->m_mode & VISUAL)
  2191. {
  2192.     msg_putchar('v'); /* :vmap */
  2193.     ++len;
  2194. }
  2195.     }
  2196.     while (++len <= 3)
  2197. msg_putchar(' ');
  2198.     /* Get length of what we write */
  2199.     len = msg_outtrans_special(mp->m_keys, TRUE);
  2200.     do
  2201.     {
  2202. msg_putchar(' '); /* padd with blanks */
  2203. ++len;
  2204.     } while (len < 12);
  2205.     if (mp->m_noremap)
  2206. msg_puts_attr((char_u *)"*", hl_attr(HLF_8));
  2207.     else
  2208. msg_putchar(' ');
  2209.     /* Use FALSE below if we only want things like <Up> to show up as such on
  2210.      * the rhs, and not M-x etc, TRUE gets both -- webb
  2211.      */
  2212.     if (*mp->m_str == NUL)
  2213. msg_puts_attr((char_u *)"<Nop>", hl_attr(HLF_8));
  2214.     else
  2215. msg_outtrans_special(mp->m_str, TRUE);
  2216.     out_flush(); /* show one line at a time */
  2217. }
  2218. /*
  2219.  * Check for an abbreviation.
  2220.  * Cursor is at ptr[col]. When inserting, mincol is where insert started.
  2221.  * "c" is the character typed before check_abbr was called.
  2222.  *
  2223.  * Historic vi practice: The last character of an abbreviation must be an id
  2224.  * character ([a-zA-Z0-9_]). The characters in front of it must be all id
  2225.  * characters or all non-id characters. This allows for abbr. "#i" to
  2226.  * "#include".
  2227.  *
  2228.  * Vim addition: Allow for abbreviations that end in a non-keyword character.
  2229.  * Then there must be white space before the abbr.
  2230.  *
  2231.  * return TRUE if there is an abbreviation, FALSE if not
  2232.  */
  2233.     int
  2234. check_abbr(c, ptr, col, mincol)
  2235.     int     c;
  2236.     char_u  *ptr;
  2237.     int     col;
  2238.     int     mincol;
  2239. {
  2240.     int     len;
  2241.     int     j;
  2242.     char_u     tb[4];
  2243.     struct mapblock *mp;
  2244.     int     is_id = TRUE;
  2245.     int     vim_abbr;
  2246.     if (no_abbr_cnt)     /* abbrev. are not recursive */
  2247. return FALSE;
  2248.     /*
  2249.      * Check for word before the cursor: If it ends in a keyword char all
  2250.      * chars before it must be al keyword chars or non-keyword chars, but not
  2251.      * white space. If it ends in a non-keyword char we accept any characters
  2252.      * before it except white space.
  2253.      */
  2254.     if (col == 0) /* cannot be an abbr. */
  2255. return FALSE;
  2256.     if (!vim_iswordc(ptr[col - 1]))
  2257. vim_abbr = TRUE; /* Vim added abbr. */
  2258.     else
  2259.     {
  2260. vim_abbr = FALSE; /* vi compatible abbr. */
  2261. if (col > 1)
  2262.     is_id = vim_iswordc(ptr[col - 2]);
  2263.     }
  2264.     for (len = col - 1; len > 0 && !vim_isspace(ptr[len - 1]) &&
  2265.        (vim_abbr || is_id == vim_iswordc(ptr[len - 1])); --len)
  2266. ;
  2267.     if (len < mincol)
  2268. len = mincol;
  2269.     if (len < col) /* there is a word in front of the cursor */
  2270.     {
  2271. ptr += len;
  2272. len = col - len;
  2273. for (mp = first_abbr; mp; mp = mp->m_next)
  2274. {
  2275.     /* find entries with right mode and keys */
  2276.     if (       (mp->m_mode & State)
  2277.     && mp->m_keylen == len
  2278.     && !STRNCMP(mp->m_keys, ptr, (size_t)len))
  2279. break;
  2280. }
  2281. if (mp)
  2282. {
  2283.     /*
  2284.      * Found a match:
  2285.      * Insert the rest of the abbreviation in typebuf[].
  2286.      * This goes from end to start.
  2287.      *
  2288.      * Characters 0x000 - 0x100: normal chars, may need CTRL-V,
  2289.      * except K_SPECIAL: Becomes K_SPECIAL KS_SPECIAL K_FILLER
  2290.      * Characters where IS_SPECIAL() == TRUE: key codes, need
  2291.      * K_SPECIAL. Other characters (with ABBR_OFF): don't use CTRL-V.
  2292.      *
  2293.      * Character CTRL(']') is treated specially - it completes the
  2294.      * abbreviation, but is not inserted into the input stream.
  2295.      */
  2296.     j = 0;
  2297.     /* special key code, split up */
  2298.     if (c != Ctrl(']'))
  2299.     {
  2300. if (IS_SPECIAL(c) || c == K_SPECIAL)
  2301. {
  2302.     tb[j++] = K_SPECIAL;
  2303.     tb[j++] = K_SECOND(c);
  2304.     c = K_THIRD(c);
  2305. }
  2306. else if (c < 0x100 && (c < ' ' || c > '~'))
  2307.     tb[j++] = Ctrl('V');    /* special char needs CTRL-V */
  2308. tb[j++] = c;
  2309. tb[j] = NUL;
  2310.     /* insert the last typed char */
  2311. (void)ins_typebuf(tb, TRUE, 0, TRUE);
  2312.     }
  2313.     /* insert the to string */
  2314.     (void)ins_typebuf(mp->m_str, mp->m_noremap ? -1 : 0, 0, TRUE);
  2315.     /* no abbrev. for these chars */
  2316.     no_abbr_cnt += STRLEN(mp->m_str) + j + 1;
  2317.     tb[0] = Ctrl('H');
  2318.     tb[1] = NUL;
  2319.     while (len--)     /* delete the from string */
  2320. (void)ins_typebuf(tb, TRUE, 0, TRUE);
  2321.     return TRUE;
  2322. }
  2323.     }
  2324.     return FALSE;
  2325. }
  2326. /*
  2327.  * Write map commands for the current mappings to an .exrc file.
  2328.  * Return FAIL on error, OK otherwise.
  2329.  */
  2330.     int
  2331. makemap(fd)
  2332.     FILE *fd;
  2333. {
  2334.     struct mapblock *mp;
  2335.     char_u     c1, c2;
  2336.     char_u     *p;
  2337.     char     *cmd;
  2338.     int     abbr;
  2339.     int     hash;
  2340.     int     did_cpo = FALSE;
  2341.     int     i;
  2342.     validate_maphash();
  2343.     /*
  2344.      * Do the loop twice: Once for mappings, once for abbreviations.
  2345.      * Then loop over all map hash lists.
  2346.      */
  2347.     for (abbr = 0; abbr < 2; ++abbr)
  2348. for (hash = 0; hash < 256; ++hash)
  2349. {
  2350.     if (abbr)
  2351.     {
  2352. if (hash)     /* there is only one abbr list */
  2353.     break;
  2354. mp = first_abbr;
  2355.     }
  2356.     else
  2357. mp = maphash[hash];
  2358.     for ( ; mp; mp = mp->m_next)
  2359.     {
  2360. c1 = NUL;
  2361. c2 = NUL;
  2362. if (abbr)
  2363.     cmd = "abbr";
  2364. else
  2365.     cmd = "map";
  2366. switch (mp->m_mode)
  2367. {
  2368.     case NORMAL + VISUAL + OP_PENDING:
  2369. break;
  2370.     case NORMAL:
  2371. c1 = 'n';
  2372. break;
  2373.     case VISUAL:
  2374. c1 = 'v';
  2375. break;
  2376.     case OP_PENDING:
  2377. c1 = 'o';
  2378. break;
  2379.     case NORMAL + VISUAL:
  2380. c1 = 'n';
  2381. c2 = 'v';
  2382. break;
  2383.     case VISUAL + OP_PENDING:
  2384. c1 = 'v';
  2385. c2 = 'o';
  2386. break;
  2387.     case NORMAL + OP_PENDING:
  2388. c1 = 'n';
  2389. c2 = 'o';
  2390. break;
  2391.     case CMDLINE + INSERT:
  2392. if (!abbr)
  2393.     cmd = "map!";
  2394. break;
  2395.     case CMDLINE:
  2396. c1 = 'c';
  2397. break;
  2398.     case INSERT:
  2399. c1 = 'i';
  2400. break;
  2401.     default:
  2402. EMSG("makemap: Illegal mode");
  2403. return FAIL;
  2404. }
  2405. do /* may do this twice if c2 is set */
  2406. {
  2407.     /* When outputting <> form, need to make sure that 'cpo'
  2408.      * is empty. */
  2409.     if (!did_cpo)
  2410.     {
  2411. if (*mp->m_str == NUL) /* will use <Nop> */
  2412.     did_cpo = TRUE;
  2413. else
  2414.     for (i = 0; i < 2; ++i)
  2415. for (p = (i ? mp->m_str : mp->m_keys); *p; ++p)
  2416.     if (*p == K_SPECIAL || *p == NL)
  2417. did_cpo = TRUE;
  2418. if (did_cpo)
  2419. {
  2420.     if (fprintf(fd,
  2421. #ifdef USE_CRNL
  2422. "let cpo_save=&cpornset cpo=rn"
  2423. #else
  2424. "let cpo_save=&cponset cpo=n"
  2425. #endif
  2426.        ) < 0)
  2427. return FAIL;
  2428. }
  2429.     }
  2430.     if (c1 && putc(c1, fd) < 0)
  2431. return FAIL;
  2432.     if (mp->m_noremap && fprintf(fd, "nore") < 0)
  2433. return FAIL;
  2434.     if (fprintf(fd, cmd) < 0)
  2435. return FAIL;
  2436.     if (       putc(' ', fd) < 0
  2437.     || putescstr(fd, mp->m_keys, FALSE) == FAIL
  2438.     || putc(' ', fd) < 0
  2439.     || putescstr(fd, mp->m_str, FALSE) == FAIL
  2440. #ifdef USE_CRNL
  2441.     || putc('r', fd) < 0
  2442. #endif
  2443.     || putc('n', fd) < 0)
  2444. return FAIL;
  2445.     c1 = c2;
  2446.     c2 = NUL;
  2447. }
  2448. while (c1);
  2449.     }
  2450. }
  2451.     if (did_cpo)
  2452. if (fprintf(fd,
  2453. #ifdef USE_CRNL
  2454.     "let &cpo=cpo_savernunlet cpo_savern"
  2455. #else
  2456.     "let &cpo=cpo_savenunlet cpo_saven"
  2457. #endif
  2458.     ) < 0)
  2459.     return FAIL;
  2460.     return OK;
  2461. }
  2462. /*
  2463.  * write escape string to file
  2464.  *
  2465.  * return FAIL for failure, OK otherwise
  2466.  */
  2467.     int
  2468. putescstr(fd, str, set)
  2469.     FILE *fd;
  2470.     char_u *str;
  2471.     int set;     /* TRUE for makeset, FALSE for makemap */
  2472. {
  2473.     int     c;
  2474.     int     modifiers;
  2475.     /* :map xx <Nop> */
  2476.     if (*str == NUL && !set)
  2477.     {
  2478. fprintf(fd, "<Nop>");
  2479. return OK;
  2480.     }
  2481.     for ( ; *str; ++str)
  2482.     {
  2483. c = *str;
  2484. /*
  2485.  * Special key codes have to be translated to be able to make sense
  2486.  * when they are read back.
  2487.  */
  2488. if (c == K_SPECIAL && !set)
  2489. {
  2490.     modifiers = 0x0;
  2491.     if (str[1] == KS_MODIFIER)
  2492.     {
  2493. modifiers = str[2];
  2494. str += 3;
  2495. c = *str;
  2496.     }
  2497.     if (c == K_SPECIAL)
  2498.     {
  2499. c = TO_SPECIAL(str[1], str[2]);
  2500. str += 2;
  2501.     }
  2502.     if (IS_SPECIAL(c) || modifiers) /* special key */
  2503.     {
  2504. fprintf(fd, (char *)get_special_key_name(c, modifiers));
  2505. continue;
  2506.     }
  2507. }
  2508. /*
  2509.  * A 'n' in a map command should be written as <NL>.
  2510.  * A 'n' in a set command should be written as ^V^J.
  2511.  */
  2512. if (c == NL)
  2513. {
  2514.     if (set)
  2515. fprintf(fd, "\26n");
  2516.     else
  2517. fprintf(fd, "<NL>");
  2518.     continue;
  2519. }
  2520. /*
  2521.  * some characters have to be escaped with CTRL-V to
  2522.  * prevent them from misinterpreted in DoOneCmd().
  2523.  * A space, Tab and '"' has to be escaped with a backslash to
  2524.  * prevent it to be misinterpreted in do_set().
  2525.  * A '<' has to be escaped with a CTRL-V to prevent it being
  2526.  * interpreted as the start of a special key name.
  2527.  */
  2528. if (set && (vim_iswhite(c) || c == '"' || c == '\'))
  2529. {
  2530.     if (putc('\', fd) < 0)
  2531. return FAIL;
  2532. }
  2533. else if (c < ' ' || c > '~' || c == '|' || (!set && c == '<'))
  2534. {
  2535.     if (putc(Ctrl('V'), fd) < 0)
  2536. return FAIL;
  2537. }
  2538. if (putc(c, fd) < 0)
  2539.     return FAIL;
  2540.     }
  2541.     return OK;
  2542. }
  2543. /*
  2544.  * Check all mappings for the presence of special key codes.
  2545.  * Used after ":set term=xxx".
  2546.  */
  2547.     void
  2548. check_map_keycodes()
  2549. {
  2550.     struct mapblock *mp;
  2551.     char_u     *p;
  2552.     int     i;
  2553.     char_u     buf[3];
  2554.     char_u     *save_name;
  2555.     int     abbr;
  2556.     int     hash;
  2557.     validate_maphash();
  2558.     save_name = sourcing_name;
  2559.     sourcing_name = (char_u *)"mappings";/* don't give error messages */
  2560.     /*
  2561.      * Do the loop twice: Once for mappings, once for abbreviations.
  2562.      * Then loop over all map hash lists.
  2563.      */
  2564.     for (abbr = 0; abbr < 2; ++abbr)
  2565. for (hash = 0; hash < 256; ++hash)
  2566. {
  2567.     if (abbr)
  2568.     {
  2569. if (hash)     /* there is only one abbr list */
  2570.     break;
  2571. mp = first_abbr;
  2572.     }
  2573.     else
  2574. mp = maphash[hash];
  2575.     for ( ; mp != NULL; mp = mp->m_next)
  2576.     {
  2577. for (i = 0; i <= 1; ++i) /* do this twice */
  2578. {
  2579.     if (i == 0)
  2580. p = mp->m_keys; /* once for the "from" part */
  2581.     else
  2582. p = mp->m_str; /* and once for the "to" part */
  2583.     while (*p)
  2584.     {
  2585. if (*p == K_SPECIAL)
  2586. {
  2587.     ++p;
  2588.     if (*p < 128)   /* for "normal" termcap entries */
  2589.     {
  2590. buf[0] = p[0];
  2591. buf[1] = p[1];
  2592. buf[2] = NUL;
  2593. (void)add_termcap_entry(buf, FALSE);
  2594.     }
  2595.     ++p;
  2596. }
  2597. ++p;
  2598.     }
  2599. }
  2600.     }
  2601. }
  2602.     sourcing_name = save_name;
  2603. }