summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-01-24 20:21:19 +0100
committerBram Moolenaar <Bram@vim.org>2020-01-24 20:21:19 +0100
commit7f51bbe0d19f1f0cb0321326f45a17b4f5155f89 (patch)
tree45f2a17e61cc8c5407b25da693102ba0b825a104
parent03c3bd9fd094c1aede2e8fe3ad8fd25b9f033053 (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.c75
-rw-r--r--src/proto/term.pro1
-rw-r--r--src/term.c75
-rw-r--r--src/testdir/test_mapping.vim41
-rw-r--r--src/version.c2
5 files changed, 118 insertions, 76 deletions
diff --git a/src/map.c b/src/map.c
index 31c288201d..948b32cc6c 100644
--- a/src/map.c
+++ b/src/map.c
@@ -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,