diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-01-24 20:21:19 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-01-24 20:21:19 +0100 |
commit | 7f51bbe0d19f1f0cb0321326f45a17b4f5155f89 (patch) | |
tree | 45f2a17e61cc8c5407b25da693102ba0b825a104 /src/map.c | |
parent | 03c3bd9fd094c1aede2e8fe3ad8fd25b9f033053 (diff) | |
download | vim-git-7f51bbe0d19f1f0cb0321326f45a17b4f5155f89.tar.gz |
patch 8.2.0148: mapping related function in wrong source filev8.2.0148
Problem: Mapping related function in wrong source file.
Solution: Move the function. Add a few more test cases. (Yegappan
Lakshmanan, closes #5528)
Diffstat (limited to 'src/map.c')
-rw-r--r-- | src/map.c | 75 |
1 files changed, 75 insertions, 0 deletions
@@ -1057,6 +1057,81 @@ static int expand_isabbrev = 0; static int expand_buffer = FALSE; /* + * Translate an internal mapping/abbreviation representation into the + * corresponding external one recognized by :map/:abbrev commands. + * Respects the current B/k/< settings of 'cpoption'. + * + * This function is called when expanding mappings/abbreviations on the + * command-line. + * + * It uses a growarray to build the translation string since the latter can be + * wider than the original description. The caller has to free the string + * afterwards. + * + * Returns NULL when there is a problem. + */ + static char_u * +translate_mapping(char_u *str) +{ + garray_T ga; + int c; + int modifiers; + int cpo_bslash; + int cpo_special; + + ga_init(&ga); + ga.ga_itemsize = 1; + ga.ga_growsize = 40; + + cpo_bslash = (vim_strchr(p_cpo, CPO_BSLASH) != NULL); + cpo_special = (vim_strchr(p_cpo, CPO_SPECI) != NULL); + + for (; *str; ++str) + { + c = *str; + if (c == K_SPECIAL && str[1] != NUL && str[2] != NUL) + { + modifiers = 0; + if (str[1] == KS_MODIFIER) + { + str++; + modifiers = *++str; + c = *++str; + } + if (c == K_SPECIAL && str[1] != NUL && str[2] != NUL) + { + if (cpo_special) + { + ga_clear(&ga); + return NULL; + } + c = TO_SPECIAL(str[1], str[2]); + if (c == K_ZERO) // display <Nul> as ^@ + c = NUL; + str += 2; + } + if (IS_SPECIAL(c) || modifiers) // special key + { + if (cpo_special) + { + ga_clear(&ga); + return NULL; + } + ga_concat(&ga, get_special_key_name(c, modifiers)); + continue; // for (str) + } + } + if (c == ' ' || c == '\t' || c == Ctrl_J || c == Ctrl_V + || (c == '<' && !cpo_special) || (c == '\\' && !cpo_bslash)) + ga_append(&ga, cpo_bslash ? Ctrl_V : '\\'); + if (c) + ga_append(&ga, c); + } + ga_append(&ga, NUL); + return (char_u *)(ga.ga_data); +} + +/* * Work out what to complete when doing command line completion of mapping * or abbreviation names. */ |