# HG changeset patch # User Bram Moolenaar # Date 1590868804 -7200 # Node ID c2570baa2e4cfdd15c7e12a4c2cfb6df91c52513 # Parent 67dccb63d65ce017577ece586b4b76ec1d009eac patch 8.2.0855: GUI tests fail because the test doesn't use a modifier Commit: https://github.com/vim/vim/commit/ebe9d34aa07037cff2188a8dd424ee1f59cbb0bf Author: Bram Moolenaar Date: Sat May 30 21:52:54 2020 +0200 patch 8.2.0855: GUI tests fail because the test doesn't use a modifier Problem: GUI tests fail because the test doesn't use a modifier. Solution: Add "\{xxx}" to be able to encode a modifier. diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1353,6 +1353,9 @@ A string constant accepts these special To use the double quote character it must be escaped: "". Don't use to get a utf-8 character, use \uxxxx as mentioned above. +\{xxx} like \ but prepends a modifier instead of including it in the + character. E.g. "\" is one character 0x17 while "\{C-w}" is four + bytes: 3 for the CTRL modifier and then character "W". Note that "\xff" is stored as the byte 255, which may be invalid in some encodings. Use "\u00ff" to store character 255 according to the current value diff --git a/src/gui_mac.c b/src/gui_mac.c --- a/src/gui_mac.c +++ b/src/gui_mac.c @@ -4755,8 +4755,7 @@ gui_mch_add_menu_item(vimmenu_T *menu, i char_u *p_actext; p_actext = menu->actext; - key = find_special_key(&p_actext, &modifiers, FALSE, FALSE, FALSE, - TRUE, NULL); + key = find_special_key(&p_actext, &modifiers, FSK_SIMPLIFY, NULL); if (*p_actext != 0) key = 0; // error: trailing text // find_special_key() returns a keycode with as many of the diff --git a/src/highlight.c b/src/highlight.c --- a/src/highlight.c +++ b/src/highlight.c @@ -1412,8 +1412,7 @@ do_highlight( */ for (p = arg, off = 0; off < 100 - 6 && *p; ) { - len = trans_special(&p, buf + off, FALSE, FALSE, - TRUE, NULL); + len = trans_special(&p, buf + off, FSK_SIMPLIFY, NULL); if (len > 0) // recognized special char off += len; else // copy as normal char diff --git a/src/misc2.c b/src/misc2.c --- a/src/misc2.c +++ b/src/misc2.c @@ -2703,20 +2703,17 @@ get_special_key_name(int c, int modifier trans_special( char_u **srcp, char_u *dst, - int keycode, // prefer key code, e.g. K_DEL instead of DEL - int in_string, // TRUE when inside a double quoted string - int simplify, // simplify and - int *did_simplify) // found or + int flags, // FSK_ values + int *did_simplify) // FSK_SIMPLIFY and found or { int modifiers = 0; int key; - key = find_special_key(srcp, &modifiers, keycode, FALSE, in_string, - simplify, did_simplify); + key = find_special_key(srcp, &modifiers, flags, did_simplify); if (key == 0) return 0; - return special_to_buf(key, modifiers, keycode, dst); + return special_to_buf(key, modifiers, flags & FSK_KEYCODE, dst); } /* @@ -2764,24 +2761,23 @@ special_to_buf(int key, int modifiers, i find_special_key( char_u **srcp, int *modp, - int keycode, // prefer key code, e.g. K_DEL instead of DEL - int keep_x_key, // don't translate xHome to Home key - int in_string, // TRUE in string, double quote is escaped - int simplify, // simplify and + int flags, // FSK_ values int *did_simplify) // found or { char_u *last_dash; char_u *end_of_name; char_u *src; char_u *bp; + int in_string = flags & FSK_IN_STRING; int modifiers; int bit; int key; + int endchar = (flags & FSK_CURLY) ? '}' : '>'; uvarnumber_T n; int l; src = *srcp; - if (src[0] != '<') + if (src[0] != ((flags & FSK_CURLY) ? '{' : '<')) return 0; // Find end of modifier list @@ -2800,15 +2796,15 @@ find_special_key( // Anything accepted, like . // or are not special in strings as " is // the string delimiter. With a backslash it works: - if (!(in_string && bp[1] == '"') && bp[l + 1] == '>') + if (!(in_string && bp[1] == '"') && bp[l + 1] == endchar) bp += l; else if (in_string && bp[1] == '\\' && bp[2] == '"' - && bp[3] == '>') + && bp[3] == endchar) bp += 2; } } if (bp[0] == 't' && bp[1] == '_' && bp[2] && bp[3]) - bp += 3; // skip t_xx, xx may be '-' or '>' + bp += 3; // skip t_xx, xx may be '-' or '>'/'}' else if (STRNICMP(bp, "char-", 5) == 0) { vim_str2nr(bp + 5, NULL, &l, STR2NR_ALL, NULL, NULL, 0, TRUE); @@ -2822,7 +2818,7 @@ find_special_key( } } - if (*bp == '>') // found matching '>' + if (*bp == endchar) // found matching '>' or '}' { end_of_name = bp + 1; @@ -2868,12 +2864,12 @@ find_special_key( l = mb_ptr2len(last_dash + off); else l = 1; - if (modifiers != 0 && last_dash[l + off] == '>') + if (modifiers != 0 && last_dash[l + off] == endchar) key = PTR2CHAR(last_dash + off); else { key = get_special_key_code(last_dash + off); - if (!keep_x_key) + if (!(flags & FSK_KEEP_X_KEY)) key = handle_x_keys(key); } } @@ -2890,7 +2886,7 @@ find_special_key( */ key = simplify_key(key, &modifiers); - if (!keycode) + if (!(flags & FSK_KEYCODE)) { // don't want keycode, use single byte code if (key == K_BS) @@ -2902,7 +2898,7 @@ find_special_key( // Normal Key with modifier: Try to make a single byte code. if (!IS_SPECIAL(key)) key = extract_modifiers(key, &modifiers, - simplify, did_simplify); + flags & FSK_SIMPLIFY, did_simplify); *modp = modifiers; *srcp = end_of_name; diff --git a/src/option.c b/src/option.c --- a/src/option.c +++ b/src/option.c @@ -4330,7 +4330,8 @@ find_key_option(char_u *arg_arg, int has { --arg; // put arg at the '<' modifiers = 0; - key = find_special_key(&arg, &modifiers, TRUE, TRUE, FALSE, TRUE, NULL); + key = find_special_key(&arg, &modifiers, + FSK_KEYCODE | FSK_KEEP_X_KEY | FSK_SIMPLIFY, NULL); if (modifiers) // can't handle modifiers here key = 0; } diff --git a/src/proto/misc2.pro b/src/proto/misc2.pro --- a/src/proto/misc2.pro +++ b/src/proto/misc2.pro @@ -68,9 +68,9 @@ void append_ga_line(garray_T *gap); int simplify_key(int key, int *modifiers); int handle_x_keys(int key); char_u *get_special_key_name(int c, int modifiers); -int trans_special(char_u **srcp, char_u *dst, int keycode, int in_string, int simplify, int *did_simplify); +int trans_special(char_u **srcp, char_u *dst, int flags, int *did_simplify); int special_to_buf(int key, int modifiers, int keycode, char_u *dst); -int find_special_key(char_u **srcp, int *modp, int keycode, int keep_x_key, int in_string, int simplify, int *did_simplify); +int find_special_key(char_u **srcp, int *modp, int flags, int *did_simplify); int extract_modifiers(int key, int *modp, int simplify, int *did_simplify); int find_special_key_in_table(int c); int get_special_key_code(char_u *name); diff --git a/src/term.c b/src/term.c --- a/src/term.c +++ b/src/term.c @@ -5488,8 +5488,9 @@ replace_termcodes( } #endif - slen = trans_special(&src, result + dlen, TRUE, FALSE, - (flags & REPTERM_NO_SIMPLIFY) == 0, did_simplify); + slen = trans_special(&src, result + dlen, FSK_KEYCODE + | ((flags & REPTERM_NO_SIMPLIFY) ? 0 : FSK_SIMPLIFY), + did_simplify); if (slen) { dlen += slen; diff --git a/src/testdir/test_backspace_opt.vim b/src/testdir/test_backspace_opt.vim --- a/src/testdir/test_backspace_opt.vim +++ b/src/testdir/test_backspace_opt.vim @@ -86,7 +86,7 @@ func Test_backspace_ctrl_u() set cpo-=< inoremap - exe "normal Avim3\\\" + exe "normal Avim3\{C-U}\\" iunmap exe "normal Avim4\\\\" @@ -96,7 +96,7 @@ func Test_backspace_ctrl_u() exe "normal A vim6\Azwei\u\\\" inoremap - exe "normal A vim7\\\\" + exe "normal A vim7\{C-U}\{C-U}\\" call assert_equal([ \ "1 this shouldn't be deleted", diff --git a/src/testdir/test_mapping.vim b/src/testdir/test_mapping.vim --- a/src/testdir/test_mapping.vim +++ b/src/testdir/test_mapping.vim @@ -76,7 +76,7 @@ func Test_map_ctrl_c_insert() inoremap cnoremap dummy cunmap - call feedkeys("GoTEST2: CTRL-C |\A|\", "xt") + call feedkeys("GoTEST2: CTRL-C |\{C-C}A|\", "xt") call assert_equal('TEST2: CTRL-C |A|', getline('$')) unmap! set nomodified @@ -85,7 +85,7 @@ endfunc func Test_map_ctrl_c_visual() " mapping of ctrl-c in Visual mode vnoremap :$put ='vmap works' - call feedkeys("GV\\", "xt") + call feedkeys("GV\{C-C}\", "xt") call assert_equal('vmap works', getline('$')) vunmap set nomodified @@ -235,7 +235,7 @@ endfunc func Test_map_meta_quotes() imap foo - call feedkeys("Go-\-\", "xt") + call feedkeys("Go-\{M-\"}-\", "xt") call assert_equal("-foo-", getline('$')) set nomodified iunmap diff --git a/src/testdir/test_messages.vim b/src/testdir/test_messages.vim --- a/src/testdir/test_messages.vim +++ b/src/testdir/test_messages.vim @@ -309,7 +309,7 @@ endfunc func Test_mapping_at_hit_return_prompt() nnoremap :echo "hit ctrl-b" call feedkeys(":ls\", "xt") - call feedkeys("\", "xt") + call feedkeys("\{C-B}", "xt") call assert_match('hit ctrl-b', Screenline(&lines - 1)) nunmap endfunc diff --git a/src/typval.c b/src/typval.c --- a/src/typval.c +++ b/src/typval.c @@ -1285,15 +1285,24 @@ get_string_tv(char_u **arg, typval_T *re ++name; break; - // Special key, e.g.: "\" - case '<': extra = trans_special(&p, name, TRUE, TRUE, - TRUE, NULL); - if (extra != 0) + // Special key, e.g.: "\" or "\{C-W}" + case '<': + case '{': { - name += extra; - if (name >= rettv->vval.v_string + len) - iemsg("get_string_tv() used more space than allocated"); - break; + int flags = FSK_KEYCODE | FSK_IN_STRING; + + if (*p == '<') + flags |= FSK_SIMPLIFY; + else + flags |= FSK_CURLY; + extra = trans_special(&p, name, flags, NULL); + if (extra != 0) + { + name += extra; + if (name >= rettv->vval.v_string + len) + iemsg("get_string_tv() used more space than allocated"); + break; + } } // FALLTHROUGH diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -747,6 +747,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 855, +/**/ 854, /**/ 853, diff --git a/src/vim.h b/src/vim.h --- a/src/vim.h +++ b/src/vim.h @@ -2661,4 +2661,11 @@ long elapsed(DWORD start_tick); #define EVAL_EVALUATE 1 // when missing don't actually evaluate #define EVAL_CONSTANT 2 // when not a constant return FAIL +// Flags for find_special_key() +#define FSK_KEYCODE 0x01 // prefer key code, e.g. K_DEL instead of DEL +#define FSK_KEEP_X_KEY 0x02 // don't translate xHome to Home key +#define FSK_IN_STRING 0x04 // TRUE in string, double quote is escaped +#define FSK_SIMPLIFY 0x08 // simplify and +#define FSK_CURLY 0x10 // {C-x} instead of + #endif // VIM__H