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 | |
parent | 03c3bd9fd094c1aede2e8fe3ad8fd25b9f033053 (diff) |
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)
-rw-r--r-- | src/map.c | 75 | ||||
-rw-r--r-- | src/proto/term.pro | 1 | ||||
-rw-r--r-- | src/term.c | 75 | ||||
-rw-r--r-- | src/testdir/test_mapping.vim | 41 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 118 insertions, 76 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. */ diff --git a/src/proto/term.pro b/src/proto/term.pro index 8f1d33c4e6..4b9ee9ca24 100644 --- a/src/proto/term.pro +++ b/src/proto/term.pro @@ -72,7 +72,6 @@ void term_get_bg_color(char_u *r, char_u *g, char_u *b); char_u *replace_termcodes(char_u *from, char_u **bufp, int flags, int *did_simplify); void show_termcodes(void); int show_one_termcode(char_u *name, char_u *code, int printit); -char_u *translate_mapping(char_u *str); void update_tcap(int attr); void swap_tcap(void); guicolor_T gui_get_color_cmn(char_u *name); diff --git a/src/term.c b/src/term.c index 389b06f375..c74c5ba5b8 100644 --- a/src/term.c +++ b/src/term.c @@ -5936,81 +5936,6 @@ check_for_codes_from_term(void) } #endif -/* - * 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. - */ - 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); -} - #if (defined(MSWIN) && (!defined(FEAT_GUI) || defined(VIMDLL))) || defined(PROTO) static char ksme_str[20]; static char ksmr_str[20]; diff --git a/src/testdir/test_mapping.vim b/src/testdir/test_mapping.vim index 92ffc53eb7..7aeb23c14d 100644 --- a/src/testdir/test_mapping.vim +++ b/src/testdir/test_mapping.vim @@ -476,6 +476,15 @@ func Test_list_mappings() call assert_equal(['n ,n <Nop>'], \ execute('nmap ,n')->trim()->split("\n")) + " verbose map + call assert_match("\tLast set from .*/test_mapping.vim line \\d\\+$", + \ execute('verbose map ,n')->trim()->split("\n")[1]) + + " map to CTRL-V + exe "nmap ,k \<C-V>" + call assert_equal(['n ,k <Nop>'], + \ execute('nmap ,k')->trim()->split("\n")) + nmapclear endfunc @@ -812,4 +821,36 @@ func Test_abbr_remove() call assert_equal({}, maparg('foo', 'i', 1, 1)) endfunc +" Trigger an abbreviation using a special key +func Test_abbr_trigger_special() + new + iabbr teh the + call feedkeys("iteh\<F2>\<Esc>", 'xt') + call assert_equal('the<F2>', getline(1)) + iunab teh + close! +endfunc + +" Test for '<' in 'cpoptions' +func Test_map_cpo_special_keycode() + set cpo-=< + imap x<Bslash>k Test + let d = maparg('x<Bslash>k', 'i', 0, 1) + call assert_equal(['x\k', 'Test', 'i'], [d.lhs, d.rhs, d.mode]) + call feedkeys(":imap x\<C-A>\<C-B>\"\<CR>", 'tx') + call assert_equal('"imap x\k', @:) + iunmap x<Bslash>k + set cpo+=< + imap x<Bslash>k Test + let d = maparg('x<Bslash>k', 'i', 0, 1) + call assert_equal(['x<Bslash>k', 'Test', 'i'], [d.lhs, d.rhs, d.mode]) + call feedkeys(":imap x\<C-A>\<C-B>\"\<CR>", 'tx') + call assert_equal('"imap x<Bslash>k', @:) + iunmap x<Bslash>k + set cpo-=< + " Modifying 'cpo' above adds some default mappings, remove them + mapclear + mapclear! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 80c9642b56..6dfc66df80 100644 --- a/src/version.c +++ b/src/version.c @@ -743,6 +743,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 148, +/**/ 147, /**/ 146, |