diff options
Diffstat (limited to 'src/nvim/keymap.c')
| -rw-r--r-- | src/nvim/keymap.c | 47 | 
1 files changed, 21 insertions, 26 deletions
diff --git a/src/nvim/keymap.c b/src/nvim/keymap.c index 07975545be..11abe25255 100644 --- a/src/nvim/keymap.c +++ b/src/nvim/keymap.c @@ -568,25 +568,21 @@ char_u *get_special_key_name(int c, int modifiers)  /// @param[in]  src_len  Length of the srcp.  /// @param[out]  dst  Location where translation result will be kept. It must  //                    be at least 19 bytes per "<x>" form. -/// @param[in]  keycode  Prefer key code, e.g. K_DEL in place of DEL. -/// @param[in]  in_string  Inside a double quoted string -/// @param[in]  simplify  simplify <C-H>, etc. +/// @param[in]  flags  FSK_ values  /// @param[out]  did_simplify  found <C-H>, etc.  ///  /// @return Number of characters added to dst, zero for no match.  unsigned int trans_special(const char_u **const srcp, const size_t src_len, char_u *const dst, -                           const bool keycode, const bool in_string, const bool simplify, -                           bool *const did_simplify) +                           const int flags, bool *const did_simplify)    FUNC_ATTR_NONNULL_ARG(1, 3) FUNC_ATTR_WARN_UNUSED_RESULT  {    int modifiers = 0; -  int key = find_special_key(srcp, src_len, &modifiers, keycode, false, in_string, simplify, -                             did_simplify); +  int key = find_special_key(srcp, src_len, &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);  }  /// Put the character sequence for "key" with "modifiers" into "dst" and return @@ -625,16 +621,12 @@ unsigned int special_to_buf(int key, int modifiers, bool keycode, char_u *dst)  /// @param[in,out]  srcp  Translated <> name. Is advanced to after the <> name.  /// @param[in]  src_len  srcp length.  /// @param[out]  modp  Location where information about modifiers is saved. -/// @param[in]  keycode  Prefer key code, e.g. K_DEL in place of DEL. -/// @param[in]  keep_x_key  Don’t translate xHome to Home key. -/// @param[in]  in_string  In string, double quote is escaped -/// @param[in]  simplify  simplify <C-H>, etc. -/// @param[out]  did_simplify  found <C-H>, etc. +/// @param[in]  flags  FSK_ values +/// @param[out]  did_simplify  FSK_SIMPLIFY and found <C-H>, etc.  ///  /// @return Key and modifiers or 0 if there is no match.  int find_special_key(const char_u **const srcp, const size_t src_len, int *const modp, -                     const bool keycode, const bool keep_x_key, const bool in_string, -                     const bool simplify, bool *const did_simplify) +                     const int flags, bool *const did_simplify)    FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ARG(1, 3)  {    const char_u *last_dash; @@ -642,9 +634,11 @@ int find_special_key(const char_u **const srcp, const size_t src_len, int *const    const char_u *src;    const char_u *bp;    const char_u *const end = *srcp + src_len - 1; +  const bool in_string = flags & FSK_IN_STRING;    int modifiers;    int bit;    int key; +  const int endchar = (flags & FSK_CURLY) ? '}' : '>';    uvarnumber_T n;    int l; @@ -653,7 +647,7 @@ int find_special_key(const char_u **const srcp, const size_t src_len, int *const    }    src = *srcp; -  if (src[0] != '<') { +  if (src[0] != ((flags & FSK_CURLY) ? '{' : '<')) {      return 0;    } @@ -667,16 +661,16 @@ int find_special_key(const char_u **const srcp, const size_t src_len, int *const          // Anything accepted, like <C-?>.          // <C-"> or <M-"> are not special in strings as " is          // the string delimiter. With a backslash it works: <M-\"> -        if (end - bp > l && !(in_string && bp[1] == '"') && bp[l+1] == '>') { +        if (end - bp > l && !(in_string && bp[1] == '"') && bp[l + 1] == endchar) {            bp += l;          } else if (end - bp > 2 && in_string && bp[1] == '\\' -                   && bp[2] == '"' && bp[3] == '>') { +                   && bp[2] == '"' && bp[3] == endchar) {            bp += 2;          }        }      }      if (end - bp > 3 && bp[0] == 't' && bp[1] == '_') { -      bp += 3;  // skip t_xx, xx may be '-' or '>' +      bp += 3;  // skip t_xx, xx may be '-' or '>'/'}'      } else if (end - bp > 4 && STRNICMP(bp, "char-", 5) == 0) {        vim_str2nr(bp + 5, NULL, &l, STR2NR_ALL, NULL, NULL, 0, true);        if (l == 0) { @@ -688,7 +682,7 @@ int find_special_key(const char_u **const srcp, const size_t src_len, int *const      }    } -  if (bp <= end && *bp == '>') {  // found matching '>' +  if (bp <= end && *bp == endchar) {  // found matching '>' or '}'      end_of_name = bp + 1;      // Which modifiers are given? @@ -724,11 +718,11 @@ int find_special_key(const char_u **const srcp, const size_t src_len, int *const          } else {            l = utfc_ptr2len(last_dash + 1);          } -        if (modifiers != 0 && last_dash[l + 1] == '>') { +        if (modifiers != 0 && last_dash[l + 1] == endchar) {            key = utf_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);            }          } @@ -741,7 +735,7 @@ int find_special_key(const char_u **const srcp, const size_t src_len, int *const          // includes the modifier.          key = simplify_key(key, &modifiers); -        if (!keycode) { +        if (!(flags & FSK_KEYCODE)) {            // don't want keycode, use single byte code            if (key == K_BS) {              key = BS; @@ -753,7 +747,7 @@ int find_special_key(const char_u **const srcp, const size_t src_len, int *const          // Normal Key with modifier:          // Try to make a single byte code (except for Alt/Meta modifiers).          if (!IS_SPECIAL(key)) { -          key = extract_modifiers(key, &modifiers, simplify, did_simplify); +          key = extract_modifiers(key, &modifiers, flags & FSK_SIMPLIFY, did_simplify);          }          *modp = modifiers; @@ -945,8 +939,9 @@ char_u *replace_termcodes(const char_u *const from, const size_t from_len, char_          }        } -      slen = trans_special(&src, (size_t)(end - src) + 1, result + dlen, true, false, -                           (flags & REPTERM_NO_SIMPLIFY) == 0, did_simplify); +      slen = trans_special(&src, (size_t)(end - src) + 1, result + dlen, +                           FSK_KEYCODE | ((flags & REPTERM_NO_SIMPLIFY) ? 0 : FSK_SIMPLIFY), +                           did_simplify);        if (slen) {          dlen += slen;          continue;  | 
