]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.0855: GUI tests fail because the test doesn't use a modifier v8.2.0855
authorBram Moolenaar <Bram@vim.org>
Sat, 30 May 2020 19:52:54 +0000 (21:52 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 30 May 2020 19:52:54 +0000 (21:52 +0200)
Problem:    GUI tests fail because the test doesn't use a modifier.
Solution:   Add "\{xxx}" to be able to encode a modifier.

13 files changed:
runtime/doc/eval.txt
src/gui_mac.c
src/highlight.c
src/misc2.c
src/option.c
src/proto/misc2.pro
src/term.c
src/testdir/test_backspace_opt.vim
src/testdir/test_mapping.vim
src/testdir/test_messages.vim
src/typval.c
src/version.c
src/vim.h

index 0585ce020f3a12a44e1cb6056dfaeb214c5c0b70..11cc772b2fd620d776f6cc86549cfe02d7b62d2e 100644 (file)
@@ -1353,6 +1353,9 @@ A string constant accepts these special characters:
        To use the double quote character it must be escaped: "<M-\">".
        Don't use <Char-xxxx> to get a utf-8 character, use \uxxxx as
        mentioned above.
+\{xxx} like \<xxx> but prepends a modifier instead of including it in the
+       character.  E.g. "\<C-w>" 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
index b0483754424670a74d230b4e26a5f1d7cf90320a..1ca2d56352c3f2738ee0f8c950692e48112cb7c2 100644 (file)
@@ -4755,8 +4755,7 @@ gui_mch_add_menu_item(vimmenu_T *menu, int idx)
        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
index 7a7e537f382095a73b40e62558b11523245ae573..9da87f21528385534d834ecf2b3abb353fedafe8 100644 (file)
@@ -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
index 678b73c009dcb02ff2b4e2951c631b5bd12a9608..61c997d824595be22f83925ee54cbfd0d0d3ec40 100644 (file)
@@ -2703,20 +2703,17 @@ get_special_key_name(int c, int modifiers)
 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 <C-H> and <A-x>
-    int                *did_simplify)  // found <C-H> or <A-x>
+    int                flags,          // FSK_ values
+    int                *did_simplify)  // FSK_SIMPLIFY and found <C-H> or <A-x>
 {
     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, int keycode, char_u *dst)
 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 <C-H> and <A-x>
+    int                flags,          // FSK_ values
     int                *did_simplify)  // found <C-H> or <A-x>
 {
     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 <C-?>.
                // <C-"> or <M-"> are not special in strings as " is
                // the string delimiter. With a backslash it works: <M-\">
-               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;
index 8574f7f7cb47aa991a6bb54de201e5b1cdd918a0..45a62310a33dce586d0f74136587fa56ea752573 100644 (file)
@@ -4330,7 +4330,8 @@ find_key_option(char_u *arg_arg, int has_lt)
     {
        --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;
     }
index 592c7d19fd445dd151499c2442585f276712c82b..44f22f266948689acf399739dd000455cdbc4b66 100644 (file)
@@ -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);
index 7c92f3e75def418f9c087d5745f3b5d8d1ba78f6..f93fde84bc5bea2d5d052cbfc481cff6d00fa064 100644 (file)
@@ -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;
index ad051cca4565f5c57eea42c117d185c59a7ce65f..503643a74bb53db72ae72adc3e397355ebef97bf 100644 (file)
@@ -86,7 +86,7 @@ func Test_backspace_ctrl_u()
 
   set cpo-=<
   inoremap <c-u> <left><c-u>
-  exe "normal Avim3\<C-U>\<Esc>\<CR>"
+  exe "normal Avim3\{C-U}\<Esc>\<CR>"
   iunmap <c-u>
   exe "normal Avim4\<C-U>\<C-U>\<Esc>\<CR>"
 
@@ -96,7 +96,7 @@ func Test_backspace_ctrl_u()
   exe "normal A vim6\<Esc>Azwei\<C-G>u\<C-U>\<Esc>\<CR>"
 
   inoremap <c-u> <left><c-u>
-  exe "normal A vim7\<C-U>\<C-U>\<Esc>\<CR>"
+  exe "normal A vim7\{C-U}\{C-U}\<Esc>\<CR>"
 
   call assert_equal([
         \ "1 this shouldn't be deleted",
index f6e712406c76adb9baa3cae58e532f3f8f3bcd1c..7eb6e34a2b45dc442c653456ab4b2c68b19dc143 100644 (file)
@@ -76,7 +76,7 @@ func Test_map_ctrl_c_insert()
   inoremap <c-c> <ctrl-c>
   cnoremap <c-c> dummy
   cunmap <c-c>
-  call feedkeys("GoTEST2: CTRL-C |\<C-C>A|\<Esc>", "xt")
+  call feedkeys("GoTEST2: CTRL-C |\{C-C}A|\<Esc>", "xt")
   call assert_equal('TEST2: CTRL-C |<ctrl-c>A|', getline('$'))
   unmap! <c-c>
   set nomodified
@@ -85,7 +85,7 @@ endfunc
 func Test_map_ctrl_c_visual()
   " mapping of ctrl-c in Visual mode
   vnoremap <c-c> :<C-u>$put ='vmap works'
-  call feedkeys("GV\<C-C>\<CR>", "xt")
+  call feedkeys("GV\{C-C}\<CR>", "xt")
   call assert_equal('vmap works', getline('$'))
   vunmap <c-c>
   set nomodified
@@ -235,7 +235,7 @@ endfunc
 
 func Test_map_meta_quotes()
   imap <M-"> foo
-  call feedkeys("Go-\<M-\">-\<Esc>", "xt")
+  call feedkeys("Go-\{M-\"}-\<Esc>", "xt")
   call assert_equal("-foo-", getline('$'))
   set nomodified
   iunmap <M-">
index b74ad2cb5034ab9f1aca9472acdcac503d07db85..832762a5c8f05a64c6bcfa95e02ea3bb24474d73 100644 (file)
@@ -309,7 +309,7 @@ endfunc
 func Test_mapping_at_hit_return_prompt()
   nnoremap <C-B> :echo "hit ctrl-b"<CR>
   call feedkeys(":ls\<CR>", "xt")
-  call feedkeys("\<C-B>", "xt")
+  call feedkeys("\{C-B}", "xt")
   call assert_match('hit ctrl-b', Screenline(&lines - 1))
   nunmap <C-B>
 endfunc
index cd2a862695474f2f464736542d1880bcfa67671b..95b27929b631d2ecd063e7c5441bac96874a4399 100644 (file)
@@ -1285,15 +1285,24 @@ get_string_tv(char_u **arg, typval_T *rettv, int evaluate)
                          ++name;
                          break;
 
-                           // Special key, e.g.: "\<C-W>"
-               case '<': extra = trans_special(&p, name, TRUE, TRUE,
-                                                                  TRUE, NULL);
-                         if (extra != 0)
+                         // Special key, e.g.: "\<C-W>" 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
 
index 6fe96a37457a139a6b25171dff719a6d7463f0d0..b3aa84027242c88489a7f46c027aff9a394a931b 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    855,
 /**/
     854,
 /**/
index 68cf943f97149d6b6abb89cfec6f91c1c3b04c98..4fc982ab6688b43a8a1c7306b4e7eb764dbd0dbb 100644 (file)
--- 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 <C-H> and <A-x>
+#define FSK_CURLY      0x10    // {C-x} instead of <C-x>
+
 #endif // VIM__H