changeset 19178:f7081bd2680e v8.2.0148

patch 8.2.0148: mapping related function in wrong source file Commit: https://github.com/vim/vim/commit/7f51bbe0d19f1f0cb0321326f45a17b4f5155f89 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Jan 24 20:21:19 2020 +0100 patch 8.2.0148: mapping related function in wrong source file Problem: Mapping related function in wrong source file. Solution: Move the function. Add a few more test cases. (Yegappan Lakshmanan, closes #5528)
author Bram Moolenaar <Bram@vim.org>
date Fri, 24 Jan 2020 20:30:04 +0100
parents 0d7b7b121ca6
children 539bca3da740
files src/map.c src/proto/term.pro src/term.c src/testdir/test_mapping.vim src/version.c
diffstat 5 files changed, 118 insertions(+), 76 deletions(-) [+]
line wrap: on
line diff
--- 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.
  */
--- a/src/proto/term.pro
+++ b/src/proto/term.pro
@@ -72,7 +72,6 @@ void term_get_bg_color(char_u *r, char_u
 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);
--- 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];
--- 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
--- 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,