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